From dfe6443e2d5b119679f7c9276e5a4395f9f6527a Mon Sep 17 00:00:00 2001 From: Trevor Guidry Date: Wed, 9 Jan 2019 02:11:33 -0500 Subject: [PATCH 001/185] Add priority to the eventbus --- .../java/net/runelite/client/eventbus/EventBus.java | 13 +++++++++---- .../net/runelite/client/eventbus/Subscribe.java | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java index a28f2f4371..97b28da323 100644 --- a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java +++ b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java @@ -38,6 +38,7 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Comparator; import java.util.function.Consumer; import javax.annotation.Nonnull; import javax.annotation.concurrent.ThreadSafe; @@ -62,6 +63,7 @@ public class EventBus { private final Object object; private final Method method; + private final float priority; @EqualsAndHashCode.Exclude private final SubscriberMethod lamda; @@ -105,6 +107,9 @@ public class EventBus builder.putAll(subscribers); } + builder.orderValuesBy(Comparator.comparing(Subscriber::getPriority) + .thenComparing(s -> s.object.getClass().getName())); + for (Class clazz = object.getClass(); clazz != null; clazz = clazz.getSuperclass()) { for (final Method method : clazz.getDeclaredMethods()) @@ -160,7 +165,7 @@ public class EventBus log.warn("Unable to create lambda for method {}", method, e); } - final Subscriber subscriber = new Subscriber(object, method, lambda); + final Subscriber subscriber = new Subscriber(object, method, sub.priority(), lambda); builder.put(parameterClazz, subscriber); log.debug("Registering {} - {}", parameterClazz, subscriber); } @@ -196,7 +201,7 @@ public class EventBus } final Class parameterClazz = method.getParameterTypes()[0]; - map.remove(parameterClazz, new Subscriber(object, method, null)); + map.remove(parameterClazz, new Subscriber(object, method, sub.priority(), null)); } } @@ -204,8 +209,8 @@ public class EventBus } /** - * Posts provided event to all registered subscribers. Subscriber calls are invoked immediately and in order - * in which subscribers were registered. + * Posts provided event to all registered subscribers. Subscriber calls are invoked immediately, + * ordered by priority then their declaring class' name. * * @param event event to post */ diff --git a/runelite-client/src/main/java/net/runelite/client/eventbus/Subscribe.java b/runelite-client/src/main/java/net/runelite/client/eventbus/Subscribe.java index e34e350be0..d3a7c0514b 100644 --- a/runelite-client/src/main/java/net/runelite/client/eventbus/Subscribe.java +++ b/runelite-client/src/main/java/net/runelite/client/eventbus/Subscribe.java @@ -38,4 +38,5 @@ import java.lang.annotation.Target; @Documented public @interface Subscribe { + float priority() default 0; } From acabab9274598bef2ccc52edd90a09ecb247bef9 Mon Sep 17 00:00:00 2001 From: trimbe Date: Sat, 3 Aug 2019 20:59:03 -0400 Subject: [PATCH 002/185] bank plugin: improve responsiveness of bank searches --- .../client/plugins/bank/BankPlugin.java | 37 ++++++++++++ .../plugins/banktags/tabs/BankSearch.java | 60 ++++++++++--------- 2 files changed, 70 insertions(+), 27 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java index 057e7c20e4..d47b1ee89f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java @@ -26,6 +26,7 @@ */ package net.runelite.client.plugins.bank; +import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.inject.Provides; import java.util.Arrays; @@ -36,12 +37,17 @@ import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.MenuEntry; +import net.runelite.api.SpriteID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarClientStr; import net.runelite.api.Varbits; import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuShouldLeftClick; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.VarClientStrChanged; import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.vars.InputType; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; @@ -96,6 +102,7 @@ public class BankPlugin extends Plugin private ContainerCalculation seedVaultCalculation; private boolean forceRightClickFlag; + private String searchString; @Provides BankConfig getConfig(ConfigManager configManager) @@ -108,6 +115,7 @@ public class BankPlugin extends Plugin { clientThread.invokeLater(() -> bankSearch.reset(false)); forceRightClickFlag = false; + searchString = ""; } @Subscribe @@ -176,6 +184,35 @@ public class BankPlugin extends Plugin updateSeedVaultTotal(); } + @Subscribe + public void onVarClientStrChanged(VarClientStrChanged event) + { + String searchVar = client.getVar(VarClientStr.INPUT_TEXT); + + if (!searchVar.equals(searchString)) + { + Widget searchButtonBackground = client.getWidget(WidgetInfo.BANK_SEARCH_BUTTON_BACKGROUND); + if (searchButtonBackground != null && searchButtonBackground.hasListener()) + { + searchButtonBackground.setOnTimerListener((Object[]) null); + searchButtonBackground.setHasListener(false); + } + + clientThread.invokeLater(() -> bankSearch.layoutBank()); + searchString = searchVar; + } + + if (client.getVar(VarClientInt.INPUT_TYPE) != InputType.SEARCH.getType() && Strings.isNullOrEmpty(client.getVar(VarClientStr.INPUT_TEXT))) + { + Widget searchBackground = client.getWidget(WidgetInfo.BANK_SEARCH_BUTTON_BACKGROUND); + if (searchBackground != null) + { + searchBackground.setSpriteId(SpriteID.EQUIPMENT_SLOT_TILE); + } + } + + } + @Subscribe public void onItemContainerChanged(ItemContainerChanged event) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java index 73bfbc99a4..8d15c55a55 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java @@ -68,19 +68,6 @@ public class BankSearch { clientThread.invoke(() -> { - Widget bankContainer = client.getWidget(WidgetInfo.BANK_CONTAINER); - if (bankContainer == null || bankContainer.isHidden()) - { - return; - } - - Object[] widgetIds = bankContainer.getOnLoadListener(); - - // In case the widget ids array is incorrect, do not proceed - if (widgetIds == null || widgetIds.length < 21) - { - return; - } // This ensures that any chatbox input (e.g from search) will not remain visible when // selecting/changing tab if (closeInput) @@ -91,23 +78,42 @@ public class BankSearch client.setVar(VarClientInt.INPUT_TYPE, inputType.getType()); client.setVar(VarClientStr.INPUT_TEXT, search); - client.runScript(ScriptID.BANK_LAYOUT, - WidgetInfo.BANK_CONTAINER.getId(), - widgetIds[INNER_CONTAINER_IDX], - widgetIds[SETTINGS_IDX], - widgetIds[ITEM_CONTAINER_IDX], - widgetIds[SCROLLBAR_IDX], - widgetIds[BOTTOM_BAR_IDX], - widgetIds[TITLE_BAR_IDX], - widgetIds[ITEM_COUNT_IDX], - widgetIds[SEARCH_BUTTON_BACKGROUND_IDX], - widgetIds[TAB_BAR_IDX], - widgetIds[INCINERATOR_IDX], - widgetIds[INCINERATOR_CONFIRM_IDX], - widgetIds[HIDDEN_WIDGET_IDX]); + layoutBank(); }); } + public void layoutBank() + { + Widget bankContainer = client.getWidget(WidgetInfo.BANK_CONTAINER); + if (bankContainer == null || bankContainer.isHidden()) + { + return; + } + + Object[] widgetIds = bankContainer.getOnLoadListener(); + + // In case the widget ids array is incorrect, do not proceed + if (widgetIds == null || widgetIds.length < 21) + { + return; + } + + client.runScript(ScriptID.BANK_LAYOUT, + WidgetInfo.BANK_CONTAINER.getId(), + widgetIds[INNER_CONTAINER_IDX], + widgetIds[SETTINGS_IDX], + widgetIds[ITEM_CONTAINER_IDX], + widgetIds[SCROLLBAR_IDX], + widgetIds[BOTTOM_BAR_IDX], + widgetIds[TITLE_BAR_IDX], + widgetIds[ITEM_COUNT_IDX], + widgetIds[SEARCH_BUTTON_BACKGROUND_IDX], + widgetIds[TAB_BAR_IDX], + widgetIds[INCINERATOR_IDX], + widgetIds[INCINERATOR_CONFIRM_IDX], + widgetIds[HIDDEN_WIDGET_IDX]); + } + public void reset(Boolean closeChat) { search(InputType.NONE, "", closeChat); From c879a38f637ef55344977a72767541befc514704 Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Wed, 11 Sep 2019 20:53:29 -0600 Subject: [PATCH 003/185] tzhaartimersplugin fixes no longer requires eventbus --- .../plugins/tzhaartimers/TzhaarTimersPlugin | 291 ++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin new file mode 100644 index 0000000000..51e9c462e5 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2019, winterdaze + * 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.tzhaartimers; + +import lombok.Getter; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.util.Text; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.ItemManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.eventbus.EventBus; + +import javax.inject.Inject; +import java.time.Duration; +import java.time.Instant; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static net.runelite.api.ItemID.FIRE_CAPE; +import static net.runelite.api.ItemID.INFERNAL_CAPE; + +@PluginDescriptor( + name = "Tzhaar Timers", + description = "Display elapsed time in the Fight Caves and Inferno", + tags = {"inferno", "fight", "caves", "cape", "timer", "tzhaar"} +) +public class TzhaarTimersPlugin extends Plugin +{ + private static final Pattern WAVE_MESSAGE = Pattern.compile("Wave: (\\d+)"); + private static final String DEFEATED_MESSAGE = "You have been defeated!"; + private static final Pattern COMPLETE_MESSAGE = Pattern.compile("Your (TzTok-Jad|TzKal-Zuk) kill count is:"); + private static final Pattern PAUSED_MESSAGE = Pattern.compile("The (Inferno|Fight Cave) has been paused. You may now log out."); + private static final String CONFIG_GROUP = "tzhaartimers"; + private static final String CONFIG_TIME = "time"; + private static final String CONFIG_STARTED = "started"; + private static final String CONFIG_LASTTIME = "lasttime"; + + @Inject + private InfoBoxManager infoBoxManager; + + @Inject + private Client client; + + @Inject + private ItemManager itemManager; + + @Inject + private ConfigManager configManager; + + @Inject + private EventBus eventBus; + + @Getter + private TzhaarTimers timer; + + private Instant startTime; + private Instant lastTime; + private Boolean started = false; + private boolean loggingIn; + + @Override + public void startUp() + { + addSubscriptions(); + } + + public void onGameStateChanged(GameStateChanged event) + { + switch (event.getGameState()) + { + case LOGGED_IN: + if (loggingIn) + { + loggingIn = false; + loadConfig(); + resetConfig(); + } + break; + case LOGGING_IN: + loggingIn = true; + break; + case LOADING: + if (!loggingIn) + { + updateInfoBoxState(); + } + break; + case HOPPING: + loggingIn = true; + case LOGIN_SCREEN: + removeTimer(); + saveConfig(); + break; + default: + break; + } + } + + public void onChatMessage(ChatMessage event) + { + if (event.getType() != ChatMessageType.GAMEMESSAGE && event.getType() != ChatMessageType.SPAM) + { + return; + } + + String message = Text.removeTags(event.getMessage()); + Matcher matcher = COMPLETE_MESSAGE.matcher(message); + + if (message.contains(DEFEATED_MESSAGE) || matcher.matches()) + { + removeTimer(); + resetConfig(); + resetVars(); + return; + } + + Instant now = Instant.now(); + matcher = PAUSED_MESSAGE.matcher(message); + if (matcher.matches()) + { + lastTime = now; + createTimer(startTime, now); + return; + } + + matcher = WAVE_MESSAGE.matcher(message); + if (!matcher.matches()) + { + return; + } + + if (!started) + { + int wave = Integer.parseInt(matcher.group(1)); + if (wave != 1) + { + return; + } + + started = true; + startTime = now; + } + else if (lastTime != null) + { + startTime = startTime.plus(Duration.between(startTime, now)).minus(Duration.between(startTime, lastTime)); + lastTime = null; + } + + createTimer(startTime, lastTime); + } + + private void updateInfoBoxState() + { + if (timer == null) + { + return; + } + + if (!checkInFightCaves() && !checkInInferno()) + { + removeTimer(); + resetConfig(); + resetVars(); + } + } + + private boolean checkInFightCaves() + { + return client.getMapRegions() != null && Arrays.stream(client.getMapRegions()) + .filter(x -> x == 9551) + .toArray().length > 0; + } + + private boolean checkInInferno() + { + return client.getMapRegions() != null && Arrays.stream(client.getMapRegions()) + .filter(x -> x == 9043) + .toArray().length > 0; + } + + private void resetVars() + { + startTime = null; + lastTime = null; + started = false; + } + + private void removeTimer() + { + infoBoxManager.removeInfoBox(timer); + timer = null; + } + + private void createTimer(Instant startTime, Instant lastTime) + { + if (timer != null) + { + infoBoxManager.removeInfoBox(timer); + } + + if (checkInFightCaves()) + { + timer = new TzhaarTimers(itemManager.getImage(FIRE_CAPE), this, startTime, lastTime); + infoBoxManager.addInfoBox(timer); + } + else if (checkInInferno()) + { + timer = new TzhaarTimers(itemManager.getImage(INFERNAL_CAPE), this, startTime, lastTime); + infoBoxManager.addInfoBox(timer); + } + } + + @Override + protected void shutDown() throws Exception + { + eventBus.unregister(this); + removeTimer(); + resetConfig(); + resetVars(); + } + + private void addSubscriptions() + { + eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); + eventBus.subscribe(ChatMessage.class, this, this::onChatMessage); + } + + private void loadConfig() + { + startTime = configManager.getConfiguration(CONFIG_GROUP, CONFIG_TIME, Instant.class); + started = configManager.getConfiguration(CONFIG_GROUP, CONFIG_STARTED, Boolean.class); + lastTime = configManager.getConfiguration(CONFIG_GROUP, CONFIG_LASTTIME, Instant.class); + if (started == null) + { + started = false; + } + } + + private void resetConfig() + { + configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_TIME); + configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_STARTED); + configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_LASTTIME); + } + + private void saveConfig() + { + if (startTime == null) + { + return; + } + + if (lastTime == null) + { + lastTime = Instant.now(); + } + + configManager.setConfiguration(CONFIG_GROUP, CONFIG_TIME, startTime); + configManager.setConfiguration(CONFIG_GROUP, CONFIG_STARTED, started); + configManager.setConfiguration(CONFIG_GROUP, CONFIG_LASTTIME, lastTime); + resetVars(); + } +} From 41320564fc039d7049b1473a7edbdfc872dd7a1a Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Wed, 11 Sep 2019 20:54:08 -0600 Subject: [PATCH 004/185] tzhaartimers fixes the requirement of modified eventbus --- .../client/plugins/tzhaartimers/TzhaarTimers | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers new file mode 100644 index 0000000000..d0d187b56a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2019, winterdaze + * 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.tzhaartimers; + +import net.runelite.client.ui.overlay.infobox.InfoBox; + +import java.awt.image.BufferedImage; +import java.awt.Color; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +public class TzhaarTimers extends InfoBox +{ + private final Instant startTime; + private LocalTime time; + private Instant lastTime; + + public TzhaarTimers(BufferedImage image, TzhaarTimersPlugin plugin, Instant startTime, Instant lastTime) + { + super(image, plugin); + this.startTime = startTime; + this.lastTime = lastTime; + } + + @Override + public String getText() + { + if (startTime == null) + { + return ""; + } + + if (lastTime == null) + { + Duration elapsed = Duration.between(startTime, Instant.now()); + time = LocalTime.ofSecondOfDay(elapsed.getSeconds()); + } + else + { + Duration elapsed = Duration.between(startTime, lastTime); + time = LocalTime.ofSecondOfDay(elapsed.getSeconds()); + } + + if (time.getHour() > 0) + { + return time.format(DateTimeFormatter.ofPattern("HH:mm")); + } + return time.format(DateTimeFormatter.ofPattern("mm:ss")); + } + + @Override + public Color getTextColor() + { + return Color.WHITE; + } + + @Override + public String getTooltip() + { + StringBuilder builder = new StringBuilder(); + builder.append("Elapsed time: "); + builder.append(time.format(DateTimeFormatter.ofPattern("HH:mm:ss"))); + + return builder.toString(); + } +} From d03576463c676999ad2c1f5c2e025efc3903ea49 Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Wed, 11 Sep 2019 20:57:06 -0600 Subject: [PATCH 005/185] tzhaartimers added.java .java --- .../plugins/tzhaartimers/{TzhaarTimers => TzhaarTimers.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/{TzhaarTimers => TzhaarTimers.java} (100%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers.java similarity index 100% rename from runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers rename to runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers.java From e5134ab6371b5cad2d9563bb4f55af4743176f3a Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Wed, 11 Sep 2019 20:57:37 -0600 Subject: [PATCH 006/185] tzhaartimersplugin.java adds.java --- .../tzhaartimers/{TzhaarTimersPlugin => TzhaarTimersPlugin.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/{TzhaarTimersPlugin => TzhaarTimersPlugin.java} (100%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin.java similarity index 100% rename from runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin rename to runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin.java From a6df8993268aec5e0c89962ed16b75903c7dfc2a Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Thu, 12 Sep 2019 21:39:12 -0600 Subject: [PATCH 007/185] Bosstimetracker:renamed renamed --- .../{TzhaarTimers.java => BossTimeTracker.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/{TzhaarTimers.java => BossTimeTracker.java} (92%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers.java b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTracker.java similarity index 92% rename from runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTracker.java index d0d187b56a..882f415c9f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimers.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTracker.java @@ -22,7 +22,7 @@ * (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.tzhaartimers; +package net.runelite.client.plugins.bosstimetracker; import net.runelite.client.ui.overlay.infobox.InfoBox; @@ -33,13 +33,13 @@ import java.time.Instant; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -public class TzhaarTimers extends InfoBox +public class BossTimeTracker extends InfoBox { private final Instant startTime; private LocalTime time; private Instant lastTime; - public TzhaarTimers(BufferedImage image, TzhaarTimersPlugin plugin, Instant startTime, Instant lastTime) + public BossTimeTracker(BufferedImage image, BossTimeTrackerPlugin plugin, Instant startTime, Instant lastTime) { super(image, plugin); this.startTime = startTime; From 42c6a4341b1581d9b34f2dc3f49449b1f36dc61c Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Thu, 12 Sep 2019 21:40:10 -0600 Subject: [PATCH 008/185] bosstimetrackerplugin:rename renamed --- ...imersPlugin.java => BossTimeTrackerPlugin.java} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/{TzhaarTimersPlugin.java => BossTimeTrackerPlugin.java} (94%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java similarity index 94% rename from runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java index 51e9c462e5..1d49a841e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/TzhaarTimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java @@ -22,7 +22,7 @@ * (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.tzhaartimers; +package net.runelite.client.plugins.bosstimetracker; import lombok.Getter; import net.runelite.api.ChatMessageType; @@ -48,17 +48,17 @@ import static net.runelite.api.ItemID.FIRE_CAPE; import static net.runelite.api.ItemID.INFERNAL_CAPE; @PluginDescriptor( - name = "Tzhaar Timers", + name = "Boss Time Tracker", description = "Display elapsed time in the Fight Caves and Inferno", tags = {"inferno", "fight", "caves", "cape", "timer", "tzhaar"} ) -public class TzhaarTimersPlugin extends Plugin +public class BossTimeTrackerPlugin extends Plugin { private static final Pattern WAVE_MESSAGE = Pattern.compile("Wave: (\\d+)"); private static final String DEFEATED_MESSAGE = "You have been defeated!"; private static final Pattern COMPLETE_MESSAGE = Pattern.compile("Your (TzTok-Jad|TzKal-Zuk) kill count is:"); private static final Pattern PAUSED_MESSAGE = Pattern.compile("The (Inferno|Fight Cave) has been paused. You may now log out."); - private static final String CONFIG_GROUP = "tzhaartimers"; + private static final String CONFIG_GROUP = "Boss Time Tracker"; private static final String CONFIG_TIME = "time"; private static final String CONFIG_STARTED = "started"; private static final String CONFIG_LASTTIME = "lasttime"; @@ -79,7 +79,7 @@ public class TzhaarTimersPlugin extends Plugin private EventBus eventBus; @Getter - private TzhaarTimers timer; + private BossTimeTracker timer; private Instant startTime; private Instant lastTime; @@ -228,12 +228,12 @@ public class TzhaarTimersPlugin extends Plugin if (checkInFightCaves()) { - timer = new TzhaarTimers(itemManager.getImage(FIRE_CAPE), this, startTime, lastTime); + timer = new BossTimeTracker(itemManager.getImage(FIRE_CAPE), this, startTime, lastTime); infoBoxManager.addInfoBox(timer); } else if (checkInInferno()) { - timer = new TzhaarTimers(itemManager.getImage(INFERNAL_CAPE), this, startTime, lastTime); + timer = new BossTimeTracker(itemManager.getImage(INFERNAL_CAPE), this, startTime, lastTime); infoBoxManager.addInfoBox(timer); } } From 6cb3fb01e29a9237acb63005a13f42e86bec8db0 Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Thu, 12 Sep 2019 22:59:24 -0600 Subject: [PATCH 009/185] bosstimetrackerplugin: rl+ified it Added type = PluginType.PVM, enabledByDefault = false --- .../client/plugins/tzhaartimers/BossTimeTrackerPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java index 1d49a841e7..964fc70406 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java @@ -50,7 +50,9 @@ import static net.runelite.api.ItemID.INFERNAL_CAPE; @PluginDescriptor( name = "Boss Time Tracker", description = "Display elapsed time in the Fight Caves and Inferno", - tags = {"inferno", "fight", "caves", "cape", "timer", "tzhaar"} + tags = {"inferno", "fight", "caves", "cape", "timer", "tzhaar"}, + type = PluginType.PVM, + enabledByDefault = false ) public class BossTimeTrackerPlugin extends Plugin { From 6822f2aa2ddce18403502a57edd294df3e845dde Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Thu, 12 Sep 2019 23:24:03 -0600 Subject: [PATCH 010/185] bosstimetrackerplugin:checkstyle ima derp --- .../client/plugins/tzhaartimers/BossTimeTrackerPlugin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java index 964fc70406..02979340d1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tzhaartimers/BossTimeTrackerPlugin.java @@ -34,6 +34,7 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.eventbus.EventBus; @@ -50,7 +51,7 @@ import static net.runelite.api.ItemID.INFERNAL_CAPE; @PluginDescriptor( name = "Boss Time Tracker", description = "Display elapsed time in the Fight Caves and Inferno", - tags = {"inferno", "fight", "caves", "cape", "timer", "tzhaar"}, + tags = {"inferno", "fight", "caves", "cape", "timer", "tzhaar", "pvm"}, type = PluginType.PVM, enabledByDefault = false ) From 2ac1c2e387dd17b9ffed7960c80d076ba7539744 Mon Sep 17 00:00:00 2001 From: Lotto Date: Wed, 16 Oct 2019 19:01:45 +0200 Subject: [PATCH 011/185] fishing: make overlay colors configurable --- .../client/plugins/fishing/FishingConfig.java | 44 ++++++++++++++++--- .../fishing/FishingSpotMinimapOverlay.java | 4 +- .../plugins/fishing/FishingSpotOverlay.java | 10 ++--- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java index 01d7454e4a..5ccee0e752 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.fishing; +import java.awt.Color; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; @@ -76,7 +77,40 @@ public interface FishingConfig extends Config } @ConfigItem( - position = 4, + keyName = "overlayColor", + name = "Overlay Color", + description = "Color of overlays", + position = 4 + ) + default Color getOverlayColor() + { + return Color.CYAN; + } + + @ConfigItem( + keyName = "minnowsOverlayColor", + name = "Minnows Overlay Color", + description = "Color of overlays for Minnows", + position = 5 + ) + default Color getMinnowsOverlayColor() + { + return Color.RED; + } + + @ConfigItem( + keyName = "aerialOverlayColor", + name = "Aerial Overlay Color", + description = "Color of overlays when 1-tick aerial fishing", + position = 6 + ) + default Color getAerialOverlayColor() + { + return Color.GREEN; + } + + @ConfigItem( + position = 7, keyName = "statTimeout", name = "Reset stats (minutes)", description = "The time until fishing session data is reset in minutes." @@ -87,7 +121,7 @@ public interface FishingConfig extends Config } @ConfigItem( - position = 5, + position = 8, keyName = "showFishingStats", name = "Show Fishing session stats", description = "Display the fishing session stats." @@ -98,7 +132,7 @@ public interface FishingConfig extends Config } @ConfigItem( - position = 6, + position = 9, keyName = "showMinnowOverlay", name = "Show Minnow Movement overlay", description = "Display the minnow progress pie overlay." @@ -109,7 +143,7 @@ public interface FishingConfig extends Config } @ConfigItem( - position = 7, + position = 10, keyName = "trawlerNotification", name = "Trawler activity notification", description = "Send a notification when fishing trawler activity drops below 15%." @@ -120,7 +154,7 @@ public interface FishingConfig extends Config } @ConfigItem( - position = 8, + position = 11, keyName = "trawlerTimer", name = "Trawler timer in MM:SS", description = "Trawler Timer will display a more accurate timer in MM:SS format." diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java index 09a6b612fc..aa9e72cdf6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java @@ -76,7 +76,9 @@ class FishingSpotMinimapOverlay extends Overlay continue; } - Color color = npc.getGraphic() == GraphicID.FLYING_FISH ? Color.RED : Color.CYAN; + Color color = npc.getGraphic() == GraphicID.FLYING_FISH + ? config.getMinnowsOverlayColor() + : config.getOverlayColor(); net.runelite.api.Point minimapLocation = npc.getMinimapLocation(); if (minimapLocation != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java index 257955c878..c7200b9201 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java @@ -107,15 +107,15 @@ class FishingSpotOverlay extends Overlay Color color; if (npc.getGraphic() == GraphicID.FLYING_FISH) { - color = Color.RED; + color = config.getMinnowsOverlayColor(); } else if (spot == FishingSpot.COMMON_TENCH && npc.getWorldLocation().distanceTo2D(client.getLocalPlayer().getWorldLocation()) <= ONE_TICK_AERIAL_FISHING) { - color = Color.GREEN; + color = config.getAerialOverlayColor(); } else { - color = Color.CYAN; + color = config.getOverlayColor(); } if (spot == FishingSpot.MINNOW && config.showMinnowOverlay()) @@ -156,12 +156,12 @@ class FishingSpotOverlay extends Overlay if (config.showSpotIcons()) { - BufferedImage fishImage = itemManager.getImage(spot.getFishSpriteId());; + BufferedImage fishImage = itemManager.getImage(spot.getFishSpriteId()); if (spot == FishingSpot.COMMON_TENCH && npc.getWorldLocation().distanceTo2D(client.getLocalPlayer().getWorldLocation()) <= ONE_TICK_AERIAL_FISHING) { - fishImage = ImageUtil.outlineImage(itemManager.getImage(spot.getFishSpriteId()), Color.GREEN); + fishImage = ImageUtil.outlineImage(itemManager.getImage(spot.getFishSpriteId()), color); } if (fishImage != null) From 5388f4f42c6b05f7bf07274fbb42d3904bf62ad2 Mon Sep 17 00:00:00 2001 From: f0rmatme Date: Wed, 16 Oct 2019 16:46:49 -0700 Subject: [PATCH 012/185] bank plugin: improve responsiveness of bank searches --- .../client/plugins/bank/BankPlugin.java | 2 +- .../plugins/banktags/tabs/BankSearch.java | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java index 9ebbc68910..449989d775 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java @@ -186,7 +186,7 @@ public class BankPlugin extends Plugin eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent); eventBus.subscribe(WidgetLoaded.class, this, this::onWidgetLoaded); eventBus.subscribe(ItemContainerChanged.class, this, this::onItemContainerChanged); - eventBus.subscribe(VarClientStrChanged.class, this, this::onVarClientStrChanged); + eventBus.subscribe(VarClientStrChanged.class, this, this::onVarClientStrChanged); searchString = ""; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java index b832140ec2..589f7052e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java @@ -69,23 +69,23 @@ public class BankSearch }); } - public void layoutBank() - { - Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); - if (bankContainer == null || bankContainer.isHidden()) - { - return; - } + public void layoutBank() + { + Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); + if (bankContainer == null || bankContainer.isHidden()) + { + return; + } - Object[] scriptArgs = bankContainer.getOnInvTransmit(); + Object[] scriptArgs = bankContainer.getOnInvTransmit(); - if (scriptArgs == null) - { - return; - } + if (scriptArgs == null) + { + return; + } - client.runScript(scriptArgs); - } + client.runScript(scriptArgs); + } public void reset(boolean closeChat) { From 3265f1fadf987d371b61b38d62e37907269da922 Mon Sep 17 00:00:00 2001 From: Kyle <48519776+xKylee@users.noreply.github.com> Date: Thu, 17 Oct 2019 12:10:17 +0100 Subject: [PATCH 013/185] Update BankPlugin.java --- .../main/java/net/runelite/client/plugins/bank/BankPlugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java index 449989d775..c9eb544730 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java @@ -300,7 +300,6 @@ public class BankPlugin extends Plugin searchBackground.setSpriteId(SpriteID.EQUIPMENT_SLOT_TILE); } } - } public void onItemContainerChanged(ItemContainerChanged event) From 220b90c0a6399f7632a979270fff9ae0b0a485dc Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 17 Oct 2019 23:46:24 +0200 Subject: [PATCH 014/185] Change setModifed so it can't change modified back to false (#1805) --- .../main/java/net/runelite/api/events/MenuEntryAdded.java | 8 ++++---- .../src/main/java/net/runelite/api/events/MenuOpened.java | 8 ++++++++ .../main/java/net/runelite/client/menus/MenuManager.java | 4 ++-- .../runelite/client/plugins/agility/AgilityPlugin.java | 5 ++++- .../plugins/chattranslation/ChatTranslationPlugin.java | 2 +- .../java/net/runelite/client/plugins/corp/CorpPlugin.java | 2 +- .../runelite/client/plugins/devtools/DevToolsPlugin.java | 2 +- .../client/plugins/grandexchange/GrandExchangePlugin.java | 2 +- .../client/plugins/grounditems/GroundItemsPlugin.java | 6 +++--- .../client/plugins/inventorytags/InventoryTagsPlugin.java | 2 +- .../plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 2 +- .../client/plugins/npchighlight/NpcIndicatorsPlugin.java | 2 +- .../src/main/java/net/runelite/mixins/RSClientMixin.java | 2 +- 13 files changed, 29 insertions(+), 18 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java b/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java index 442c2dc1b3..7b9c0d3fb3 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java @@ -24,7 +24,7 @@ */ package net.runelite.api.events; -import lombok.Setter; +import lombok.Getter; import net.runelite.api.MenuEntry; /** @@ -44,11 +44,11 @@ public class MenuEntryAdded extends MenuEntry implements Event * Checks if count is the same, but doesn't check if there's * been multiple changes */ - @Setter + @Getter private boolean modified; - public boolean hasBeenModified() + public void setModified() { - return modified; + this.modified = true; } } diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java index b697153738..221c8b9d0d 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java @@ -24,6 +24,8 @@ */ package net.runelite.api.events; +import lombok.AccessLevel; +import lombok.Setter; import net.runelite.api.MenuEntry; import lombok.Data; @@ -38,6 +40,7 @@ public class MenuOpened implements Event * in menuEntries is changed, so the changes can be * propagated through to the client. */ + @Setter(AccessLevel.NONE) private boolean modified; /** @@ -62,4 +65,9 @@ public class MenuOpened implements Event return null; } + + public void setModified() + { + this.modified = true; + } } 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 58962ca97a..b7a96caa27 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 @@ -240,7 +240,7 @@ public class MenuManager // Need to set the event entries to prevent conflicts event.setMenuEntries(arrayEntries); - event.setModified(true); + event.setModified(); } private void onMenuEntryAdded(MenuEntryAdded event) @@ -889,7 +889,7 @@ public class MenuManager } @AllArgsConstructor - private class SortMapping implements Comparable + private static class SortMapping implements Comparable { private final int priority; private final MenuEntry entry; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java index fcceef31f9..4edaf9e0b1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java @@ -541,7 +541,10 @@ public class AgilityPlugin extends Plugin changed |= checkAndModify(entry); } - event.setModified(changed); + if (changed) + { + event.setModified(); + } } private boolean checkAndModify(MenuEntry old) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java index 8fcdc625c1..924edace6b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java @@ -202,7 +202,7 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener newEntries[i].setOpcode(MenuOpcode.RUNELITE.getId()); event.setMenuEntries(newEntries); - event.setModified(true); + event.setModified(); return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java index a6f6a5f9e9..de2bf402a0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java @@ -258,7 +258,7 @@ public class CorpPlugin extends Plugin } event.setOpcode(NPC_SECOND_OPTION.getId() + MENU_ACTION_DEPRIORITIZE_OFFSET); - event.setModified(true); + event.setModified(); } private void onConfigChanged(ConfigChanged configChanged) 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 96d8dd9d4b..bfe3140920 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 @@ -407,7 +407,7 @@ public class DevToolsPlugin extends Plugin } entry.setTarget(entry.getTarget() + " " + ColorUtil.prependColorTag("(" + info + ")", JagexColors.MENU_TARGET)); - entry.setModified(true); + entry.setModified(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index 51eea405fc..a9c03d0939 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -448,7 +448,7 @@ public class GrandExchangePlugin extends Plugin case WidgetID.SHOP_INVENTORY_GROUP_ID: menuEntry.setOption(SEARCH_GRAND_EXCHANGE); menuEntry.setOpcode(MenuOpcode.RUNELITE.getId()); - menuEntry.setModified(true); + menuEntry.setModified(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java index 35faedbe02..2c705ac6d5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java @@ -983,7 +983,7 @@ public class GroundItemsPlugin extends Plugin { final String optionText = telegrabEntry ? "Cast" : "Take"; lastEntry.setOption(ColorUtil.prependColorTag(optionText, color)); - lastEntry.setModified(true); + lastEntry.setModified(); } if (mode == BOTH || mode == NAME) @@ -1003,14 +1003,14 @@ public class GroundItemsPlugin extends Plugin } lastEntry.setTarget(target); - lastEntry.setModified(true); + lastEntry.setModified(); } } if (this.showMenuItemQuantities && itemComposition.isStackable() && quantity > 1) { lastEntry.setTarget(lastEntry.getTarget() + " (" + quantity + ")"); - lastEntry.setModified(true); + lastEntry.setModified(); } if (this.removeIgnored && lastEntry.getOption().equals("Take") && hiddenItemList.contains(Text.removeTags(lastEntry.getTarget()))) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java index c6e7dd75c4..9623ecafc6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java @@ -250,7 +250,7 @@ public class InventoryTagsPlugin extends Plugin // Need to set the event entries to prevent conflicts event.setMenuEntries(menuList); - event.setModified(true); + event.setModified(); } } 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 389ef8f84b..6c92270e37 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 @@ -578,7 +578,7 @@ public class MenuEntrySwapperPlugin extends Plugin } event.setMenuEntries(menu_entries.toArray(new MenuEntry[0])); - event.setModified(true); + event.setModified(); } public void onMenuEntryAdded(MenuEntryAdded event) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java index 58c5ad1d14..cdcdd34416 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java @@ -311,7 +311,7 @@ public class NpcIndicatorsPlugin extends Plugin { final String target = ColorUtil.prependColorTag(Text.removeTags(event.getTarget()), this.getHighlightColor); event.setTarget(target); - event.setModified(true); + event.setModified(); } else if (hotKeyPressed && type == MenuOpcode.EXAMINE_NPC.getId()) { 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 1d92f52e7d..e9e82eabaa 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -750,7 +750,7 @@ public abstract class RSClientMixin implements RSClient client.getCallbacks().post(MenuEntryAdded.class, event); - if (event.hasBeenModified() && client.getMenuOptionCount() == newCount) + if (event.isModified() && client.getMenuOptionCount() == newCount) { options[oldCount] = event.getOption(); targets[oldCount] = event.getTarget(); From bdf947775e1a4a53c777d3b27d10ecfabf71f16f Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 17 Oct 2019 23:54:11 +0200 Subject: [PATCH 015/185] Clean up playerscouter disc (aim at specific uses, instead of general) (#1806) --- .../http/api/discord/DiscordEmbed.java | 49 ++++--------------- .../http/api/discord/DiscordMessage.java | 37 +++----------- .../plugins/playerscouter/PlayerScouter.java | 26 +++++----- 3 files changed, 28 insertions(+), 84 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/discord/DiscordEmbed.java b/http-api/src/main/java/net/runelite/http/api/discord/DiscordEmbed.java index 9de5f42331..d702a0d82d 100644 --- a/http-api/src/main/java/net/runelite/http/api/discord/DiscordEmbed.java +++ b/http-api/src/main/java/net/runelite/http/api/discord/DiscordEmbed.java @@ -61,49 +61,20 @@ public class DiscordEmbed VideoEmbed video; ProviderEmbed provider; AuthorEmbed author; - @Builder.Default - List fields = new ArrayList<>(); + final List fields = new ArrayList<>(); - public DiscordEmbed() + public DiscordEmbed(AuthorEmbed author, ThumbnailEmbed thumb, String description, FooterEmbed footer, String color, List fields) { - + this.author = author; + this.thumbnail = thumb; + this.description = description; + this.footer = footer; + this.color = color; + this.fields.addAll(fields); } - public DiscordEmbed(String title, String description) + public DiscordMessage toDiscordMessage(String username, String content, String avatarUrl) { - this(title, description, null); - } - - public DiscordEmbed(String title, String description, String url) - { - setTitle(title); - setDescription(description); - setUrl(url); - } - - public static DiscordMessage toDiscordMessage(DiscordEmbed embed, String username, String avatarURL) - { - return DiscordMessage.builder() - .username(username) - .avatarUrl(avatarURL) - .content("") - .embed(embed) - .build(); - } - - public DiscordMessage toDiscordMessage(String username, String avatarUrl) - { - return DiscordEmbed.toDiscordMessage(this, username, avatarUrl); - } - - public static class DiscordEmbedBuilder - { - List fields = new ArrayList<>(); - - public DiscordEmbedBuilder field(FieldEmbed field) - { - fields.add(field); - return this; - } + return new DiscordMessage(username, content, avatarUrl, this); } } diff --git a/http-api/src/main/java/net/runelite/http/api/discord/DiscordMessage.java b/http-api/src/main/java/net/runelite/http/api/discord/DiscordMessage.java index 061568da9d..cea482d203 100644 --- a/http-api/src/main/java/net/runelite/http/api/discord/DiscordMessage.java +++ b/http-api/src/main/java/net/runelite/http/api/discord/DiscordMessage.java @@ -29,16 +29,12 @@ package net.runelite.http.api.discord; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter -@Builder -@AllArgsConstructor @ToString public class DiscordMessage { @@ -48,24 +44,14 @@ public class DiscordMessage String avatarUrl; @SerializedName("tts") boolean textToSpeech; - List embeds = new ArrayList<>(); + final List embeds = new ArrayList<>(); - public DiscordMessage() + DiscordMessage(String username, String content, String avatar_url, DiscordEmbed embed) { - - } - - public DiscordMessage(String username, String content, String avatar_url) - { - this(username, content, avatar_url, false); - } - - public DiscordMessage(String username, String content, String avatar_url, boolean tts) - { - setUsername(username); - setContent(content); - setAvatarUrl(avatar_url); - setTextToSpeech(tts); + this.username = username; + this.content = content; + this.avatarUrl = avatar_url; + this.embeds.add(embed); } public void setUsername(String username) @@ -79,15 +65,4 @@ public class DiscordMessage this.username = null; } } - - public static class DiscordMessageBuilder - { - List embeds = new ArrayList<>(); - - public DiscordMessageBuilder embed(DiscordEmbed embed) - { - embeds.add(embed); - return this; - } - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java index b1f62106c8..0660c1c264 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java @@ -586,7 +586,6 @@ public class PlayerScouter extends Plugin message(name, icon, image, fieldList, color); player.setScouted(true); - fieldList.clear(); } private void message(String name, String iconUrl, ThumbnailEmbed thumbnail, List fields, String color) @@ -602,25 +601,24 @@ public class PlayerScouter extends Plugin final Date currentTime = new Date(System.currentTimeMillis()); - DiscordEmbed discordEmbed = DiscordEmbed.builder() - .author(AuthorEmbed.builder() + DiscordEmbed discordEmbed = new DiscordEmbed( + AuthorEmbed.builder() .icon_url(iconUrl) .name(name) - .build()) - .thumbnail(thumbnail) - .description(" ") - .fields(fields) - .footer(FooterEmbed.builder() + .build(), + thumbnail, + " ", + FooterEmbed.builder() .icon_url("https://raw.githubusercontent.com/runelite/runelite/master/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png") .text("Gabon Scouter | Time: " + SDF.format(currentTime)) - .build()) - .color(color) - .build(); + .build(), + color, + fields + ); + + DiscordMessage discordMessage = discordEmbed.toDiscordMessage("Gabon Scouter", " ", "https://i.imgur.com/2A6dr7q.png"); - DiscordMessage discordMessage = new DiscordMessage("Gabon Scouter", " ", "https://i.imgur.com/2A6dr7q.png"); - discordMessage.getEmbeds().add(discordEmbed); DISCORD_CLIENT.message(this.webhook, discordMessage); - fields.clear(); } private String location(PlayerContainer player) From f31e366da66e3333904bdf1a407bdcf9791a3ac1 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 17 Oct 2019 18:50:25 -0400 Subject: [PATCH 016/185] random events: fix menu being hidden for own events This changes the plugin to work by just using interact change events, which will happen regardless of the spawn events and whether or not it is interacting at the time of spawn. This fixes two bugs in the existing implementation: 1) not updating lastEventTick on interact change, causing currentRandomEvent to get timed out near immediately 2) not sending notifications for npcs which spawn while interacting --- .../randomevents/RandomEventPlugin.java | 74 +++++++------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java index 9c9c75b778..bc9cb52977 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java @@ -28,20 +28,18 @@ package net.runelite.client.plugins.randomevents; import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import java.util.Set; import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.MenuAction; import net.runelite.api.NPC; import net.runelite.api.NpcID; import net.runelite.api.Player; -import net.runelite.api.events.GameTick; import net.runelite.api.events.InteractingChanged; import net.runelite.api.events.MenuEntryAdded; -import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.NpcDespawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -53,6 +51,7 @@ import net.runelite.client.plugins.PluginDescriptor; description = "Notify when random events appear and remove talk/dismiss options on events that aren't yours.", enabledByDefault = false ) +@Slf4j public class RandomEventPlugin extends Plugin { private static final Set EVENT_NPCS = ImmutableSet.of( @@ -85,10 +84,8 @@ public class RandomEventPlugin extends Plugin ); private static final int RANDOM_EVENT_TIMEOUT = 150; - private Map spawnedNpcs = new HashMap<>(); private NPC currentRandomEvent; - // event npcs teleport to you to stay in range, we need to throttle spawns - private int lastEventTick = -RANDOM_EVENT_TIMEOUT; + private int lastNotificationTick = -RANDOM_EVENT_TIMEOUT; // to avoid double notifications @Inject private Client client; @@ -108,34 +105,8 @@ public class RandomEventPlugin extends Plugin @Override protected void shutDown() throws Exception { - lastEventTick = 0; + lastNotificationTick = 0; currentRandomEvent = null; - spawnedNpcs.clear(); - } - - @Subscribe - public void onNpcSpawned(NpcSpawned event) - { - NPC npc = event.getNpc(); - - if (!EVENT_NPCS.contains(npc.getId())) - { - return; - } - - // only occasionally do event npcs spawn with non-null interacting - if (npc.getInteracting() == client.getLocalPlayer()) - { - if (client.getTickCount() - lastEventTick > RANDOM_EVENT_TIMEOUT) - { - currentRandomEvent = npc; - lastEventTick = client.getTickCount(); - } - } - else - { - spawnedNpcs.put(npc, client.getTickCount()); - } } @Subscribe @@ -143,31 +114,36 @@ public class RandomEventPlugin extends Plugin { Actor source = event.getSource(); Actor target = event.getTarget(); + Player player = client.getLocalPlayer(); - if (spawnedNpcs.containsKey(source)) + // Check that the npc is interacting with the player and the player isn't interacting with the npc, so + // that the notification doesn't fire from talking to other user's randoms + if (target != player || player.getInteracting() == source || !(source instanceof NPC) || !EVENT_NPCS.contains(((NPC) source).getId())) { - Player player = client.getLocalPlayer(); - if (player == target && client.getTickCount() - lastEventTick > RANDOM_EVENT_TIMEOUT) + return; + } + + log.debug("Random event spawn: {}", source.getName()); + + currentRandomEvent = (NPC) source; + + if (client.getTickCount() - lastNotificationTick > RANDOM_EVENT_TIMEOUT) + { + lastNotificationTick = client.getTickCount(); + + if (shouldNotify(currentRandomEvent.getId())) { - currentRandomEvent = (NPC) source; - if (shouldNotify(currentRandomEvent.getId())) - { - notifier.notify("Random event spawned: " + currentRandomEvent.getName()); - } + notifier.notify("Random event spawned: " + currentRandomEvent.getName()); } } } @Subscribe - public void onGameTick(GameTick event) + public void onNpcDespawned(NpcDespawned npcDespawned) { - if (!spawnedNpcs.isEmpty()) - { - // allow 2 ticks for interacting to get set - spawnedNpcs.entrySet().removeIf(entry -> client.getTickCount() - entry.getValue() >= 2); - } + NPC npc = npcDespawned.getNpc(); - if (client.getTickCount() - lastEventTick > RANDOM_EVENT_TIMEOUT) + if (npc == currentRandomEvent) { currentRandomEvent = null; } From b52cf1e93b5d5c1b300f695dfc9f3cfef956c09c Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 18 Oct 2019 01:11:07 +0200 Subject: [PATCH 017/185] pluginmanager: Load externals only on startup (#1793) --- .../java/net/runelite/client/RuneLite.java | 9 +- ...Watcher.java => ExternalPluginLoader.java} | 123 +----------------- .../client/plugins/PluginManager.java | 12 +- 3 files changed, 17 insertions(+), 127 deletions(-) rename runelite-client/src/main/java/net/runelite/client/plugins/{PluginWatcher.java => ExternalPluginLoader.java} (61%) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 10fe6cc739..e54dda2e32 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -323,20 +323,19 @@ public class RuneLite } // Load user configuration - RuneLiteSplashScreen.stage(.57, "Loading user config"); configManager.load(); // Load the session, including saved configuration - sessionManager.loadSession(); RuneLiteSplashScreen.stage(.58, "Loading session data"); - - // Begin watching for new plugins - pluginManager.watch(); + sessionManager.loadSession(); // Tell the plugin manager if client is outdated or not pluginManager.setOutdated(isOutdated); + // Load external plugins + pluginManager.loadExternalPlugins(); + // Load the plugins, but does not start them yet. // This will initialize configuration pluginManager.loadCorePlugins(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java b/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginLoader.java similarity index 61% rename from runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java rename to runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginLoader.java index 85225bf97e..81ca7c7a6f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ExternalPluginLoader.java @@ -30,18 +30,10 @@ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URLClassLoader; -import java.nio.file.FileSystems; -import java.nio.file.Path; -import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; -import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; -import java.nio.file.WatchEvent; -import java.nio.file.WatchEvent.Kind; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; import java.util.List; +import java.util.Objects; import javax.inject.Inject; import javax.inject.Singleton; - import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLite; import net.runelite.client.config.Config; @@ -50,106 +42,33 @@ import net.runelite.client.config.OpenOSRSConfig; @Singleton @Slf4j -public class PluginWatcher extends Thread +public class ExternalPluginLoader { private static final File BASE = RuneLite.PLUGIN_DIR; private final OpenOSRSConfig OpenOSRSConfig; private final PluginManager pluginManager; - private final WatchService watchService; - private final WatchKey watchKey; @Inject private ConfigManager configManager; @Inject - public PluginWatcher(OpenOSRSConfig OpenOSRSConfig, PluginManager pluginManager) throws IOException + public ExternalPluginLoader(OpenOSRSConfig OpenOSRSConfig, PluginManager pluginManager) { this.OpenOSRSConfig = OpenOSRSConfig; this.pluginManager = pluginManager; - setName("Plugin Watcher"); - setDaemon(true); - - watchService = FileSystems.getDefault().newWatchService(); BASE.mkdirs(); - Path dir = BASE.toPath(); - watchKey = dir.register(watchService, ENTRY_MODIFY, ENTRY_DELETE); } - public void cancel() + public void scanAndLoad() { - watchKey.cancel(); - } - - @Override - public void run() - { - if (OpenOSRSConfig.enablePlugins()) + if (!OpenOSRSConfig.enablePlugins()) { - scan(); + return; } - for (; ; ) - { - try - { - WatchKey key = watchService.take(); - Thread.sleep(50); - - if (!OpenOSRSConfig.enablePlugins()) - { - key.reset(); - continue; - } - - for (WatchEvent event : key.pollEvents()) - { - Kind kind = event.kind(); - Path path = (Path) event.context(); - File file = new File(BASE, path.toFile().getName()); - - log.debug("Event {} file {}", kind, file); - - if (kind == ENTRY_MODIFY) - { - Plugin existing = findPluginForFile(file); - if (existing != null) - { - log.info("Reloading plugin {}", file); - unload(existing); - } - else - { - log.info("Loading plugin {}", file); - } - - load(file); - } - else if (kind == ENTRY_DELETE) - { - Plugin existing = findPluginForFile(file); - if (existing != null) - { - log.info("Unloading plugin {}", file); - - unload(existing); - } - } - } - key.reset(); - - } - catch (InterruptedException ex) - { - log.warn("error polling for plugins", ex); - } - } - } - - private void scan() - { - for (File file : BASE.listFiles()) + for (File file : Objects.requireNonNull(BASE.listFiles())) { if (!file.getName().endsWith(".jar")) { @@ -160,18 +79,6 @@ public class PluginWatcher extends Thread } } - private Plugin findPluginForFile(File file) - { - for (Plugin plugin : pluginManager.getPlugins()) - { - if (plugin.file != null && plugin.file.equals(file)) - { - return plugin; - } - } - return null; - } - private void load(File pluginFile) { PluginClassLoader loader; @@ -242,22 +149,6 @@ public class PluginWatcher extends Thread pluginManager.add(plugin); } - private void unload(Plugin plugin) - { - try - { - pluginManager.stopPlugin(plugin); - } - catch (PluginInstantiationException ex) - { - log.warn("unable to stop plugin", ex); - } - - pluginManager.remove(plugin); // remove it regardless - - close(plugin.loader); - } - private void close(URLClassLoader classLoader) { try diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index 5804b636fd..10ec3ef9ed 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -99,7 +99,7 @@ public class PluginManager .getAnnotation(ConfigGroup.class).value(); @Inject - PluginWatcher pluginWatcher; + ExternalPluginLoader externalPluginLoader; @Setter boolean isOutdated; @@ -128,11 +128,6 @@ public class PluginManager } } - public void watch() - { - pluginWatcher.start(); - } - private void onSessionOpen(SessionOpen event) { refreshPlugins(); @@ -210,6 +205,11 @@ public class PluginManager } } + public void loadExternalPlugins() + { + externalPluginLoader.scanAndLoad(); + } + public void loadCorePlugins() throws IOException { plugins.addAll(scanAndInstantiate(getClass().getClassLoader(), PLUGIN_PACKAGE)); From 3f33f0975770da62eb77ebb061bd2476be01a96e Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 18 Oct 2019 02:54:31 +0100 Subject: [PATCH 018/185] clues: add question text to all applicable clues --- .../cluescrolls/clues/AnagramClue.java | 140 +++++++++--------- .../plugins/cluescrolls/clues/CipherClue.java | 41 ++--- .../cluescrolls/clues/CrypticClue.java | 33 ++++- 3 files changed, 121 insertions(+), 93 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java index 27391e39bf..5c8e38e72a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java @@ -51,109 +51,109 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc private static final String ANAGRAM_TEXT_BEGINNER = "The anagram reveals who to speak to next: "; private static final Set CLUES = ImmutableSet.of( - new AnagramClue("A BAKER", "Baraek", new WorldPoint(3217, 3434, 0), "Varrock square", "5"), - new AnagramClue("A BASIC ANTI POT", "Captain Tobias", new WorldPoint(3026, 3216, 0), "Port Sarim", "6"), + new AnagramClue("A BAKER", "Baraek", new WorldPoint(3217, 3434, 0), "Varrock square", "How many stalls are there in Varrock Square?", "5"), + new AnagramClue("A BASIC ANTI POT", "Captain Tobias", new WorldPoint(3026, 3216, 0), "Port Sarim", "How many ships are there docked at Port Sarim currently?", "6"), new AnagramClue("A ELF KNOWS", "Snowflake", new WorldPoint(2872, 3934, 0), "Weiss"), - new AnagramClue("A HEART", "Aretha", new WorldPoint(1814, 3851, 0), "Soul altar", "2"), + new AnagramClue("A HEART", "Aretha", new WorldPoint(1814, 3851, 0), "Soul altar", "32 - 5x = 22, what is x?", "2"), new AnagramClue("A ZEN SHE", "Zenesha", new WorldPoint(2652, 3295, 0), "Platebody Southern Ardougne centre square"), new AnagramClue("ACE MATCH ELM", "Cam The Camel", new WorldPoint(3300, 3231, 0), "North of the glider in Al Kharid"), new AnagramClue("AHA JAR", "Jaraah", new WorldPoint(3359, 3276, 0), "Duel Arena hospital"), new AnagramClue("AN PAINT TONIC", "Captain Ninto", new WorldPoint(2865, 9877, 0), "Bar under White Wolf Mountain"), - new AnagramClue("ARC O LINE", "Caroline", new WorldPoint(2715, 3302, 0), "North Witchaven next to the row boat", "11"), - new AnagramClue("ARE COL", "Oracle", new WorldPoint(3013, 3501, 0), "Ice Mountain West of Edgeville", "48"), - new AnagramClue("ARMCHAIR THE PELT", "Charlie the Tramp", new WorldPoint(3209, 3392, 0), "South entrance of Varrock", "0"), + new AnagramClue("ARC O LINE", "Caroline", new WorldPoint(2715, 3302, 0), "North Witchaven next to the row boat", "How many fishermen are there on the fishing platform?", "11"), + new AnagramClue("ARE COL", "Oracle", new WorldPoint(3013, 3501, 0), "Ice Mountain West of Edgeville", "If x is 15 and y is 3 what is 3x + y?", "48"), + new AnagramClue("ARMCHAIR THE PELT", "Charlie the Tramp", new WorldPoint(3209, 3392, 0), "South entrance of Varrock", "How many coins would I have if I had 0 coins and attempted to buy 3 loaves of bread?", "0"), new AnagramClue("ARR! SO I AM A CRUST, AND?", "Ramara du Croissant", new WorldPoint(2339, 3677, 0), "Piscatoris Fishing Colony"), - new AnagramClue("AT HERG", "Regath", new WorldPoint(1719, 3723, 0), "General Store, Arceuus, Zeah", "25"), + new AnagramClue("AT HERG", "Regath", new WorldPoint(1719, 3723, 0), "General Store, Arceuus, Zeah", "What is -5 to the power of 2?", "25"), new AnagramClue("A BAS", "Saba", new WorldPoint(2858, 3577, 0), "Death Plateau"), - new AnagramClue("AREA CHEF TREK", "Father Aereck", new WorldPoint(3243, 3208, 0), "Lumbridge Church", "19 or 20"), + new AnagramClue("AREA CHEF TREK", "Father Aereck", new WorldPoint(3243, 3208, 0), "Lumbridge Church", "How many gravestones are in the church graveyard?", "19 or 20"), new AnagramClue("BAIL TRIMS", "Brimstail", new WorldPoint(2402, 3419, 0), "West of Stronghold Slayer Cave"), new AnagramClue("BAKER CLIMB", "Brambickle", new WorldPoint(2783, 3861, 0), "Trollweiss mountain"), new AnagramClue("BLUE GRIM GUIDED", "Lumbridge Guide", new WorldPoint(3232, 3232, 0), "Lumbridge"), - new AnagramClue("BY LOOK", "Bolkoy", new WorldPoint(2529, 3162, 0), "Tree Gnome Village general store", "13"), - new AnagramClue("CALAMARI MADE MUD", "Madame Caldarium", new WorldPoint(2553, 2868, 0), "Corsair Cove", "6"), + new AnagramClue("BY LOOK", "Bolkoy", new WorldPoint(2529, 3162, 0), "Tree Gnome Village general store", "How many flowers are there in the clearing below this platform?", "13"), + new AnagramClue("CALAMARI MADE MUD", "Madame Caldarium", new WorldPoint(2553, 2868, 0), "Corsair Cove", "What is 3(5-3)?", "6"), new AnagramClue("CAR IF ICES", "Sacrifice", new WorldPoint(2209, 3056, 0), "Zul-Andra"), - new AnagramClue("CAREER IN MOON", "Oneiromancer", new WorldPoint(2150, 3866, 0), "Astral altar", "25"), - new AnagramClue("CLASH ION", "Nicholas", new WorldPoint(1841, 3803, 0), "North of Port Piscarilius fishing shop", "4"), - new AnagramClue("C ON GAME HOC", "Gnome Coach", new WorldPoint(2395, 3486, 0), "Gnome Ball course", "6"), - new AnagramClue("COOL NERD", "Old crone", new WorldPoint(3462, 3557, 0), "East of the Slayer Tower", "619"), - new AnagramClue("COPPER ORE CRYPTS", "Prospector Percy", new WorldPoint(3061, 3377, 0), "Motherlode Mine", "12"), + new AnagramClue("CAREER IN MOON", "Oneiromancer", new WorldPoint(2150, 3866, 0), "Astral altar", "How many Suqah inhabit Lunar isle?", "25"), + new AnagramClue("CLASH ION", "Nicholas", new WorldPoint(1841, 3803, 0), "North of Port Piscarilius fishing shop", "How many windows are in Tynan's shop?", "4"), + new AnagramClue("C ON GAME HOC", "Gnome Coach", new WorldPoint(2395, 3486, 0), "Gnome Ball course", "How many gnomes on the Gnome ball field have red patches on their uniforms?", "6"), + new AnagramClue("COOL NERD", "Old crone", new WorldPoint(3462, 3557, 0), "East of the Slayer Tower", "What is the combined combat level of each species that live in Slayer tower?", "619"), + new AnagramClue("COPPER ORE CRYPTS", "Prospector Percy", new WorldPoint(3061, 3377, 0), "Motherlode Mine", "During a party, everyone shook hands with everyone else. There were 66 handshakes. How many people were at the party?", "12"), new AnagramClue("DED WAR", "Edward", new WorldPoint(3284, 3943, 0), "Inside Rogue's Castle"), - new AnagramClue("DEKAGRAM", "Dark mage", new WorldPoint(3039, 4835, 0), "Centre of the Abyss", "13"), - new AnagramClue("DO SAY MORE", "Doomsayer", new WorldPoint(3230, 3230, 0), "East of Lumbridge Castle", "95"), - new AnagramClue("DIM THARN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area", "28 or Puzzle box"), - new AnagramClue("DR HITMAN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area", "28, Light box or Puzzle box"), - new AnagramClue("DR WARDEN FUNK", "Drunken Dwarf", new WorldPoint(2913, 10221, 0), "East Side of Keldagrim", "Puzzle box"), - new AnagramClue("DRAGONS LAMENT", "Strange Old Man", new WorldPoint(3564, 3288, 0), "Barrows", "40"), - new AnagramClue("DT RUN B", "Brundt the Chieftain", new WorldPoint(2658, 3670, 0), "Rellekka, main hall", "4"), + new AnagramClue("DEKAGRAM", "Dark mage", new WorldPoint(3039, 4835, 0), "Centre of the Abyss", "How many rifts are found here in the abyss?", "13"), + new AnagramClue("DO SAY MORE", "Doomsayer", new WorldPoint(3230, 3230, 0), "East of Lumbridge Castle", "What is 40 divided by 1/2 plus 15?", "95"), + new AnagramClue("DIM THARN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area"), + new AnagramClue("DR HITMAN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area", "How many scorpions live under the pit?", "28"), + new AnagramClue("DR WARDEN FUNK", "Drunken Dwarf", new WorldPoint(2913, 10221, 0), "East Side of Keldagrim"), + new AnagramClue("DRAGONS LAMENT", "Strange Old Man", new WorldPoint(3564, 3288, 0), "Barrows", "One pipe fills a barrel in 1 hour while another pipe can fill the same barrel in 2 hours. How many minutes will it take to fill the take if both pipes are used?", "40"), + new AnagramClue("DT RUN B", "Brundt the Chieftain", new WorldPoint(2658, 3670, 0), "Rellekka, main hall", "How many people are waiting for the next bard to perform?", "4"), new AnagramClue("DUO PLUG", "Dugopul", new WorldPoint(2803, 2744, 0), "Graveyard on Ape Atoll"), - new AnagramClue("EEK ZERO OP", "Zoo keeper", new WorldPoint(2613, 3269, 0), "Ardougne Zoo", "40"), + new AnagramClue("EEK ZERO OP", "Zoo keeper", new WorldPoint(2613, 3269, 0), "Ardougne Zoo", "How many animals are in the Ardougne Zoo?", "40"), new AnagramClue("EL OW", "Lowe", new WorldPoint(3233, 3423, 0), "Varrock archery store"), - new AnagramClue("ERR CURE IT", "Recruiter", new WorldPoint(2541, 3305, 0), "West Ardougne centre square", "20"), + new AnagramClue("ERR CURE IT", "Recruiter", new WorldPoint(2541, 3305, 0), "West Ardougne centre square", "How many houses have a cross on the door?", "20"), new AnagramClue("FORLUN", "Runolf", new WorldPoint(2512, 10256, 0), "Miscellania & Etceteria Dungeon"), new AnagramClue("GOBLIN KERN", "King Bolren", new WorldPoint(2541, 3170, 0), "Tree Gnome Village"), - new AnagramClue("GOT A BOY", "Gabooty", new WorldPoint(2790, 3066, 0), "Centre of Tai Bwo Wannai", "11"), + new AnagramClue("GOT A BOY", "Gabooty", new WorldPoint(2790, 3066, 0), "Centre of Tai Bwo Wannai", "How many buildings in the village?", "11"), new AnagramClue("GULAG RUN", "Uglug Nar", new WorldPoint(2442, 3051, 0), "West of Jiggig"), - new AnagramClue("GOBLETS ODD TOES", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "2"), - new AnagramClue("HALT US", "Luthas", new WorldPoint(2938, 3152, 0), "Banana plantation, Karamja", "33 (or none)"), + new AnagramClue("GOBLETS ODD TOES", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "How many types of dragon are there beneath the whirlpool's cavern?", "2"), + new AnagramClue("HALT US", "Luthas", new WorldPoint(2938, 3152, 0), "Banana plantation, Karamja"), new AnagramClue("HE DO POSE. IT IS CULTRRL, MK?", "Riki the sculptor's model", new WorldPoint(2904, 10206, 0), "East Keldagrim, south of kebab seller."), - new AnagramClue("HEORIC", "Eohric", new WorldPoint(2900, 3565, 0), "Top floor of Burthorpe Castle", "36"), - new AnagramClue("HIS PHOR", "Horphis", new WorldPoint(1639, 3812, 0), "Arceuus Library, Zeah", "1"), - new AnagramClue("I AM SIR", "Marisi", new WorldPoint(1737, 3557, 0), "Allotment patch, South of Hosidius chapel", "5"), + new AnagramClue("HEORIC", "Eohric", new WorldPoint(2900, 3565, 0), "Top floor of Burthorpe Castle", "King Arthur and Merlin sit down at the Round Table with 8 knights. How many degrees does each get?", "36"), + new AnagramClue("HIS PHOR", "Horphis", new WorldPoint(1639, 3812, 0), "Arceuus Library, Zeah", "On a scale of 1-10, how helpful is Logosia?", "1"), + new AnagramClue("I AM SIR", "Marisi", new WorldPoint(1737, 3557, 0), "Allotment patch, South of Hosidius chapel", "How many cities form the Kingdom of Great Kourend?", "5"), new AnagramClue("ICY FE", "Fycie", new WorldPoint(2630, 2997, 0), "East Feldip Hills"), - new AnagramClue("I DOOM ICON INN", "Dominic Onion", new WorldPoint(2609, 3116, 0), "Nightmare Zone", "9,500"), + new AnagramClue("I DOOM ICON INN", "Dominic Onion", new WorldPoint(2609, 3116, 0), "Nightmare Zone", "How many reward points does a herb box cost?", "9,500"), new AnagramClue("I EAT ITS CHART HINTS DO U", "Shiratti the Custodian", new WorldPoint(3427, 2927, 0), "North of fountain, Nardah"), - new AnagramClue("I EVEN", "Nieve", new WorldPoint(2432, 3422, 0), "The slayer master in Gnome Stronghold", "2"), + new AnagramClue("I EVEN", "Nieve", new WorldPoint(2432, 3422, 0), "The slayer master in Gnome Stronghold", "How many farming patches are there in Gnome stronghold?", "2"), new AnagramClue("I FAFFY RUN", "Fairy Nuff", new WorldPoint(3201, 3169, 0), "North of the bank in Zanaris"), new AnagramClue("IM N ZEZIM", "Impling", new WorldPoint(2592, 4324, 0), "The Imp inside Puro-Puro"), - new AnagramClue("KAY SIR", "Sir Kay", new WorldPoint(2760, 3496, 0), "The courtyard in Camelot Castle", "6"), - new AnagramClue("LEAKEY", "Kaylee", new WorldPoint(2957, 3370, 0), "Rising Sun Inn in Falador", "18"), + new AnagramClue("KAY SIR", "Sir Kay", new WorldPoint(2760, 3496, 0), "The courtyard in Camelot Castle", "How many fountains are there within the grounds of Camelot castle.", "6"), + new AnagramClue("LEAKEY", "Kaylee", new WorldPoint(2957, 3370, 0), "Rising Sun Inn in Falador", "How many chairs are there in the Rising Sun?", "18"), new AnagramClue("LAND DOOMD", "Odd Old Man", new WorldPoint(3359, 3506, 0), "Limestone mine northeast of Varrock"), - new AnagramClue("LARK IN DOG", "King Roald", new WorldPoint(3220, 3476, 0), "Ground floor of Varrock castle", "24"), - new AnagramClue("LOW LAG", "Gallow", new WorldPoint(1805, 3566, 0), "Vinery in the Great Kourend", "12"), - new AnagramClue("LADDER MEMO GUV", "Guard Vemmeldo", new WorldPoint(2447, 3418, 1), "Gnome Stronghold Bank", "3"), + new AnagramClue("LARK IN DOG", "King Roald", new WorldPoint(3220, 3476, 0), "Ground floor of Varrock castle", "How many bookcases are there in the Varrock palace library?", "24"), + new AnagramClue("LOW LAG", "Gallow", new WorldPoint(1805, 3566, 0), "Vinery in the Great Kourend", "How many vine patches can you find in this vinery?", "12"), + new AnagramClue("LADDER MEMO GUV", "Guard Vemmeldo", new WorldPoint(2447, 3418, 1), "Gnome Stronghold Bank", "How many magic trees can you find inside the Gnome Stronghold?", "3"), new AnagramClue("MAL IN TAU", "Luminata", new WorldPoint(3508, 3237, 0), "Near Burgh de Rott entrance"), new AnagramClue("ME AM THE CALC", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Outside Duel Arena"), - new AnagramClue("MACHETE CLAM", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Outside Duel Arena", "6"), + new AnagramClue("MACHETE CLAM", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Outside Duel Arena", "How many items can carry water in RuneScape?", "6"), new AnagramClue("ME IF", "Femi", new WorldPoint(2461, 3382, 0), "Gates of Tree Gnome Stronghold"), new AnagramClue("MOLD LA RAN", "Old Man Ral", new WorldPoint(3602, 3209, 0), "Meiyerditch"), - new AnagramClue("MOTHERBOARD", "Brother Omad", new WorldPoint(2606, 3211, 0), "Monastery south of Ardougne", "129"), + new AnagramClue("MOTHERBOARD", "Brother Omad", new WorldPoint(2606, 3211, 0), "Monastery south of Ardougne", "What is the next number? 12, 13, 15, 17, 111, 113, 117, 119, 123....?", "129"), new AnagramClue("MUS KIL READER", "Radimus Erkle", new WorldPoint(2726, 3368, 0), "Legends' Guild"), new AnagramClue("MY MANGLE LAL", "Lammy Langle", new WorldPoint(1688, 3540, 0), "Hosidius spirit tree patch"), - new AnagramClue("NO OWNER", "Oronwen", new WorldPoint(1162, 3178, 0), "Lletya Seamstress shop in Lletya", "20"), - new AnagramClue("NOD MED", "Edmond", new WorldPoint(2566, 3332, 0), "Behind the most NW house in East Ardougne", "3"), - new AnagramClue("O BIRDZ A ZANY EN PC", "Cap'n Izzy No-Beard", new WorldPoint(2807, 3191, 0), "Brimhaven Agility Arena", "33"), - new AnagramClue("OK CO", "Cook", new WorldPoint(3207, 3214, 0), "Ground floor of Lumbridge Castle", "9"), + new AnagramClue("NO OWNER", "Oronwen", new WorldPoint(1162, 3178, 0), "Lletya Seamstress shop in Lletya", "What is the minimum amount of quest points required to reach Lletya?", "20"), + new AnagramClue("NOD MED", "Edmond", new WorldPoint(2566, 3332, 0), "Behind the most NW house in East Ardougne", "How many pigeon cages are there around the back of Jerico's house?", "3"), + new AnagramClue("O BIRDZ A ZANY EN PC", "Cap'n Izzy No-Beard", new WorldPoint(2807, 3191, 0), "Brimhaven Agility Arena", "How many Banana Trees are there in the plantation?", "33"), + new AnagramClue("OK CO", "Cook", new WorldPoint(3207, 3214, 0), "Ground floor of Lumbridge Castle", "How many cannons does Lumbridge Castle have?", "9"), new AnagramClue("OR ZINC FUMES WARD", "Wizard Frumscone", new WorldPoint(2594, 3086, 0), "Downstairs in the Wizards' Guild"), - new AnagramClue("OUR OWN NEEDS", "Nurse Wooned", new WorldPoint(1575, 3590, 0), "Shayzien Infirmary", "19"), - new AnagramClue("PACINNG A TAIE", "Captain Ginea", new WorldPoint(1561, 3602, 0), "Building east of Shayzien combat ring", "113"), - new AnagramClue("PEAK REFLEX", "Flax keeper", new WorldPoint(2744, 3444, 0), "Flax field south of Seers Village", "676"), + new AnagramClue("OUR OWN NEEDS", "Nurse Wooned", new WorldPoint(1575, 3590, 0), "Shayzien Infirmary", "How many injured soldiers are in this tent?", "19"), + new AnagramClue("PACINNG A TAIE", "Captain Ginea", new WorldPoint(1561, 3602, 0), "Building east of Shayzien combat ring", "1 soldier can deal with 6 lizardmen. How many soldiers do we need for an army of 678 lizardmen?", "113"), + new AnagramClue("PEAK REFLEX", "Flax keeper", new WorldPoint(2744, 3444, 0), "Flax field south of Seers Village", "If I have 1014 flax, and I spin a third of them into bowstring, how many flax do I have left?", "676"), new AnagramClue("PEATY PERT", "Party Pete", new WorldPoint(3047, 3376, 0), "Falador Party Room"), new AnagramClue("PROFS LOSE WRONG PIE", "Professor Onglewip", new WorldPoint(3113, 3162, 0), "Ground floor of Wizards Tower"), - new AnagramClue("QUIT HORRIBLE TYRANT", "Brother Tranquility", new WorldPoint(3681, 2963, 0), "Mos Le'Harmless or Harmony Island", "7"), - new AnagramClue("QUE SIR", "Squire", new WorldPoint(2975, 3343, 0), "Falador Castle Courtyard", "654"), - new AnagramClue("R AK MI", "Karim", new WorldPoint(3273, 3181, 0), "Al Kharid Kebab shop", "5"), - new AnagramClue("RAT MAT WITHIN", "Martin Thwait", new WorldPoint(2906, 3537, 0), "Rogues' Den", "2"), + new AnagramClue("QUIT HORRIBLE TYRANT", "Brother Tranquility", new WorldPoint(3681, 2963, 0), "Mos Le'Harmless or Harmony Island", "If I have 49 bottles of rum to share between 7 pirates, how many would each pirate get?", "7"), + new AnagramClue("QUE SIR", "Squire", new WorldPoint(2975, 3343, 0), "Falador Castle Courtyard", "White knights are superior to black knights. 2 white knights can handle 3 black knights. How many knights do we need for an army of 981 black knights?", "654"), + new AnagramClue("R AK MI", "Karim", new WorldPoint(3273, 3181, 0), "Al Kharid Kebab shop", "I have 16 kebabs, I eat one myself and share the rest equally between 3 friends. How many do they have each?", "5"), + new AnagramClue("RAT MAT WITHIN", "Martin Thwait", new WorldPoint(2906, 3537, 0), "Rogues' Den", "How many natural fires burn in Rogue's Den?", "2"), new AnagramClue("RED ART TANS", "Trader Stan", new WorldPoint(3041, 3193, 0), "Port Sarim Charter ship"), - new AnagramClue("RATAI", "Taria", new WorldPoint(2940, 3223, 0), "Rimmington bush patch", "7"), - new AnagramClue("R SLICER", "Clerris", new WorldPoint(1761, 3850, 0), "Arceuus mine, Zeah", "738"), + new AnagramClue("RATAI", "Taria", new WorldPoint(2940, 3223, 0), "Rimmington bush patch", "How many buildings are there in Rimmington?", "7"), + new AnagramClue("R SLICER", "Clerris", new WorldPoint(1761, 3850, 0), "Arceuus mine, Zeah", "If I have 1,000 blood runes, and cast 131 ice barrage spells, how many blood runes do I have left?", "738"), new AnagramClue("RIP MAUL", "Primula", new WorldPoint(2454, 2853, 1), "Myth's Guild, first floor"), - new AnagramClue("SAND NUT", "Dunstan", new WorldPoint(2919, 3574, 0), "Anvil in north east Burthorpe", "8"), + new AnagramClue("SAND NUT", "Dunstan", new WorldPoint(2919, 3574, 0), "Anvil in north east Burthorpe", "How much smithing experience does one receive for smelting a blurite bar?", "8"), new AnagramClue("SEQUIN DIRGE", "Queen Sigrid", new WorldPoint(2612, 3867, 0), "Throne room of Etceteria Castle."), new AnagramClue("SLAM DUSTER GRAIL", "Guildmaster Lars", new WorldPoint(1649, 3498, 0), "Woodcutting guild, Zeah"), - new AnagramClue("SLIDE WOMAN", "Wise Old Man", new WorldPoint(3088, 3253, 0), "Draynor Village", "28"), + new AnagramClue("SLIDE WOMAN", "Wise Old Man", new WorldPoint(3088, 3253, 0), "Draynor Village", "How many bookcases are in the Wise Old Man's house?", "28"), new AnagramClue("SNAH", "Hans", new WorldPoint(3218, 3219, 0), "Lumbridge Castle courtyard"), - new AnagramClue("SNAKES SO I SAIL", "Lisse Isaakson", new WorldPoint(2351, 3801, 0), "Neitiznot", "2"), - new AnagramClue("TAMED ROCKS", "Dockmaster", new WorldPoint(1822, 3739, 0), "Port Piscarilius, NE of General store", "5"), + new AnagramClue("SNAKES SO I SAIL", "Lisse Isaakson", new WorldPoint(2351, 3801, 0), "Neitiznot", "How many arctic logs are required to make a large fremennik round shield?", "2"), + new AnagramClue("TAMED ROCKS", "Dockmaster", new WorldPoint(1822, 3739, 0), "Port Piscarilius, NE of General store", "What is the cube root of 125?", "5"), new AnagramClue("TEN WIGS ON", "Wingstone", new WorldPoint(3389, 2877, 0), "Between Nardah & Agility Pyramid"), new AnagramClue("THEM CAL CAME", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Just outside of the Duel Arena"), - new AnagramClue("THICKNO", "Hickton", new WorldPoint(2822, 3442, 0), "Catherby fletching shop", "2"), + new AnagramClue("THICKNO", "Hickton", new WorldPoint(2822, 3442, 0), "Catherby fletching shop", "How many ranges are there in Catherby?", "2"), new AnagramClue("TWENTY CURE IRON", "New recruit Tony", new WorldPoint(1498, 3544, 0), "Shayzien Graveyard"), - new AnagramClue("UNLEASH NIGHT MIST", "Sigli the Huntsman", new WorldPoint(2660, 3654, 0), "Rellekka", "302"), - new AnagramClue("VESTE", "Steve", new WorldPoint(2432, 3423, 0), "Upstairs Wyvern Area or Stronghold Slayer Cave", "2"), - new AnagramClue("VEIL VEDA", "Evil Dave", new WorldPoint(3079, 9892, 0), "Doris' basement, Edgeville", "666"), - new AnagramClue("WOO AN EGG KIWI", "Awowogei", ObjectID.AWOWOGEI, new WorldPoint(2802, 2765, 0), "Ape Atoll", "24"), + new AnagramClue("UNLEASH NIGHT MIST", "Sigli the Huntsman", new WorldPoint(2660, 3654, 0), "Rellekka", "What is the combined slayer requirement of every monster in the slayer cave?", "302"), + new AnagramClue("VESTE", "Steve", new WorldPoint(2432, 3423, 0), "Upstairs Wyvern Area or Stronghold Slayer Cave", "How many farming patches are there in Gnome stronghold?", "2"), + new AnagramClue("VEIL VEDA", "Evil Dave", new WorldPoint(3079, 9892, 0), "Doris' basement, Edgeville", "What is 333 multiplied by 2?", "666"), + new AnagramClue("WOO AN EGG KIWI", "Awowogei", ObjectID.AWOWOGEI, new WorldPoint(2802, 2765, 0), "Ape Atoll", "If I have 303 bananas, and share them between 31 friends evenly, only handing out full bananas. How many will I have left over?", "24"), new AnagramClue("YAWNS GY", "Ysgawyn", new WorldPoint(2340, 3167, 0), "Lletya"), - new AnagramClue("MAJORS LAVA BADS AIR", "Ambassador Alvijar", new WorldPoint(2736, 5351, 1), "Dorgesh-Kaan, NE Middle Level", "2505"), + new AnagramClue("MAJORS LAVA BADS AIR", "Ambassador Alvijar", new WorldPoint(2736, 5351, 1), "Dorgesh-Kaan, NE Middle Level", "Double the miles before the initial Dorgeshuun veteran.", "2505"), new AnagramClue("AN EARL", "Ranael", new WorldPoint(3315, 3163, 0), "Al Kharid skirt shop"), new AnagramClue("CARPET AHOY", "Apothecary", new WorldPoint(3195, 3404, 0), "Southwest Varrock"), new AnagramClue("DISORDER", "Sedridor", new WorldPoint(3102, 9570, 0), "Wizards' Tower basement"), @@ -163,7 +163,7 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc new AnagramClue("RUG DETER", "Gertrude", new WorldPoint(3151, 3412, 0), "West of Varrock, south of the Cooks' Guild"), new AnagramClue("SIR SHARE RED", "Hairdresser", new WorldPoint(2944, 3381, 0), "Western Falador"), new AnagramClue("TAUNT ROOF", "Fortunato", new WorldPoint(3080, 3250, 0), "Draynor Village Market"), - new AnagramClue("HICK JET", "Jethick", new WorldPoint(2541, 3305, 0), "West Ardougne", "38"), + new AnagramClue("HICK JET", "Jethick", new WorldPoint(2541, 3305, 0), "West Ardougne", "How many graves are there in the city graveyard?", "38"), new AnagramClue("RUE GO", "Goreu", new WorldPoint(2335, 3162, 0), "Lletya") ); @@ -171,27 +171,29 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc private final String npc; private final WorldPoint location; private final String area; + private final String question; private final String answer; private int objectId; private AnagramClue(String text, String npc, WorldPoint location, String area) { - this(text, npc, location, area, null); + this(text, npc, location, area, "", null); } - private AnagramClue(String text, String npc, WorldPoint location, String area, String answer) + private AnagramClue(String text, String npc, WorldPoint location, String area, String question, String answer) { this.text = text; this.npc = npc; this.location = location; this.area = area; + this.question = question; this.answer = answer; this.objectId = -1; } - private AnagramClue(String text, String npc, int objectId, WorldPoint location, String area, String answer) + private AnagramClue(String text, String npc, int objectId, WorldPoint location, String area, String question, String answer) { - this(text, npc, location, area, answer); + this(text, npc, location, area, question, answer); this.objectId = objectId; } @@ -257,7 +259,9 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc { for (AnagramClue clue : CLUES) { - if (text.equalsIgnoreCase(ANAGRAM_TEXT + clue.text) || text.equalsIgnoreCase(ANAGRAM_TEXT_BEGINNER + clue.text)) + if (text.equalsIgnoreCase(ANAGRAM_TEXT + clue.text) + || text.equalsIgnoreCase(ANAGRAM_TEXT_BEGINNER + clue.text) + || text.equalsIgnoreCase(clue.question)) { return clue; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java index 1126e24492..e59e25eb56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -43,35 +43,42 @@ import net.runelite.client.ui.overlay.components.TitleComponent; public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScroll, LocationClueScroll { private static final Set CLUES = ImmutableSet.of( - new CipherClue("BMJ UIF LFCBC TFMMFS", "Ali the Kebab seller", new WorldPoint(3354, 2974, 0), "Pollnivneach", "399"), - new CipherClue("GUHCHO", "Drezel", new WorldPoint(3440, 9895, 0), "Paterdomus", "7"), - new CipherClue("ZCZL", "Adam", new WorldPoint(3227, 3227, 0), "Outside Lumbridge castle", "666"), - new CipherClue("ZHLUG ROG PDQ", "Weird Old Man", new WorldPoint(3224, 3112, 0), "Kalphite Lair entrance. Fairy ring BIQ", "150"), - new CipherClue("ECRVCKP MJCNGF", "Captain Khaled", new WorldPoint(1845, 3754, 0), "Large eastern building in Port Piscarilius", "5"), - new CipherClue("OVEXON", "Eluned", new WorldPoint(2289, 3144, 0), "Outside Lletya", "53,000"), - new CipherClue("VTYR APCNTGLW", "King Percival", new WorldPoint(2634, 4682, 1), "Fisher Realm, first floor. Fairy ring BJR", "5"), - new CipherClue("UZZU MUJHRKYYKJ", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "3"), - new CipherClue("USBJCPSO", "Traiborn", new WorldPoint(3112, 3162, 0), "First floor of Wizards Tower", "3150"), - new CipherClue("HCKTA IQFHCVJGT", "Fairy Godfather", new WorldPoint(2446, 4428, 0), "Zanaris throne room", "64"), - new CipherClue("ZSBKDO ZODO", "Pirate Pete", new WorldPoint(3680, 3537, 0), "Dock northeast of the Ectofunctus", "Puzzle"), - new CipherClue("GBJSZ RVFFO", "Fairy Queen", new WorldPoint(2347, 4435, 0), "Fairy Resistance Hideout", "Puzzle"), - new CipherClue("QSPGFTTPS HSBDLMFCPOF", "Professor Gracklebone", new WorldPoint(1625, 3802, 0), "Ground floor of Arceuus Library", "9"), - new CipherClue("IWPPLQTP", "Gunnjorn", new WorldPoint(2541, 3548, 0), "Barbarian Outpost Agility course", "Puzzle"), - new CipherClue("BSOPME MZETQPS", "Arnold Lydspor", new WorldPoint(2329, 3689, 0), "Piscatoris Fishing Colony general store/bank", "Puzzle") + new CipherClue("BMJ UIF LFCBC TFMMFS", "Ali the Kebab seller", new WorldPoint(3354, 2974, 0), "Pollnivneach", "How many coins would you need to purchase 133 kebabs from me?", "399"), + new CipherClue("GUHCHO", "Drezel", new WorldPoint(3440, 9895, 0), "Paterdomus", "Please solve this for x: 7x - 28=21", "7"), + new CipherClue("ZCZL", "Adam", new WorldPoint(3227, 3227, 0), "Outside Lumbridge castle", "How many snakeskins are needed in order to craft 44 boots, 29 vambraces and 34 bandanas?", "666"), + new CipherClue("ZHLUG ROG PDQ", "Weird Old Man", new WorldPoint(3224, 3112, 0), "Kalphite Lair entrance. Fairy ring BIQ", "SIX LEGS! All of them have 6! There are 25 of them! How many legs?", "150"), + new CipherClue("ECRVCKP MJCNGF", "Captain Khaled", new WorldPoint(1845, 3754, 0), "Large eastern building in Port Piscarilius", "How many fishing cranes can you find around here?", "5"), + new CipherClue("OVEXON", "Eluned", new WorldPoint(2289, 3144, 0), "Outside Lletya", "A question on elven crystal math. I have 5 and 3 crystals, large and small respectively. A large crystal is worth 10,000 coins and a small is worth but 1,000. How much are all my crystals worth?", "53,000"), + new CipherClue("VTYR APCNTGLW", "King Percival", new WorldPoint(2634, 4682, 1), "Fisher Realm, first floor. Fairy ring BJR", "How many cannons are on this here castle?", "5"), + new CipherClue("UZZU MUJHRKYYKJ", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "How many pyre sites are found around this lake?", "3"), + new CipherClue("USBJCPSO", "Traiborn", new WorldPoint(3112, 3162, 0), "First floor of Wizards Tower", "How many air runes would I need to cast 630 wind waves?", "3150"), + new CipherClue("HCKTA IQFHCVJGT", "Fairy Godfather", new WorldPoint(2446, 4428, 0), "Zanaris throne room", "There are 3 inputs and 4 letters on each ring How many total individual fairy ring codes are possible?", "64"), + new CipherClue("ZSBKDO ZODO", "Pirate Pete", new WorldPoint(3680, 3537, 0), "Dock northeast of the Ectofunctus"), + new CipherClue("GBJSZ RVFFO", "Fairy Queen", new WorldPoint(2347, 4435, 0), "Fairy Resistance Hideout"), + new CipherClue("QSPGFTTPS HSBDLMFCPOF", "Professor Gracklebone", new WorldPoint(1625, 3802, 0), "Ground floor of Arceuus Library", "How many round tables can be found on this floor of the library?", "9"), + new CipherClue("IWPPLQTP", "Gunnjorn", new WorldPoint(2541, 3548, 0), "Barbarian Outpost Agility course"), + new CipherClue("BSOPME MZETQPS", "Arnold Lydspor", new WorldPoint(2329, 3689, 0), "Piscatoris Fishing Colony general store/bank") ); private String text; private String npc; private WorldPoint location; private String area; + private String question; private String answer; - private CipherClue(String text, String npc, WorldPoint location, String area, String answer) + private CipherClue(String text, String npc, WorldPoint location, String area) + { + this(text, npc, location, area, "", null); + } + + private CipherClue(String text, String npc, WorldPoint location, String area, String question, String answer) { this.text = "The cipher reveals who to speak to next: " + text; this.npc = npc; this.location = location; this.area = area; + this.question = question; this.answer = answer; } @@ -122,7 +129,7 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr { for (CipherClue clue : CLUES) { - if (clue.text.equalsIgnoreCase(text)) + if (clue.text.equalsIgnoreCase(text) || clue.question.equalsIgnoreCase(text)) { return clue; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index 17eb5278f0..29a9ca5f75 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -61,7 +61,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Search the crates in a bank in Varrock.", CRATE_5107, new WorldPoint(3187, 9825, 0), "Search in the basement of the West Varrock bank."), new CrypticClue("Falo the bard wants to see you.", "Falo the Bard", new WorldPoint(2689, 3550, 0), "Speak to Falo the Bard located between Seer's Village and Rellekka. Southwest of fairy ring CJR."), new CrypticClue("Search a bookcase in the Wizards tower.", BOOKCASE_12539, new WorldPoint(3113, 3159, 0), "The bookcase located on the ground floor."), - new CrypticClue("Come have a cip with this great soot covered denizen.", "Miner Magnus", new WorldPoint(2527, 3891, 0), "Talk to Miner Magnus east of the fairy ring CIP. Answer: 8"), + new CrypticClue("Come have a cip with this great soot covered denizen.", "Miner Magnus", new WorldPoint(2527, 3891, 0), "Talk to Miner Magnus east of the fairy ring CIP. Answer: 8", "How many coal rocks are around here?"), new CrypticClue("Citric cellar.", "Heckel Funch", new WorldPoint(2490, 3488, 0), "Speak to Heckel Funch on the first floor in the Grand Tree."), new CrypticClue("I burn between heroes and legends.", "Candle maker", new WorldPoint(2799, 3438, 0), "Speak to the Candle maker in Catherby."), new CrypticClue("Speak to Sarah at Falador farm.", "Sarah", new WorldPoint(3038, 3292, 0), "Talk to Sarah at Falador farm, north of Port Sarim."), @@ -110,7 +110,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Dig between some ominous stones in Falador.", new WorldPoint(3040, 3399, 0), "Three standing stones inside a walled area. East of the northern Falador gate."), new CrypticClue("Speak to Rusty north of Falador.", "Rusty", new WorldPoint(2979, 3435, 0), "Rusty can be found northeast of Falador on the way to the Mind altar."), new CrypticClue("Search a wardrobe in Draynor.", WARDROBE_5622, new WorldPoint(3087, 3261, 0), "Go to Aggie's house and search the wardrobe in northern wall."), - new CrypticClue("I have many arms but legs, I have just one. I have little family but my seed you can grow on, I am not dead, yet I am but a spirit, and my power, on your quests, you will earn the right to free it.", NULL_1293, new WorldPoint(2544, 3170, 0), "Spirit Tree in Tree Gnome Village. Answer: 13112221"), + new CrypticClue("I have many arms but legs, I have just one. I have little family but my seed you can grow on, I am not dead, yet I am but a spirit, and my power, on your quests, you will earn the right to free it.", NULL_1293, new WorldPoint(2544, 3170, 0), "Spirit Tree in Tree Gnome Village. Answer: 13112221", "What is the next number in the sequence? 1, 11, 21, 1211, 111221, 312211"), new CrypticClue("I am the one who watches the giants. The giants in turn watch me. I watch with two while they watch with one. Come seek where I may be.", "Kamfreena", new WorldPoint(2845, 3539, 0), "Speak to Kamfreena on the top floor of the Warriors' Guild."), new CrypticClue("In a town where wizards are known to gather, search upstairs in a large house to the north.", "Man", 375, new WorldPoint(2593, 3108, 1), "Search the chest upstairs in the house north of Yanille Wizard's Guild. Kill a man for the key."), new CrypticClue("Probably filled with wizards socks.", "Wizard", DRAWERS_350, new WorldPoint(3116, 9562, 0), "Search the drawers in the basement of the Wizard's Tower south of Draynor Village. Kill one of the Wizards for the key. Fairy ring DIS"), @@ -138,7 +138,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("46 is my number. My body is the colour of burnt orange and crawls among those with eight. Three mouths I have, yet I cannot eat. My blinking blue eye hides my grave.", new WorldPoint(3170, 3885, 0), "Sapphire respawn in the Spider's Nest, lvl 46 Wilderness. Dig under the sapphire spawn."), new CrypticClue("Green is the colour of my death as the winter-guise, I swoop towards the ground.", new WorldPoint(2780, 3783, 0), "Players need to slide down to where Trollweiss grows on Trollweiss Mountain."), new CrypticClue("Talk to a party-goer in Falador.", "Lucy", new WorldPoint(3046, 3382, 0), "Lucy is the bartender on the first floor of the party room."), - new CrypticClue("He knows just how easy it is to lose track of time.", "Brother Kojo", new WorldPoint(2570, 3250, 0), "Speak to Brother Kojo in the Clock Tower. Answer: 22"), + new CrypticClue("He knows just how easy it is to lose track of time.", "Brother Kojo", new WorldPoint(2570, 3250, 0), "Speak to Brother Kojo in the Clock Tower. Answer: 22", "On a clock, how many times a day do the minute hand and the hour hand overlap?"), new CrypticClue("A great view - watch the rapidly drying hides get splashed. Check the box you are sitting on.", BOXES, new WorldPoint(2523, 3493, 1), "Almera's House north of Baxtorian Falls, search boxes on the first floor."), new CrypticClue("Search the Coffin in Edgeville.", COFFIN, new WorldPoint(3091, 3477, 0), "Search the coffin located by the Wilderness teleport lever."), new CrypticClue("When no weapons are at hand, then is the time to reflect. In Saradomin's name, redemption draws closer...", DRAWERS_350, new WorldPoint(2818, 3351, 0), "On Entrana, search the southern drawer in the house with the cooking range."), @@ -211,7 +211,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Great demons, dragons and spiders protect this blue rock, beneath which, you may find what you seek.", new WorldPoint(3045, 10265, 0), "Dig by the runite rock in the Lava Maze Dungeon"), new CrypticClue("My giant guardians below the market streets would be fans of rock and roll, if only they could grab hold of it. Dig near my green bubbles!", new WorldPoint(3161, 9904, 0), "Dig near the cauldron by Moss Giants under Varrock Sewers"), new CrypticClue("Varrock is where I reside, not the land of the dead, but I am so old, I should be there instead. Let's hope your reward is as good as it says, just 1 gold one and you can have it read.", "Gypsy Aris", new WorldPoint(3203, 3424, 0), "Talk to Gypsy Aris, West of varrock main square."), - new CrypticClue("Speak to a referee.", "Gnome ball referee", new WorldPoint(2386, 3487, 0), "Talk to a Gnome ball referee found on the Gnome ball field in the Gnome Stronghold. Answer: 5096"), + new CrypticClue("Speak to a referee.", "Gnome ball referee", new WorldPoint(2386, 3487, 0), "Talk to a Gnome ball referee found on the Gnome ball field in the Gnome Stronghold. Answer: 5096", "What is 57 x 89 + 23?"), new CrypticClue("This crate holds a better reward than a broken arrow.", CRATE_356, new WorldPoint(2671, 3437, 0), "Inside the Ranging Guild. Search the crate behind the northern most building."), new CrypticClue("Search the drawers in the house next to the Port Sarim mage shop.", DRAWERS, new WorldPoint(3024, 3259, 0), "House east of Betty's. Contains a cooking sink."), new CrypticClue("With a name like that, you'd expect a little more than just a few scimitars.", "Daga", new WorldPoint(2759, 2775, 0), "Speak to Daga on Ape Atoll."), @@ -300,7 +300,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Search the open crate found in the Hosidius kitchens.", CRATE_27533, new WorldPoint(1683, 3616, 0), "The kitchens are north-west of the town in Hosidius."), new CrypticClue("Dig under Ithoi's cabin.", new WorldPoint(2529, 2838, 0), "Dig under Ithoi's cabin in the Corsair Cove."), new CrypticClue("Search the drawers, upstairs in the bank to the East of Varrock.", DRAWERS_7194, new WorldPoint(3250, 3420, 1), "Search the drawers upstairs in Varrock east bank."), - new CrypticClue("Speak to Hazelmere.", "Hazelmere", new WorldPoint(2677, 3088, 1), "Located upstairs in the house to the north of fairy ring CLS. Answer: 6859"), + new CrypticClue("Speak to Hazelmere.", "Hazelmere", new WorldPoint(2677, 3088, 1), "Located upstairs in the house to the north of fairy ring CLS. Answer: 6859", "What is 19 to the power of 3?"), new CrypticClue("The effects of this fire are magnified.", new WorldPoint(1179, 3626, 0), "Dig by the fire beside Ket'sal K'uk in the westernmost part of the Kebos Swamp. "), new CrypticClue("Always walking around the castle grounds and somehow knows everyone's age.", "Hans", new WorldPoint(3221, 3218, 0), "Talk to Hans walking around Lumbridge Castle."), new CrypticClue("In the place Duke Horacio calls home, talk to a man with a hat dropped by goblins.", "Cook", new WorldPoint(3208, 3213, 0), "Talk to the Cook in Lumbridge Castle."), @@ -331,6 +331,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc private final int objectId; private final WorldPoint location; private final String solution; + private final String questionText; private CrypticClue(String text, WorldPoint location, String solution) { @@ -339,21 +340,37 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc private CrypticClue(String text, int objectId, WorldPoint location, String solution) { - this(text, null, objectId, location, solution); + this(text, null, objectId, location, solution, ""); } private CrypticClue(String text, String npc, WorldPoint location, String solution) { - this(text, npc, -1, location, solution); + this(text, npc, -1, location, solution, ""); + } + + private CrypticClue(String text, int objectId, WorldPoint location, String solution, String questionText) + { + this(text, null, objectId, location, solution, questionText); + } + + private CrypticClue(String text, String npc, WorldPoint location, String solution, String questionText) + { + this(text, npc, -1, location, solution, questionText); } private CrypticClue(String text, String npc, int objectId, WorldPoint location, String solution) + { + this(text, npc, objectId, location, solution, ""); + } + + private CrypticClue(String text, String npc, int objectId, WorldPoint location, String solution, String questionText) { this.text = text; this.npc = npc; this.objectId = objectId; this.location = location; this.solution = solution; + this.questionText = questionText; setRequiresSpade(getLocation() != null && getNpc() == null && objectId == -1); } @@ -442,7 +459,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc { for (CrypticClue clue : CLUES) { - if (clue.text.equalsIgnoreCase(text)) + if (clue.text.equalsIgnoreCase(text) || clue.questionText.equalsIgnoreCase(text)) { return clue; } From 46fe675ff6813cfb64e3ef02aa5a02be5983944c Mon Sep 17 00:00:00 2001 From: OpenOSRS <55961530+OpenOSRS@users.noreply.github.com> Date: Fri, 18 Oct 2019 07:41:09 +0200 Subject: [PATCH 019/185] Client: Update NPC stats (#1808) --- runelite-client/src/main/resources/npc_stats.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/resources/npc_stats.json b/runelite-client/src/main/resources/npc_stats.json index 4adbed73a3..aba35e940b 100644 --- a/runelite-client/src/main/resources/npc_stats.json +++ b/runelite-client/src/main/resources/npc_stats.json @@ -1 +1 @@ -{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"slayerLevel":1,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"undead":true},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"99":{"name":"Death wing","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"241":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"242":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"243":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"244":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"245":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"246":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"293":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"294":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"295":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"undead":true},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"466":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"467":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"468":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"473":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"474":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"508":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"509":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"510":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"511":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"512":{"name":"Chaos druid","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,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"518":{"name":"Rogue","hitpoints":17,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"522":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"523":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"524":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"525":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"681":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"720":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"721":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"722":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"723":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"724":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"725":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"726":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"727":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"728":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"slayerLevel":1,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":15,"magic":70},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"undead":true},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22,"undead":true},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"undead":true},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":22,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"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":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1118":{"name":"Man","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"slayerLevel":1,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"slayerLevel":1,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":4,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"slayerLevel":1,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26,"undead":true},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42,"poisonImmune":true},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"slayerLevel":1,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85,"undead":true},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"slayerLevel":1,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1402":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1403":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1404":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1407":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1408":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"slayerLevel":1},"1494":{"name":"Kebbit","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"stab":12,"crush":65,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slash":103,"crush":95,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":75,"slash":75,"crush":75,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4},"1736":{"name":"Brawler","hitpoints":97,"combatLevel":101,"attackSpeed":4},"1737":{"name":"Brawler","hitpoints":113,"combatLevel":129,"attackSpeed":4},"1738":{"name":"Brawler","hitpoints":143,"combatLevel":158,"attackSpeed":4},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":50,"combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":50,"combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1872":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":24,"combatLevel":23,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2058":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2059":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"crush":22,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2143":{"name":"Sraracha","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50,"undead":true},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"slayerLevel":1,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"slayerLevel":1,"attackSpeed":6,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"slayerLevel":1,"attackSpeed":6,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stab":11,"slash":11,"crush":11,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"crush":16,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"slayerLevel":1,"attackSpeed":6,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"slayerLevel":1,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"slayerLevel":1,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"slayerLevel":1,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2504":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2505":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2506":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2527":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2528":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2529":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2530":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2531":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2532":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2533":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2534":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2694":{"name":"Sheep","hitpoints":7,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2885":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"2886":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"2887":{"name":"Asyff","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"2892":{"name":"Brian","hitpoints":27,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stab":11,"slashDef":3,"crushDef":2,"bonusStrength":12},"2916":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"slayerLevel":1,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"undead":true},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"slayerLevel":1,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3078":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3079":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3080":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3081":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3082":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3083":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3084":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3085":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3086":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3087":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3088":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3092":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3093":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3094":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3096":{"name":"Barbarian","combatLevel":7},"3097":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":3,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3098":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3100":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3101":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3102":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3103":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":10,"slash":10,"crush":10,"range":10,"magic":10,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3104":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3105":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3106":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3108":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3112":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14,"demon":true},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20,"demon":true},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"slayerLevel":1,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10,"demon":true},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"slayerLevel":1,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3200":{"name":"Arhein","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3245":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3251":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"3252":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"3255":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3256":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3259":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"3260":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3266":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3267":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","combatLevel":22,"slayerLevel":1,"attackSpeed":4,"undead":true},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true,"undead":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20},"4044":{"name":"Pirate","hitpoints":20},"4045":{"name":"Pirate","hitpoints":20},"4046":{"name":"Pirate","hitpoints":20},"4047":{"name":"Pirate","hitpoints":20},"4048":{"name":"Pirate","hitpoints":20},"4049":{"name":"Pirate","hitpoints":20},"4050":{"name":"Pirate","hitpoints":20},"4051":{"name":"Pirate","hitpoints":20},"4052":{"name":"Pirate","hitpoints":20},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4088":{"name":"Soldier","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"magicLevel":1,"stabDef":15,"slashDef":23,"crushDef":21,"rangeDef":14,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4163":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","combatLevel":81,"attackSpeed":4},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","combatLevel":75,"attackSpeed":4},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15,"undead":true},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4958":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":7,"combatLevel":27,"demon":true},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50,"undead":true},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"slayerLevel":1,"attackSpeed":6},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35,"undead":true},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35,"undead":true},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15,"undead":true},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":64,"combatLevel":31,"slayerLevel":1,"attackSpeed":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270,"poisonImmune":true,"venomImmune":true},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30,"undead":true},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30,"undead":true},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30,"undead":true},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"slayerLevel":1,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5648":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5649":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5650":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5651":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5652":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5653":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5654":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5655":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5873":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5947":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5961":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5963":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":3,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":157,"combatLevel":292,"slayerLevel":1,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":10,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"stab":100,"slash":100,"crush":100,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":198,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320,"demon":true},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220,"demon":true},"6328":{"name":"King Roald (hard)","hitpoints":150,"combatLevel":188,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"slayerLevel":1,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"6389":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":3,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"slayerLevel":1,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"slayerLevel":1,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"slayerLevel":1,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40,"undead":true},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"slayerLevel":1,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"slayerLevel":1,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"slayerLevel":1,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"slayerLevel":1,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"slayerLevel":1,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stab":57,"slashDef":23,"crushDef":22,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":137,"combatLevel":145,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":98,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180,"undead":true},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210,"undead":true},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"slayerLevel":1,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"slayerLevel":1,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"slayerLevel":1,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"magicDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"slayerLevel":1,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6816":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6817":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6818":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6819":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6820":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6821":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6822":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4},"7027":{"name":"Reanimated giant","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":5},"7029":{"name":"Reanimated elf","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7030":{"name":"Reanimated troll","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7031":{"name":"Reanimated horror","hitpoints":35,"slayerLevel":58,"attackSpeed":4},"7032":{"name":"Reanimated kalphite","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4},"7037":{"name":"Reanimated aviansie","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"dragon":true},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"slayerLevel":1,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1,"demon":true},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1,"demon":true},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"demon":true},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"demon":true},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"slayerLevel":1,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"slayerLevel":1,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"slayerLevel":1,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"undead":true},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":109,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"undead":true},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"slayerLevel":1,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"demon":true},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85,"undead":true},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"slayerLevel":1,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true,"demon":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7288":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7290":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7292":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7294":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"undead":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true,"undead":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true,"undead":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true,"undead":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true,"undead":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true,"demon":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"demon":true},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"stabDef":65,"slashDef":80,"crushDef":100,"rangeDef":400,"magicDef":80,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7573":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7604":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7658":{"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":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"slayerLevel":1,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"slayerLevel":1,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"stab":45,"slash":45,"crush":45,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stab":25,"slash":25,"crush":25,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stab":40,"slash":40,"crush":40,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"crush":300,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170,"dragon":true},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stab":50,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":30},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"slayerLevel":1,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5,"undead":true},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"7921":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7922":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"slayerLevel":1,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12,"undead":true},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15,"undead":true},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24,"undead":true},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64,"undead":true},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40,"undead":true},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24,"undead":true},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"slayerLevel":1,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55,"undead":true},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"slayerLevel":1,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60,"undead":true},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50,"undead":true},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"slayerLevel":1,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35,"undead":true},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4,"undead":true},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8428":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8429":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8430":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160,"dragon":true},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9026":{"name":"Crystalline Rat","combatLevel":24,"attackSpeed":4},"9028":{"name":"Crystalline Bat","combatLevel":33,"attackSpeed":4},"9029":{"name":"Crystalline Unicorn","combatLevel":48,"attackSpeed":4},"9030":{"name":"Crystalline Scorpion","combatLevel":64,"attackSpeed":4},"9031":{"name":"Crystalline Wolf","combatLevel":74,"attackSpeed":4},"9032":{"name":"Crystalline Bear","combatLevel":172,"attackSpeed":4},"9033":{"name":"Crystalline Dragon","combatLevel":172,"attackSpeed":4},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9040":{"name":"Corrupted Rat","combatLevel":34,"attackSpeed":4},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4},"9043":{"name":"Corrupted Unicorn","combatLevel":64,"attackSpeed":4},"9044":{"name":"Corrupted Scorpion","combatLevel":89,"attackSpeed":4},"9045":{"name":"Corrupted Wolf","combatLevel":102,"attackSpeed":4},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9047":{"name":"Corrupted Dragon","combatLevel":258,"attackSpeed":4},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9246":{"name":"Arianwyn (hard)","hitpoints":300,"combatLevel":368,"attackSpeed":5,"defenceLevel":102,"rangeLevel":552,"magicLevel":153,"range":126,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":260},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":550,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"9282":{"name":"Basilisk Youngling","hitpoints":60,"combatLevel":57,"slayerLevel":40,"attackSpeed":4,"attackLevel":25,"strengthLevel":40,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"9287":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9288":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9289":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true}} \ No newline at end of file +{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"slayerLevel":1,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"undead":true},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"99":{"name":"Death wing","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"241":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"242":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"243":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"244":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"245":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"246":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"293":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"294":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"295":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"undead":true},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"466":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"467":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"468":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"473":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"474":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"508":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"509":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"510":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"511":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"512":{"name":"Chaos druid","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,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"518":{"name":"Rogue","hitpoints":17,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"522":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"523":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"524":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"525":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"681":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"720":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"721":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"722":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"723":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"724":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"725":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"726":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"727":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"728":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"slayerLevel":1,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":15,"magic":70},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"undead":true},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22,"undead":true},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"undead":true},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":22,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"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":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1118":{"name":"Man","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"slayerLevel":1,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"slayerLevel":1,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":4,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"slayerLevel":1,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26,"undead":true},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42,"poisonImmune":true},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"slayerLevel":1,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85,"undead":true},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"slayerLevel":1,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1402":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1403":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1404":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1407":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1408":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"slayerLevel":1},"1494":{"name":"Kebbit","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"stab":12,"crush":65,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slash":103,"crush":95,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":75,"slash":75,"crush":75,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4},"1736":{"name":"Brawler","hitpoints":97,"combatLevel":101,"attackSpeed":4},"1737":{"name":"Brawler","hitpoints":113,"combatLevel":129,"attackSpeed":4},"1738":{"name":"Brawler","hitpoints":143,"combatLevel":158,"attackSpeed":4},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":50,"combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":50,"combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1872":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":24,"combatLevel":23,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2058":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2059":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"crush":22,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2143":{"name":"Sraracha","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50,"undead":true},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"slayerLevel":1,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"slayerLevel":1,"attackSpeed":6,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"slayerLevel":1,"attackSpeed":6,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stab":11,"slash":11,"crush":11,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"crush":16,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"slayerLevel":1,"attackSpeed":6,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"slayerLevel":1,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"slayerLevel":1,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"slayerLevel":1,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2504":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2505":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2506":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2527":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2528":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2529":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2530":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2531":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2532":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2533":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2534":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2694":{"name":"Sheep","hitpoints":7,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2885":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"2886":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"2887":{"name":"Asyff","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"2892":{"name":"Brian","hitpoints":27,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stab":11,"slashDef":3,"crushDef":2,"bonusStrength":12},"2916":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"slayerLevel":1,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"undead":true},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"slayerLevel":1,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3078":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3079":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3080":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3081":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3082":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3083":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3084":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3085":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3086":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3087":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3088":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3092":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3093":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3094":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3096":{"name":"Barbarian","combatLevel":7},"3097":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":3,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3098":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3100":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3101":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3102":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3103":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":10,"slash":10,"crush":10,"range":10,"magic":10,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3104":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3105":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3106":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3108":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3112":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14,"demon":true},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20,"demon":true},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"slayerLevel":1,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10,"demon":true},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"slayerLevel":1,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3200":{"name":"Arhein","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3245":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3251":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"3252":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"3255":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3256":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3259":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"3260":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3266":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3267":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","combatLevel":22,"slayerLevel":1,"attackSpeed":4,"undead":true},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true,"undead":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20},"4044":{"name":"Pirate","hitpoints":20},"4045":{"name":"Pirate","hitpoints":20},"4046":{"name":"Pirate","hitpoints":20},"4047":{"name":"Pirate","hitpoints":20},"4048":{"name":"Pirate","hitpoints":20},"4049":{"name":"Pirate","hitpoints":20},"4050":{"name":"Pirate","hitpoints":20},"4051":{"name":"Pirate","hitpoints":20},"4052":{"name":"Pirate","hitpoints":20},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4088":{"name":"Soldier","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"magicLevel":1,"stabDef":15,"slashDef":23,"crushDef":21,"rangeDef":14,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4163":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","combatLevel":81,"attackSpeed":4},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","combatLevel":75,"attackSpeed":4},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15,"undead":true},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4958":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":7,"combatLevel":27,"demon":true},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50,"undead":true},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"slayerLevel":1,"attackSpeed":6},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35,"undead":true},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35,"undead":true},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15,"undead":true},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":64,"combatLevel":31,"slayerLevel":1,"attackSpeed":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270,"poisonImmune":true,"venomImmune":true},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30,"undead":true},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30,"undead":true},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30,"undead":true},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"slayerLevel":1,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5648":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5649":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5650":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5651":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5652":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5653":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5654":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5655":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5873":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5947":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5961":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5963":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":3,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":157,"combatLevel":292,"slayerLevel":1,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":10,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"stab":100,"slash":100,"crush":100,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":198,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320,"demon":true},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220,"demon":true},"6328":{"name":"King Roald (hard)","hitpoints":150,"combatLevel":188,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"slayerLevel":1,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"6389":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":3,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"slayerLevel":1,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"slayerLevel":1,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"slayerLevel":1,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40,"undead":true},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"slayerLevel":1,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"slayerLevel":1,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"slayerLevel":1,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"slayerLevel":1,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"slayerLevel":1,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stab":57,"slashDef":23,"crushDef":22,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":137,"combatLevel":145,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":98,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180,"undead":true},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210,"undead":true},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"slayerLevel":1,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"slayerLevel":1,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"slayerLevel":1,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"magicDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"slayerLevel":1,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6816":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6817":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6818":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6819":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6820":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6821":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6822":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4},"7027":{"name":"Reanimated giant","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":5},"7029":{"name":"Reanimated elf","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7030":{"name":"Reanimated troll","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7031":{"name":"Reanimated horror","hitpoints":35,"slayerLevel":58,"attackSpeed":4},"7032":{"name":"Reanimated kalphite","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4},"7037":{"name":"Reanimated aviansie","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"dragon":true},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"slayerLevel":1,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1,"demon":true},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1,"demon":true},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"demon":true},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"demon":true},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"slayerLevel":1,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"slayerLevel":1,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"slayerLevel":1,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"undead":true},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":109,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"undead":true},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"slayerLevel":1,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"demon":true},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85,"undead":true},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"slayerLevel":1,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true,"demon":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7288":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7290":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7292":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7294":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"undead":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true,"undead":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true,"undead":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true,"undead":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true,"undead":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true,"demon":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"demon":true},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"stabDef":65,"slashDef":80,"crushDef":100,"rangeDef":400,"magicDef":80,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7573":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7604":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7658":{"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":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"slayerLevel":1,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"slayerLevel":1,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"stab":45,"slash":45,"crush":45,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stab":25,"slash":25,"crush":25,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stab":40,"slash":40,"crush":40,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"crush":300,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170,"dragon":true},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stab":50,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":30},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"slayerLevel":1,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5,"undead":true},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"7921":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7922":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"slayerLevel":1,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12,"undead":true},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15,"undead":true},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24,"undead":true},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64,"undead":true},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40,"undead":true},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24,"undead":true},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"slayerLevel":1,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55,"undead":true},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"slayerLevel":1,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60,"undead":true},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50,"undead":true},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"slayerLevel":1,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35,"undead":true},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4,"undead":true},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8428":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8429":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8430":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160,"dragon":true},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9026":{"name":"Crystalline Rat","combatLevel":24,"attackSpeed":4},"9028":{"name":"Crystalline Bat","combatLevel":33,"attackSpeed":4},"9029":{"name":"Crystalline Unicorn","combatLevel":48,"attackSpeed":4},"9030":{"name":"Crystalline Scorpion","combatLevel":64,"attackSpeed":4},"9031":{"name":"Crystalline Wolf","combatLevel":74,"attackSpeed":4},"9032":{"name":"Crystalline Bear","combatLevel":172,"attackSpeed":4},"9033":{"name":"Crystalline Dragon","combatLevel":172,"attackSpeed":4},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9040":{"name":"Corrupted Rat","combatLevel":34,"attackSpeed":4},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4},"9043":{"name":"Corrupted Unicorn","combatLevel":64,"attackSpeed":4},"9044":{"name":"Corrupted Scorpion","combatLevel":89,"attackSpeed":4},"9045":{"name":"Corrupted Wolf","combatLevel":102,"attackSpeed":4},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9047":{"name":"Corrupted Dragon","combatLevel":258,"attackSpeed":4},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9246":{"name":"Arianwyn (hard)","hitpoints":300,"combatLevel":368,"attackSpeed":5,"defenceLevel":102,"rangeLevel":552,"magicLevel":153,"range":126,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":260},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":520,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"9282":{"name":"Basilisk Youngling","hitpoints":60,"combatLevel":57,"slayerLevel":40,"attackSpeed":4,"attackLevel":25,"strengthLevel":40,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"9287":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9288":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9289":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true}} \ No newline at end of file From 9b569f850638d44486c8f4c9d9f417937a57f6b0 Mon Sep 17 00:00:00 2001 From: dekvall Date: Fri, 18 Oct 2019 15:52:41 +0200 Subject: [PATCH 020/185] skill calc: clear combined action slot on skill change It doesn't make much sense to combine actions across skills. --- .../client/plugins/skillcalculator/SkillCalculator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index e2114a6a95..7e69b798d2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -1,4 +1,4 @@ -/* +/** * Copyright (c) 2018, Kruithne * Copyright (c) 2018, Psikoi * All rights reserved. @@ -129,6 +129,9 @@ class SkillCalculator extends JPanel // Clear the search bar searchBar.setText(null); + // Clear the combined action slots + clearCombinedSlots(); + // Add in checkboxes for available skill bonuses. renderBonusOptions(); From a7657f46b6d047e1f537c4a564cc2774c9ea3bcc Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Mon, 30 Sep 2019 14:25:03 -0400 Subject: [PATCH 021/185] world map: correct waterbirth ship transportation icon --- .../client/plugins/worldmap/TransportationPointLocation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java index 3bbe10826a..c49e7edad5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java @@ -69,11 +69,11 @@ enum TransportationPointLocation PORTSARIM_TO_PEST_CONTROL("Ship to Pest Control", new WorldPoint(3039, 3201, 0), new WorldPoint(2659, 2675, 0)), RELLEKKA_TO_JATIZSO_NEITIZNOT("Ship to Jatizso/Neitiznot", new WorldPoint(2639, 3710, 0)), RELLEKKA_TO_MISCELLANIA("Ship to Miscellania", new WorldPoint(2627, 3692, 0), new WorldPoint(2579, 3846, 0)), - RELLEKKA_TO_WATERBIRTH("Ship to Waterbirth", new WorldPoint(2621, 3683, 0), new WorldPoint(2549, 3758, 0)), + RELLEKKA_TO_WATERBIRTH("Ship to Waterbirth", new WorldPoint(2618, 3685, 0), new WorldPoint(2549, 3758, 0)), RELLEKKA_TO_WEISS_ICEBERG("Ship to Weiss/Iceberg", new WorldPoint(2707, 3735, 0)), RELLEKKA_TO_UNGAEL("Ship to Ungael", new WorldPoint(2638, 3698, 0), new WorldPoint(2276, 4034, 0)), RIMMINGTON_TO_CORSAIR_COVE("Ship to Corsair Cove", new WorldPoint(2909, 3227, 0 ), new WorldPoint(2577, 2839, 0)), - WATERBIRTH_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2549, 3758, 0), new WorldPoint(2621, 3683, 0)), + WATERBIRTH_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2549, 3758, 0), new WorldPoint(2618, 3685, 0)), WEISS_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2847, 3967, 0), new WorldPoint(2707, 3735, 0)), UNGAEL_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2276, 4034, 0), new WorldPoint(2638, 3698, 0)), From 9f3ae20fee4365fcc4e06e767823c434f294b917 Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Mon, 30 Sep 2019 14:33:48 -0400 Subject: [PATCH 022/185] world map: correct pirates' cove ship transportation icon --- .../client/plugins/worldmap/TransportationPointLocation.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java index c49e7edad5..bbf1d9f763 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java @@ -58,7 +58,7 @@ enum TransportationPointLocation NEITIZNOT_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2310, 3779, 0), new WorldPoint(2639, 3710, 0)), PESTCONTROL_TO_PORTSARIM("Ship to Port Sarim", new WorldPoint(2659, 2675, 0), new WorldPoint(3039, 3201, 0)), PIRATES_COVE_TO_LUNAR_ISLE("Ship to Lunar Isle", new WorldPoint(2223, 3796, 0), new WorldPoint(2137, 3899, 0)), - PIRATES_COVE_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2212, 3794, 0), new WorldPoint(2656, 3680, 0)), + PIRATES_COVE_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2212, 3794, 0), new WorldPoint(2620, 3695, 0)), PORT_PHASMATYS_TO_DRAGONTOOTH("Ship to Dragontooth Island", new WorldPoint(3703, 3487, 0), new WorldPoint(3791, 3561, 0)), PORT_PHASMATYS_TO_HARMLESS("Ship to Mos Le'Harmless", new WorldPoint(3709, 3497, 0), new WorldPoint(3682, 2951, 0)), PORT_PISCARILIUS_TO_PORTSARIM_LANDSEND("Ship to Port Sarim/Land's End", new WorldPoint(1823, 3692, 0)), @@ -69,6 +69,7 @@ enum TransportationPointLocation PORTSARIM_TO_PEST_CONTROL("Ship to Pest Control", new WorldPoint(3039, 3201, 0), new WorldPoint(2659, 2675, 0)), RELLEKKA_TO_JATIZSO_NEITIZNOT("Ship to Jatizso/Neitiznot", new WorldPoint(2639, 3710, 0)), RELLEKKA_TO_MISCELLANIA("Ship to Miscellania", new WorldPoint(2627, 3692, 0), new WorldPoint(2579, 3846, 0)), + RELLEKKA_TO_PIRATES_COVE("Ship to Pirates' Cove", new WorldPoint(2620, 3695, 0), new WorldPoint(2212, 3794, 0)), RELLEKKA_TO_WATERBIRTH("Ship to Waterbirth", new WorldPoint(2618, 3685, 0), new WorldPoint(2549, 3758, 0)), RELLEKKA_TO_WEISS_ICEBERG("Ship to Weiss/Iceberg", new WorldPoint(2707, 3735, 0)), RELLEKKA_TO_UNGAEL("Ship to Ungael", new WorldPoint(2638, 3698, 0), new WorldPoint(2276, 4034, 0)), From 228001a3141ee29d74097fe7a6429c99c6f665ba Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Mon, 30 Sep 2019 14:52:55 -0400 Subject: [PATCH 023/185] world map: correct lunar diplomacy quest start icon --- .../runelite/client/plugins/worldmap/QuestStartLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java index 1100d22f9f..ea89d808a0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java @@ -117,7 +117,7 @@ enum QuestStartLocation LEGENDS_QUEST(Quest.LEGENDS_QUEST, new WorldPoint(2725, 3367, 0)), LOST_CITY(Quest.LOST_CITY, new WorldPoint(3149, 3205, 0)), THE_LOST_TRIBE(Quest.THE_LOST_TRIBE, new WorldPoint(3211, 3224, 0)), - LUNAR_DIPLOMACY(Quest.LUNAR_DIPLOMACY, new WorldPoint(2619, 3689, 0)), + LUNAR_DIPLOMACY(Quest.LUNAR_DIPLOMACY, new WorldPoint(2618, 3691, 0)), MAKING_FRIENDS_WITH_MY_ARM(Quest.MAKING_FRIENDS_WITH_MY_ARM, new WorldPoint(2904, 10092, 0)), MAKING_HISTORY(Quest.MAKING_HISTORY, new WorldPoint(2435, 3346, 0)), MONKS_FRIEND(Quest.MONKS_FRIEND, new WorldPoint(2605, 3209, 0)), From 075d4addc110b50b54cb44e038f1362d9b5bb5be Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Wed, 2 Oct 2019 08:22:33 -0400 Subject: [PATCH 024/185] world map: add island of stone ship transport icon --- .../client/plugins/worldmap/TransportationPointLocation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java index bbf1d9f763..47867f22bd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java @@ -48,6 +48,7 @@ enum TransportationPointLocation FISHINGPLAT_TO_ARDOUGNE("Ship to Ardougne", new WorldPoint(2779, 3271, 0), new WorldPoint(2722, 3304, 0)), HARMLESS_TO_PORT_PHASMATYS("Ship to Port Phasmatys", new WorldPoint(3682, 2951, 0), new WorldPoint(3709, 3497, 0)), ICEBERG_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2657, 3988, 0), new WorldPoint(2707, 3735, 0)), + ISLAND_OF_STONE_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2470, 3994, 0), new WorldPoint(2621, 3692, 0)), ISLAND_TO_APE_ATOLL("Ship to Ape Atoll", new WorldPoint(2891, 2726, 0), new WorldPoint(2802, 2706, 0)), JATIZSO_TO_RELLEKKA("Ship to Rellekka", new WorldPoint(2420, 3780, 0), new WorldPoint(2639, 3710, 0)), KARAMJA_TO_PORT_SARIM("Ship to Port Sarim", new WorldPoint(2955, 3144, 0), new WorldPoint(3029, 3218, 0)), From c71b8ae5df2467047990b94f66145d5491792b3e Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Fri, 18 Oct 2019 19:08:53 -0400 Subject: [PATCH 025/185] quest: add fremennik exiles quest to enum --- runelite-api/src/main/java/net/runelite/api/Quest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Quest.java b/runelite-api/src/main/java/net/runelite/api/Quest.java index ec40bcec01..70b9767a16 100644 --- a/runelite-api/src/main/java/net/runelite/api/Quest.java +++ b/runelite-api/src/main/java/net/runelite/api/Quest.java @@ -176,6 +176,7 @@ public enum Quest THE_ASCENT_OF_ARCEUUS(542, "The Ascent of Arceuus"), THE_FORSAKEN_TOWER(543, "The Forsaken Tower"), SONG_OF_THE_ELVES(603, "Song of the Elves"), + THE_FREMENNIK_EXILES(718, "The Fremennik Exiles"), //Miniquests ENTER_THE_ABYSS(319, "Enter the Abyss"), From 65b9150b0e117817afe1d43e2064392df22983fd Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Fri, 18 Oct 2019 19:09:58 -0400 Subject: [PATCH 026/185] world map: add fremennik exiles quest start --- .../net/runelite/client/plugins/worldmap/QuestStartLocation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java index ea89d808a0..459abf02e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java @@ -96,6 +96,7 @@ enum QuestStartLocation THE_FORSAKEN_TOWER(Quest.THE_FORSAKEN_TOWER, new WorldPoint(1484, 3747, 0)), THE_FREMENNIK_ISLES(Quest.THE_FREMENNIK_ISLES, new WorldPoint(2645, 3711, 0)), THE_FREMENNIK_TRIALS(Quest.THE_FREMENNIK_TRIALS, new WorldPoint(2657, 3669, 0)), + THE_FREMENNIK_EXILES(Quest.THE_FREMENNIK_EXILES, new WorldPoint(2658, 3669, 0)), GARDEN_OF_TRANQUILLITY(Quest.GARDEN_OF_TRANQUILLITY, new WorldPoint(3227, 3477, 0)), GERTRUDES_CAT_RATCATCHERS(Quest.GERTRUDES_CAT, new WorldPoint(3150, 3411, 0)), GHOSTS_AHOY(Quest.GHOSTS_AHOY, new WorldPoint(3677, 3510, 0)), From 256617c5a6bc549ac9430fb70bbe38a590eb6032 Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Sat, 19 Oct 2019 00:12:16 +0000 Subject: [PATCH 027/185] project: Update gradle wrapper --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca9d62814a..3a54a3332e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 45c8da0adb82c4dde2d3a033a1774eb934f5c7b8 Mon Sep 17 00:00:00 2001 From: SebastiaanVanspauwen <43320258+SebastiaanVanspauwen@users.noreply.github.com> Date: Sat, 19 Oct 2019 02:57:59 +0200 Subject: [PATCH 028/185] timers plugin: update full teleblock text --- .../java/net/runelite/client/plugins/timers/TimersPlugin.java | 2 +- .../net/runelite/client/plugins/timers/TimersPluginTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java index b84d987c8f..57cf7fa633 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java @@ -108,7 +108,7 @@ public class TimersPlugin extends Plugin private static final String PRAYER_ENHANCE_EXPIRED = "Your prayer enhance effect has worn off."; private static final Pattern DEADMAN_HALF_TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you by (.+)\\. It will expire in 1 minute, 15 seconds\\."); - private static final Pattern FULL_TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you by (.+)\\. It will expire in 5 minutes, 0 seconds\\."); + private static final Pattern FULL_TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you by (.+)\\. It will expire in 5 minutes\\."); private static final Pattern HALF_TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you by (.+)\\. It will expire in 2 minutes, 30 seconds\\."); private static final Pattern DIVINE_POTION_PATTERN = Pattern.compile("You drink some of your divine (.+) potion\\."); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java index f9ba35154d..618ad296c1 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java @@ -51,7 +51,7 @@ import org.mockito.runners.MockitoJUnitRunner; public class TimersPluginTest { private static final String DMM_HALF_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you by Runelite. It will expire in 1 minute, 15 seconds."; - private static final String FULL_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you by Runelite. It will expire in 5 minutes, 0 seconds."; + private static final String FULL_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you by Runelite. It will expire in 5 minutes."; private static final String HALF_TELEBLOCK_MESSAGE = "A Tele Block spell has been cast on you by Runelite. It will expire in 2 minutes, 30 seconds."; @Inject From 496c11e011d791c12448269f36962607896fe116 Mon Sep 17 00:00:00 2001 From: Nathaniel Pather <12907920+NathanielPather@users.noreply.github.com> Date: Sat, 19 Oct 2019 11:17:08 +1000 Subject: [PATCH 029/185] clues: add Island of Stone location descriptor --- .../client/plugins/cluescrolls/clues/CoordinateClue.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index 039e70770c..3d833104d7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -168,6 +168,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(3051, 3736, 0), "East of the Wilderness Obelisk in 28 Wilderness.") .put(new WorldPoint(2316, 3814, 0), "West of Neitiznot, near the bridge.") .put(new WorldPoint(2872, 3937, 0), "Weiss.") + .put(new WorldPoint(2835, 2998, 0), "Northeast corner of the Island of Stone.") // Master .put(new WorldPoint(2178, 3209, 0), "South of Elf Camp.") .put(new WorldPoint(2155, 3100, 0), "South of Port Tyras (BJS).") From ed015888f4c9f12ec284cc97798872b3c2bcc84d Mon Sep 17 00:00:00 2001 From: 15987632 Date: Thu, 17 Oct 2019 22:39:46 -0400 Subject: [PATCH 030/185] widgets: fix wilderness level widget --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ea51c91626..81bfc752b9 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 @@ -739,7 +739,7 @@ public class WidgetID static final int KILLDEATH_RATIO = 33; static final int SKULL_CONTAINER = 53; static final int SAFE_ZONE = 55; - static final int WILDERNESS_LEVEL = 57; // this can also be the Deadman Mode "Protection" text + static final int WILDERNESS_LEVEL = 58; // this can also be the Deadman Mode "Protection" text } static class KourendFavour From ac27e8d17f734770514fbf4dbd1f5689a611783f Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Sat, 19 Oct 2019 03:16:05 +0100 Subject: [PATCH 031/185] loot tracker: rename price to gePrice --- .../client/plugins/loottracker/LootTrackerBox.java | 12 ++++++------ .../client/plugins/loottracker/LootTrackerItem.java | 2 +- .../client/plugins/loottracker/LootTrackerPanel.java | 2 +- .../plugins/loottracker/LootTrackerPlugin.java | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index 2e89f8af60..55892d8e34 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -261,7 +261,7 @@ class LootTrackerBox extends JPanel continue; } - totalPrice += entry.getPrice(); + totalPrice += entry.getGePrice(); int quantity = 0; for (final LootTrackerItem i : items) @@ -277,9 +277,9 @@ class LootTrackerBox extends JPanel if (quantity > 0) { int newQuantity = entry.getQuantity() + quantity; - long pricePerItem = entry.getPrice() == 0 ? 0 : (entry.getPrice() / entry.getQuantity()); + long gePricePerItem = entry.getGePrice() == 0 ? 0 : (entry.getGePrice() / entry.getQuantity()); - items.add(new LootTrackerItem(entry.getId(), entry.getName(), newQuantity, pricePerItem * newQuantity, entry.isIgnored())); + items.add(new LootTrackerItem(entry.getId(), entry.getName(), newQuantity, gePricePerItem * newQuantity, entry.isIgnored())); } else { @@ -287,7 +287,7 @@ class LootTrackerBox extends JPanel } } - items.sort((i1, i2) -> Long.compare(i2.getPrice(), i1.getPrice())); + items.sort((i1, i2) -> Long.compare(i2.getGePrice(), i1.getGePrice())); // Calculates how many rows need to be display to fit all items final int rowSize = ((items.size() % ITEMS_PER_ROW == 0) ? 0 : 1) + items.size() / ITEMS_PER_ROW; @@ -352,8 +352,8 @@ class LootTrackerBox extends JPanel { final String name = item.getName(); final int quantity = item.getQuantity(); - final long price = item.getPrice(); + final long gePrice = item.getGePrice(); final String ignoredLabel = item.isIgnored() ? " - Ignored" : ""; - return name + " x " + quantity + " (" + QuantityFormatter.quantityToStackSize(price) + ") " + ignoredLabel; + return name + " x " + quantity + " (" + QuantityFormatter.quantityToStackSize(gePrice) + ") " + ignoredLabel; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java index feb1504681..1ecf28a229 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java @@ -38,7 +38,7 @@ class LootTrackerItem @Getter private final int quantity; @Getter - private final long price; + private final long gePrice; @Getter @Setter private boolean ignored; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 9dc783bab8..a4f21447f5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -613,7 +613,7 @@ class LootTrackerPanel extends PluginPanel continue; } - overallGp += item.getPrice(); + overallGp += item.getGePrice(); } if (present > 0) 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 edec90e676..cc021c3650 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 @@ -636,14 +636,14 @@ public class LootTrackerPlugin extends Plugin { final ItemComposition itemComposition = itemManager.getItemComposition(itemId); final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemId; - final long price = (long) itemManager.getItemPrice(realItemId) * (long) quantity; + final long gePrice = (long) itemManager.getItemPrice(realItemId) * (long) quantity; final boolean ignored = ignoredItems.contains(itemComposition.getName()); return new LootTrackerItem( itemId, itemComposition.getName(), quantity, - price, + gePrice, ignored); } From d736dfb73e9e5852ec8342f3dd6c653715307b43 Mon Sep 17 00:00:00 2001 From: Desetude Date: Sat, 19 Oct 2019 03:58:07 +0100 Subject: [PATCH 032/185] Make the PvP kill/death counter moveable --- .../main/java/net/runelite/client/ui/overlay/WidgetOverlay.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index 17b43ce3d7..87a4de12ac 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -50,6 +50,7 @@ public class WidgetOverlay extends Overlay .put(WidgetInfo.PEST_CONTROL_INFO, OverlayPosition.TOP_LEFT) .put(WidgetInfo.ZEAH_MESS_HALL_COOKING_DISPLAY, OverlayPosition.TOP_LEFT) .put(WidgetInfo.PVP_BOUNTY_HUNTER_INFO, OverlayPosition.TOP_RIGHT) + .put(WidgetInfo.PVP_KILLDEATH_COUNTER, OverlayPosition.TOP_LEFT) .put(WidgetInfo.SKOTIZO_CONTAINER, OverlayPosition.TOP_LEFT) .put(WidgetInfo.KOUREND_FAVOUR_OVERLAY, OverlayPosition.TOP_CENTER) .put(WidgetInfo.PYRAMID_PLUNDER_DATA, OverlayPosition.TOP_CENTER) From 135a0a13188e9f94a8d5ac3791ce3af1e8c140f7 Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Sat, 19 Oct 2019 23:49:31 -0600 Subject: [PATCH 033/185] itemchargeconfig: fix basketcharge config --- .../plugins/itemcharges/ItemChargeConfig.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java index 405ecd6fa9..3d2c3d6cae 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java @@ -472,6 +472,17 @@ public interface ItemChargeConfig extends Config return true; } + @ConfigItem( + keyName = "showBasketCharges", + name = "Show Basket Quantity", + description = "Configures if the number of fruit in a basket is shown", + position = 26 + ) + default boolean showBasketCharges() + { + return true; + } + @ConfigItem( keyName = "showInfoboxes", name = "Show Infoboxes", @@ -482,4 +493,4 @@ public interface ItemChargeConfig extends Config { return false; } -} \ No newline at end of file +} From 5b8ee39b66247cea663feed7cea65b3e010caa46 Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Sat, 19 Oct 2019 23:50:27 -0600 Subject: [PATCH 034/185] itemchargeconfig: fix baskets/sack config add basket config and fix sack config --- .../runelite/client/plugins/itemcharges/ItemChargeConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java index 3d2c3d6cae..cf9c9758d4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java @@ -487,7 +487,7 @@ public interface ItemChargeConfig extends Config keyName = "showInfoboxes", name = "Show Infoboxes", description = "Configures whether to show an infobox equipped charge items", - position = 26 + position = 27 ) default boolean showInfoboxes() { From 100231d731a1fd79caceeb3ff0b06093e63c17dd Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Sat, 19 Oct 2019 23:51:17 -0600 Subject: [PATCH 035/185] itemchargeoverlay: add basket/fix sack add basket config and fix sack config --- .../client/plugins/itemcharges/ItemChargeOverlay.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java index e307aac089..79f8510ebb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java @@ -36,9 +36,11 @@ import static net.runelite.client.plugins.itemcharges.ItemChargeType.ABYSSAL_BRA import static net.runelite.client.plugins.itemcharges.ItemChargeType.BELLOWS; import static net.runelite.client.plugins.itemcharges.ItemChargeType.FUNGICIDE_SPRAY; import static net.runelite.client.plugins.itemcharges.ItemChargeType.IMPBOX; +import static net.runelite.client.plugins.itemcharges.ItemChargeType.SACK; import static net.runelite.client.plugins.itemcharges.ItemChargeType.TELEPORT; import static net.runelite.client.plugins.itemcharges.ItemChargeType.WATERCAN; import static net.runelite.client.plugins.itemcharges.ItemChargeType.WATERSKIN; +import static net.runelite.client.plugins.itemcharges.ItemChargeType.FRUIT_BASKET; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; import net.runelite.client.ui.overlay.components.TextComponent; @@ -160,6 +162,8 @@ class ItemChargeOverlay extends WidgetItemOverlay || (type == WATERCAN && !plugin.isShowWateringCanCharges()) || (type == WATERSKIN && !plugin.isShowWaterskinCharges()) || (type == BELLOWS && !plugin.isShowBellowCharges()) + || (type == FRUIT_BASKET && !plugin.isShowBasketCharges()) + || (type == SACK && !plugin.isShowSackCharges()) || (type == ABYSSAL_BRACELET && !plugin.isShowAbyssalBraceletCharges())) { return; @@ -180,7 +184,7 @@ class ItemChargeOverlay extends WidgetItemOverlay { return plugin.isShowTeleportCharges() || plugin.isShowDodgyCount() || plugin.isShowFungicideCharges() || plugin.isShowImpCharges() || plugin.isShowWateringCanCharges() || plugin.isShowWaterskinCharges() - || plugin.isShowBellowCharges() || plugin.isShowAbyssalBraceletCharges() || plugin.isShowExplorerRingCharges() + || plugin.isShowBellowCharges() || plugin.isShowBasketCharges() || plugin.isShowSackCharges() || plugin.isShowAbyssalBraceletCharges() || plugin.isShowExplorerRingCharges() || plugin.isShowRingOfForgingCount(); } -} \ No newline at end of file +} From 3c65ef82b7527a40190908b419fbc32644430167 Mon Sep 17 00:00:00 2001 From: Crystalknoct Date: Sat, 19 Oct 2019 23:52:12 -0600 Subject: [PATCH 036/185] itemchargeplugin: add basket/fix sack Add basket config and fix sack config. --- .../runelite/client/plugins/itemcharges/ItemChargePlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java index fb1c26dda6..9e6f412ff9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java @@ -956,6 +956,7 @@ public class ItemChargePlugin extends Plugin this.showXericTalismanCharges = config.showXericTalismanCharges(); this.showrecoil = config.showrecoil(); this.chronicle = config.chronicle(); + this.showBasketCharges = config.showBasketCharges(); this.showSackCharges = config.showSackCharges(); } } From 541af9084ce094abaefea1f5cad857bfe5fe275a Mon Sep 17 00:00:00 2001 From: Lotto Date: Sun, 20 Oct 2019 15:09:05 +0200 Subject: [PATCH 037/185] feed: use RuneLiteClient's Twitter list --- http-service/src/main/resources/application.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/http-service/src/main/resources/application.yaml b/http-service/src/main/resources/application.yaml index 3c6fc451fe..ce902b76cb 100644 --- a/http-service/src/main/resources/application.yaml +++ b/http-service/src/main/resources/application.yaml @@ -38,4 +38,4 @@ runelite: twitter: consumerkey: secretkey: - listid: 968949795153948673 \ No newline at end of file + listid: 1185897074786742273 \ No newline at end of file From 9321d6e64e1fed4d52b8bee51b709c9fe8384e7a Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 21 Oct 2019 08:54:34 -0400 Subject: [PATCH 038/185] achievement diary: remove requirements for Karamja hard kill a metal dragon task The listed requirements are optional due to the back entrance to the dungeon. --- .../achievementdiary/diaries/KaramjaDiaryRequirement.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java index f6523bc667..fc906cccb4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java @@ -120,9 +120,6 @@ public class KaramjaDiaryRequirement extends GenericDiaryRequirement new CombatLevelRequirement(100), new SkillRequirement(Skill.SLAYER, 50), new QuestRequirement(Quest.SHILO_VILLAGE)); - add("Kill a metal dragon in Brimhaven Dungeon.", - new SkillRequirement(Skill.AGILITY, 12), - new SkillRequirement(Skill.WOODCUTTING, 34)); // ELITE add("Craft 56 Nature runes at once.", From e9fd279a20fc74d8f7c18d592fa21b8599e9007c Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Mon, 21 Oct 2019 19:40:42 +0200 Subject: [PATCH 039/185] pluginsorter: Merge into OpenOSRS config and pull methods to the client --- .../client/config/OpenOSRSConfig.java | 240 ++++++++++++++++- .../runelite/client/plugins/PluginType.java | 1 - .../client/plugins/config/ConfigPanel.java | 87 ++++++- .../client/plugins/config/PluginListItem.java | 32 ++- .../plugins/openosrs/OpenOSRSPlugin.java | 59 ++--- .../pluginsorter/PluginSorterConfig.java | 245 ------------------ .../pluginsorter/PluginSorterPlugin.java | 178 +++---------- 7 files changed, 405 insertions(+), 437 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java diff --git a/runelite-client/src/main/java/net/runelite/client/config/OpenOSRSConfig.java b/runelite-client/src/main/java/net/runelite/client/config/OpenOSRSConfig.java index 9d9628c79b..9d9e7936a5 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/OpenOSRSConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/OpenOSRSConfig.java @@ -26,9 +26,30 @@ */ package net.runelite.client.config; +import java.awt.Color; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + @ConfigGroup("openosrs") public interface OpenOSRSConfig extends Config { + @Getter(AccessLevel.PUBLIC) + @AllArgsConstructor + enum SortStyle + { + CATEGORY("Category"), + ALPHABETICALLY("Alphabetically"); + + private String name; + + @Override + public String toString() + { + return getName(); + } + } + @ConfigTitleSection( keyName = "pluginsTitle", name = "Plugins", @@ -40,12 +61,215 @@ public interface OpenOSRSConfig extends Config return new Title(); } + @ConfigTitleSection( + keyName = "pluginSortingTitle", + name = "Sorting", + description = "", + position = 2, + titleSection = "pluginsTitle" + ) + default Title pluginSortingTitle() + { + return new Title(); + } + + @ConfigItem( + position = 3, + keyName = "pluginSortMode", + name = "Sorting mode", + description = "Sorts plugins ", + titleSection = "pluginSortingTitle" + ) + default SortStyle pluginSortMode() + { + return SortStyle.CATEGORY; + } + + @ConfigTitleSection( + keyName = "hidePluginsTitle", + name = "Hide By Type", + description = "", + position = 4, + titleSection = "pluginsTitle" + ) + default Title hidePluginsTitle() + { + return new Title(); + } + + @ConfigItem( + position = 5, + keyName = "hidePlugins", + name = "Hide All Plugins", + description = "Hides all OpenOSRS plugins if checked", + titleSection = "hidePluginsTitle", + hide = "hidePvmPlugins || hidePvpPlugins || hideSkillingPlugins || hideUtilityPlugins || hideExternalPlugins" + ) + default boolean hidePlugins() + { + return false; + } + + @ConfigItem( + position = 6, + keyName = "hideExternalPlugins", + name = "Hide External Plugins", + description = "Hides all OpenOSRS external plugins if checked", + titleSection = "hidePluginsTitle", + hide = "hidePlugins" + ) + default boolean hideExternalPlugins() + { + return false; + } + + @ConfigItem( + position = 7, + keyName = "hidePvmPlugins", + name = "Hide PvM Plugins", + description = "Hides all OpenOSRS PvM plugins if checked", + titleSection = "hidePluginsTitle", + hide = "hidePlugins" + ) + default boolean hidePvmPlugins() + { + return false; + } + + @ConfigItem( + position = 8, + keyName = "hideSkillingPlugins", + name = "Hide Skilling Plugins", + description = "Hides all OpenOSRS skilling plugins if checked", + titleSection = "hidePluginsTitle", + hide = "hidePlugins" + ) + default boolean hideSkillingPlugins() + { + return false; + } + + @ConfigItem( + position = 9, + keyName = "hidePvpPlugins", + name = "Hide PvP Plugins", + description = "Hides all OpenOSRS Pvp plugins if checked", + titleSection = "hidePluginsTitle", + hide = "hidePlugins" + ) + default boolean hidePvpPlugins() + { + return false; + } + + @ConfigItem( + position = 10, + keyName = "hideUtilityPlugins", + name = "Hide Utility Plugins", + description = "Hides all OpenOSRS utility plugins if checked", + titleSection = "hidePluginsTitle", + hide = "hidePlugins" + ) + default boolean hideUtilityPlugins() + { + return false; + } + + @ConfigTitleSection( + keyName = "pluginsColorTitle", + name = "Colors", + description = "", + position = 11, + titleSection = "pluginsTitle" + ) + default Title pluginsColorTitle() + { + return new Title(); + } + + @Alpha + @ConfigItem( + position = 12, + keyName = "externalColor", + name = "External color", + description = "Configure the color of external plugins", + titleSection = "pluginsColorTitle" + ) + default Color externalColor() + { + return new Color(177, 156, 217, 255); + } + + @Alpha + @ConfigItem( + position = 13, + keyName = "pvmColor", + name = "PVM color", + description = "Configure the color of PVM related plugins", + titleSection = "pluginsColorTitle" + ) + default Color pvmColor() + { + return new Color(119, 221, 119, 255); + } + + @Alpha + @ConfigItem( + position = 14, + keyName = "pvpColor", + name = "PVP color", + description = "Configure the color of PVP related plugins", + titleSection = "pluginsColorTitle" + ) + default Color pvpColor() + { + return new Color(255, 105, 97, 255); + } + + @Alpha + @ConfigItem( + position = 15, + keyName = "skillingColor", + name = "Skilling color", + description = "Configure the color of Skilling related plugins", + titleSection = "pluginsColorTitle" + ) + default Color skillingColor() + { + return new Color(252, 252, 100, 255); + } + + @Alpha + @ConfigItem( + position = 16, + keyName = "utilityColor", + name = "Utility color", + description = "Configure the color of Utility related plugins", + titleSection = "pluginsColorTitle" + ) + default Color utilityColor() + { + return new Color(144, 212, 237, 255); + } + + @ConfigTitleSection( + keyName = "externalPluginsTitle", + name = "External", + description = "", + position = 17, + titleSection = "pluginsTitle" + ) + default Title externalPluginsTitle() + { + return new Title(); + } + @ConfigItem( keyName = "enablePlugins", name = "Enable loading of external plugins", description = "Enable loading of external plugins", - position = 2, - titleSection = "pluginsTitle" + position = 18, + titleSection = "externalPluginsTitle" ) default boolean enablePlugins() { @@ -56,7 +280,7 @@ public interface OpenOSRSConfig extends Config keyName = "opacityTitle", name = "Opacity", description = "", - position = 3 + position = 19 ) default Title opacityTitle() { @@ -67,7 +291,7 @@ public interface OpenOSRSConfig extends Config keyName = "enableOpacity", name = "Enable opacity", description = "Enables opacity for the whole window.
NOTE: This only stays enabled if your pc supports this!", - position = 4, + position = 20, titleSection = "opacityTitle" ) default boolean enableOpacity() @@ -83,7 +307,7 @@ public interface OpenOSRSConfig extends Config keyName = "opacityPercentage", name = "Opacity percentage", description = "Changes the opacity of the window if opacity is enabled", - position = 5, + position = 21, titleSection = "opacityTitle" ) default int opacityPercentage() @@ -95,7 +319,7 @@ public interface OpenOSRSConfig extends Config keyName = "miscTitle", name = "Miscellaneous", description = "", - position = 6 + position = 22 ) default Title miscTitle() { @@ -106,7 +330,7 @@ public interface OpenOSRSConfig extends Config keyName = "keyboardPin", name = "Keyboard bank pin", description = "Enables you to type your bank pin", - position = 7, + position = 23, titleSection = "miscTitle" ) default boolean keyboardPin() @@ -118,7 +342,7 @@ public interface OpenOSRSConfig extends Config keyName = "detachHotkey", name = "Detach Cam", description = "Detach Camera hotkey, press this and it will activate detatched camera.", - position = 8, + position = 24, titleSection = "miscTitle" ) default Keybind detachHotkey() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginType.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginType.java index 6d9b568c11..93dc019e9f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginType.java @@ -8,6 +8,5 @@ public enum PluginType UTILITY, GENERAL_USE, EXTERNAL, - PLUGIN_ORGANIZER, IMPORTANT } 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 d9c8164ef8..18390bf0a1 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 @@ -26,6 +26,7 @@ package net.runelite.client.plugins.config; import com.google.common.base.Splitter; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import java.awt.BorderLayout; import java.awt.Color; @@ -45,6 +46,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; import java.util.List; @@ -105,6 +107,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginManager; +import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.DynamicGridLayout; import net.runelite.client.ui.FontManager; @@ -156,6 +159,9 @@ public class ConfigPanel extends PluginPanel private boolean showingPluginList = true; private int scrollBarPosition = 0; + private static final ImmutableList definedOrder = ImmutableList.of(PluginType.IMPORTANT, PluginType.EXTERNAL, PluginType.PVM, PluginType.SKILLING, PluginType.PVP, PluginType.UTILITY, PluginType.GENERAL_USE); + private static final Comparator categoryComparator = Comparator.comparing(plugin -> definedOrder.indexOf(plugin.getPluginType())); + static { final BufferedImage backIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "config_back_icon.png"); @@ -282,7 +288,7 @@ public class ConfigPanel extends PluginPanel // set OpenOSRS config on top, as it should always have been final PluginListItem openosrs = new PluginListItem(this, configManager, OpenOSRSConfig, configManager.getConfigDescriptor(OpenOSRSConfig), - openosrs_PLUGIN, "OpenOSRS client settings", "client"); + openosrs_PLUGIN, "OpenOSRS client settings", PluginType.IMPORTANT, "client"); openosrs.setPinned(pinnedPlugins.contains(openosrs_PLUGIN)); openosrs.nameLabel.setForeground(Color.WHITE); pluginList.add(openosrs); @@ -290,7 +296,7 @@ public class ConfigPanel extends PluginPanel // set RuneLite config on top, as it should always have been final PluginListItem runeLite = new PluginListItem(this, configManager, runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig), - RUNELITE_PLUGIN, "RuneLite client settings", "client"); + RUNELITE_PLUGIN, "RuneLite client settings", PluginType.IMPORTANT, "client"); runeLite.setPinned(pinnedPlugins.contains(RUNELITE_PLUGIN)); runeLite.nameLabel.setForeground(Color.WHITE); pluginList.add(runeLite); @@ -307,18 +313,21 @@ public class ConfigPanel extends PluginPanel final PluginListItem listItem = new PluginListItem(this, configManager, plugin, descriptor, config, configDescriptor); listItem.setPinned(pinnedPlugins.contains(listItem.getName())); + listItem.setColor(getColorByCategory(OpenOSRSConfig, listItem.getPluginType())); + listItem.setHidden(getHiddenByCategory(OpenOSRSConfig, listItem.getPluginType())); plugins.add(listItem); } ); final PluginListItem chatColor = new PluginListItem(this, configManager, chatColorConfig, configManager.getConfigDescriptor(chatColorConfig), - CHAT_COLOR_PLUGIN, "Recolor chat text", "colour", "messages"); + CHAT_COLOR_PLUGIN, "Recolor chat text", PluginType.GENERAL_USE, "colour", "messages"); chatColor.setPinned(pinnedPlugins.contains(CHAT_COLOR_PLUGIN)); - chatColor.nameLabel.setForeground(Color.WHITE); plugins.add(chatColor); pluginList.addAll(plugins); + + ConfigPanel.sortPluginList(OpenOSRSConfig, null); } void refreshPluginList() @@ -466,7 +475,7 @@ public class ConfigPanel extends PluginPanel String name = listItem.getName(); JLabel title = new JLabel(name); - title.setForeground(Color.WHITE); + title.setForeground(listItem.getColor()); title.setToolTipText("" + name + ":
" + listItem.getDescription() + ""); topPanel.add(title); @@ -1379,4 +1388,72 @@ public class ConfigPanel extends PluginPanel { openGroupConfigPanel(listItem, config, cd, true); } + + public static Color getColorByCategory(OpenOSRSConfig openOSRSConfig, PluginType pluginType) + { + switch (pluginType) + { + case EXTERNAL: + return openOSRSConfig.externalColor(); + case PVM: + return openOSRSConfig.pvmColor(); + case PVP: + return openOSRSConfig.pvpColor(); + case SKILLING: + return openOSRSConfig.skillingColor(); + case UTILITY: + return openOSRSConfig.utilityColor(); + case IMPORTANT: + return Color.WHITE; + } + + return null; + } + + public static boolean getHiddenByCategory(OpenOSRSConfig openOSRSConfig, PluginType pluginType) + { + if (pluginType == PluginType.IMPORTANT || pluginType == PluginType.GENERAL_USE) + { + return false; + } + + if (openOSRSConfig.hidePlugins()) + { + return true; + } + + switch (pluginType) + { + case EXTERNAL: + return openOSRSConfig.hideExternalPlugins(); + case PVM: + return openOSRSConfig.hidePvmPlugins(); + case PVP: + return openOSRSConfig.hidePvpPlugins(); + case SKILLING: + return openOSRSConfig.hideSkillingPlugins(); + case UTILITY: + return openOSRSConfig.hideUtilityPlugins(); + } + + return false; + } + + public static void sortPluginList(OpenOSRSConfig openOSRSConfig, Comparator comparator) + { + if (comparator != null) + { + ConfigPanel.pluginList.sort(comparator.thenComparing(PluginListItem::getName)); + return; + } + + if (openOSRSConfig.pluginSortMode() == net.runelite.client.config.OpenOSRSConfig.SortStyle.CATEGORY) + { + ConfigPanel.pluginList.sort(categoryComparator.thenComparing(PluginListItem::getName)); + } + else + { + ConfigPanel.pluginList.sort(Comparator.comparing(PluginListItem::getName)); + } + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index 934071652b..3a7911faf9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.config; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.image.BufferedImage; @@ -43,6 +44,7 @@ import net.runelite.client.config.ConfigDescriptor; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.IconButton; @@ -82,6 +84,9 @@ public class PluginListItem extends JPanel @Getter(AccessLevel.PUBLIC) private final String description; + @Getter(AccessLevel.PUBLIC) + private final PluginType pluginType; + private final List keywords = new ArrayList<>(); private final IconButton pinButton = new IconButton(OFF_STAR); @@ -96,6 +101,8 @@ public class PluginListItem extends JPanel @Getter private boolean isHidden = false; + private Color color = null; + static { BufferedImage configIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "config_edit_icon.png"); @@ -131,20 +138,20 @@ public class PluginListItem extends JPanel @Nullable Config config, @Nullable ConfigDescriptor configDescriptor) { this(configPanel, configManager, plugin, config, configDescriptor, - descriptor.name(), descriptor.description(), descriptor.tags()); + descriptor.name(), descriptor.description(), descriptor.type(), descriptor.tags()); } /** * Creates a new {@code PluginListItem} for a core configuration. */ PluginListItem(ConfigPanel configPanel, ConfigManager configManager, Config config, ConfigDescriptor configDescriptor, - String name, String description, String... tags) + String name, String description, PluginType pluginType, String... tags) { - this(configPanel, configManager, null, config, configDescriptor, name, description, tags); + this(configPanel, configManager, null, config, configDescriptor, name, description, pluginType, tags); } private PluginListItem(ConfigPanel configPanel, ConfigManager configManager, @Nullable Plugin plugin, @Nullable Config config, - @Nullable ConfigDescriptor configDescriptor, String name, String description, String... tags) + @Nullable ConfigDescriptor configDescriptor, String name, String description, PluginType pluginType, String... tags) { this.configPanel = configPanel; this.plugin = plugin; @@ -152,6 +159,7 @@ public class PluginListItem extends JPanel this.configDescriptor = configDescriptor; this.name = name; this.description = description; + this.pluginType = pluginType; Collections.addAll(keywords, name.toLowerCase().split(" ")); Collections.addAll(keywords, description.toLowerCase().split(" ")); Collections.addAll(keywords, tags); @@ -253,6 +261,22 @@ public class PluginListItem extends JPanel pinButton.setToolTipText(pinned ? "Unpin plugin" : "Pin plugin"); } + Color getColor() + { + return this.color == null ? Color.WHITE : this.color; + } + + public void setColor(Color color) + { + if (color == null) + { + return; + } + + this.color = color; + this.nameLabel.setForeground(color); + } + public void setHidden(boolean hidden) { isHidden = hidden; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java index 526341633d..df5ba2b6e6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/openosrs/OpenOSRSPlugin.java @@ -27,6 +27,8 @@ package net.runelite.client.plugins.openosrs; import java.awt.event.KeyEvent; +import java.util.Arrays; +import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -37,7 +39,6 @@ import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.widgets.WidgetID; import static net.runelite.api.widgets.WidgetInfo.*; import net.runelite.client.callback.ClientThread; -import net.runelite.client.config.ConfigManager; import net.runelite.client.config.Keybind; import net.runelite.client.config.OpenOSRSConfig; import net.runelite.client.eventbus.EventBus; @@ -45,6 +46,8 @@ 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.config.ConfigPanel; import net.runelite.client.util.HotkeyListener; @PluginDescriptor( @@ -57,6 +60,8 @@ import net.runelite.client.util.HotkeyListener; public class OpenOSRSPlugin extends Plugin { private final openosrsKeyListener keyListener = new openosrsKeyListener(); + private final List colorOptions = Arrays.asList("externalColor", "pvmColor", "pvpColor", "skillingColor", "utilityColor"); + @Inject private OpenOSRSConfig config; @@ -72,9 +77,6 @@ public class OpenOSRSPlugin extends Plugin @Inject private EventBus eventbus; - @Inject - private ConfigManager configManager; - private HotkeyListener hotkeyListener = new HotkeyListener(() -> this.keybind) { @Override @@ -94,7 +96,6 @@ public class OpenOSRSPlugin extends Plugin @Override protected void startUp() throws Exception { - migrateConfigs(); addSubscriptions(); entered = -1; @@ -123,6 +124,16 @@ public class OpenOSRSPlugin extends Plugin return; } + if (colorOptions.stream().anyMatch(option -> option.equals(event.getKey()))) + { + updatePlugins(); + } + + if (event.getKey().equals("pluginSortMode")) + { + ConfigPanel.sortPluginList(config, null); + } + this.keybind = config.detachHotkey(); if (!config.keyboardPin()) @@ -254,35 +265,17 @@ public class OpenOSRSPlugin extends Plugin } } - /** - * Migrates configs from runenergy and regenmeter to this plugin and deletes the old config values. - * This method should be removed after a reasonable amount of time. - */ - @Deprecated - private void migrateConfigs() + private void updatePlugins() { - migrateConfig("runeliteplus", "enableOpacity"); - migrateConfig("runeliteplus", "opacityPercentage"); - migrateConfig("runeliteplus", "keyboardPin"); - migrateConfig("runeliteplus", "enablePlugins"); - migrateConfig("runeliteplus", "detachHotkey"); - } - - /** - * Wrapper for migrating individual config options - * This method should be removed after a reasonable amount of time. - * - * @param group old group name - * @param key key name to migrate - */ - @Deprecated - private void migrateConfig(String group, String key) - { - String value = configManager.getConfiguration(group, key); - if (value != null) + ConfigPanel.pluginList.forEach(listItem -> { - configManager.setConfiguration("openosrs", key, value); - configManager.unsetConfiguration(group, key); - } + if (listItem.getPluginType() == PluginType.GENERAL_USE || listItem.getPluginType() == PluginType.IMPORTANT) + { + return; + } + + listItem.setColor(ConfigPanel.getColorByCategory(config, listItem.getPluginType())); + listItem.setHidden(ConfigPanel.getHiddenByCategory(config, listItem.getPluginType())); + }); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java deleted file mode 100644 index f13343db7b..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterConfig.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (c) 2018, https://openosrs.com - * 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.pluginsorter; - -import java.awt.Color; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import net.runelite.client.config.Alpha; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.ConfigTitleSection; -import net.runelite.client.config.Title; - -@ConfigGroup("pluginsorter") -public interface PluginSorterConfig extends Config -{ - @Getter(AccessLevel.PACKAGE) - @AllArgsConstructor - enum SortStyle - { - CATEGORY("Category"), - ALPHABETICALLY("Alphabetically"); - - private String name; - - @Override - public String toString() - { - return getName(); - } - } - - @ConfigTitleSection( - keyName = "pluginSortingTitle", - name = "Sorting", - description = "", - position = 0 - ) - default Title pluginSortingTitle() - { - return new Title(); - } - - @ConfigItem( - position = 1, - keyName = "pluginSortMode", - name = "Sorting mode", - description = "Sorts plugins ", - titleSection = "pluginSortingTitle" - ) - default SortStyle pluginSortMode() - { - return SortStyle.CATEGORY; - } - - @ConfigTitleSection( - keyName = "hidePluginsTitle", - name = "Hide By Type", - description = "", - position = 2 - ) - default Title hidePluginsTitle() - { - return new Title(); - } - - @ConfigItem( - position = 3, - keyName = "hidePlugins", - name = "Hide All Plugins", - description = "Hides all OpenOSRS plugins if checked", - titleSection = "hidePluginsTitle", - hide = "hidePvmPlugins || hidePvpPlugins || hideSkillingPlugins || hideUtilityPlugins || hideExternalPlugins" - ) - default boolean hidePlugins() - { - return false; - } - - @ConfigItem( - position = 4, - keyName = "hideExternalPlugins", - name = "Hide External Plugins", - description = "Hides all OpenOSRS external plugins if checked", - titleSection = "hidePluginsTitle", - hide = "hidePlugins" - ) - default boolean hideExternalPlugins() - { - return false; - } - - @ConfigItem( - position = 5, - keyName = "hidePvmPlugins", - name = "Hide PvM Plugins", - description = "Hides all OpenOSRS PvM plugins if checked", - titleSection = "hidePluginsTitle", - hide = "hidePlugins" - ) - default boolean hidePvmPlugins() - { - return false; - } - - @ConfigItem( - position = 6, - keyName = "hideSkillingPlugins", - name = "Hide Skilling Plugins", - description = "Hides all OpenOSRS skilling plugins if checked", - titleSection = "hidePluginsTitle", - hide = "hidePlugins" - ) - default boolean hideSkillingPlugins() - { - return false; - } - - @ConfigItem( - position = 7, - keyName = "hidePvpPlugins", - name = "Hide PvP Plugins", - description = "Hides all OpenOSRS Pvp plugins if checked", - titleSection = "hidePluginsTitle", - hide = "hidePlugins" - ) - default boolean hidePvpPlugins() - { - return false; - } - - @ConfigItem( - position = 8, - keyName = "hideUtilityPlugins", - name = "Hide Utility Plugins", - description = "Hides all OpenOSRS utility plugins if checked", - titleSection = "hidePluginsTitle", - hide = "hidePlugins" - ) - default boolean hideUtilityPlugins() - { - return false; - } - - @ConfigTitleSection( - keyName = "pluginsColorTitle", - name = "Colors", - description = "", - position = 9 - ) - default Title pluginsColorTitle() - { - return new Title(); - } - - @Alpha - @ConfigItem( - position = 10, - keyName = "externalColor", - name = "External color", - description = "Configure the color of external plugins", - titleSection = "pluginsColorTitle" - ) - default Color externalColor() - { - return new Color(177, 156, 217, 255); - } - - @Alpha - @ConfigItem( - position = 11, - keyName = "pvmColor", - name = "PVM color", - description = "Configure the color of PVM related plugins", - titleSection = "pluginsColorTitle" - ) - default Color pvmColor() - { - return new Color(119, 221, 119, 255); - } - - @Alpha - @ConfigItem( - position = 12, - keyName = "pvpColor", - name = "PVP color", - description = "Configure the color of PVP related plugins", - titleSection = "pluginsColorTitle" - ) - default Color pvpColor() - { - return new Color(255, 105, 97, 255); - } - - @Alpha - @ConfigItem( - position = 13, - keyName = "skillingColor", - name = "Skilling color", - description = "Configure the color of Skilling related plugins", - titleSection = "pluginsColorTitle" - ) - default Color skillingColor() - { - return new Color(252, 252, 100, 255); - } - - @Alpha - @ConfigItem( - position = 14, - keyName = "utilityColor", - name = "Utility color", - description = "Configure the color of Utility related plugins", - titleSection = "pluginsColorTitle" - ) - default Color utilityColor() - { - return new Color(144, 212, 237, 255); - } - -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java index fa6d450453..e6b8ad44f1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pluginsorter/PluginSorterPlugin.java @@ -24,168 +24,64 @@ */ package net.runelite.client.plugins.pluginsorter; -import com.google.common.collect.ImmutableList; -import com.google.inject.Provides; -import java.awt.Color; -import java.util.Comparator; import javax.inject.Inject; import javax.inject.Singleton; -import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.EventBus; -import net.runelite.client.events.PluginChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.plugins.config.ConfigPanel; -import net.runelite.client.plugins.config.PluginListItem; @PluginDescriptor( name = "Plugin Organizer", - description = "Hides and colors 3rd party plugins for better control", - tags = {"plugins", "organizer"}, - type = PluginType.PLUGIN_ORGANIZER + hidden = true ) @Singleton public class PluginSorterPlugin extends Plugin { @Inject - private PluginSorterConfig config; + private ConfigManager configManager; - @Inject - private EventBus eventBus; - - private PluginSorterConfig.SortStyle pluginSortMode; - private Color externalColor; - private Color pvmColor; - private Color pvpColor; - private Color skillingColor; - private Color utilityColor; - - private final ImmutableList definedOrder = ImmutableList.of(PluginType.IMPORTANT, PluginType.EXTERNAL, PluginType.PVM, PluginType.SKILLING, PluginType.PVP, PluginType.UTILITY, PluginType.GENERAL_USE, PluginType.PLUGIN_ORGANIZER); - private final Comparator pluginTypeComparator = Comparator.comparing(plugin -> + /** + * Migrates configs from plugin organizer to the OpenOSRS global plugin and deletes the old config values. + * This method should be removed after a reasonable amount of time. + */ + @Deprecated + private void migrateConfigs() { - PluginType type = PluginType.GENERAL_USE; - Plugin sortPlugin = plugin.getPlugin(); - if (sortPlugin != null) - { - type = sortPlugin.getClass().getAnnotation(PluginDescriptor.class).type(); - } - else if (plugin.configDescriptor.getGroup().value().equals("openosrs") || plugin.configDescriptor.getGroup().value().equals("runelite")) - { - type = PluginType.IMPORTANT; - } + migrateConfig("pluginsorter", "pluginSortMode"); + migrateConfig("pluginsorter", "hidePlugins"); + migrateConfig("pluginsorter", "hideExternalPlugins"); + migrateConfig("pluginsorter", "hidePvmPlugins"); + migrateConfig("pluginsorter", "hideSkillingPlugins"); + migrateConfig("pluginsorter", "hidePvpPlugins"); + migrateConfig("pluginsorter", "hideUtilityPlugins"); + migrateConfig("pluginsorter", "externalColor"); + migrateConfig("pluginsorter", "pvmColor"); + migrateConfig("pluginsorter", "pvpColor"); + migrateConfig("pluginsorter", "skillingColor"); + migrateConfig("pluginsorter", "utilityColor"); + } - return definedOrder.indexOf(type); - }); - - @Provides - PluginSorterConfig provideConfig(ConfigManager configManager) + /** + * Wrapper for migrating individual config options + * This method should be removed after a reasonable amount of time. + * + * @param group old group name + * @param key key name to migrate + */ + @Deprecated + private void migrateConfig(String group, String key) { - return configManager.getConfig(PluginSorterConfig.class); + String value = configManager.getConfiguration(group, key); + if (value != null) + { + configManager.setConfiguration("openosrs", key, value); + configManager.unsetConfiguration(group, key); + } } @Override protected void startUp() throws Exception { - updateConfig(); - addSubscriptions(); - - updatePlugins(); - } - - @Override - protected void shutDown() throws Exception - { - eventBus.unregister(this); - } - - private void addSubscriptions() - { - eventBus.subscribe(ConfigChanged.class, this, this::onConfigChanged); - eventBus.subscribe(PluginChanged.class, this, this::onPluginChanged); - } - - private void onPluginChanged(PluginChanged pluginChanged) - { - validatePlugins(); - } - - private void validatePlugins() - { - updatePlugins(); - } - - private void onConfigChanged(ConfigChanged configChanged) - { - if (!configChanged.getGroup().equals("pluginsorter")) - { - return; - } - - updateConfig(); - updatePlugins(); - } - - private void updatePlugins() - { - boolean hidePlugins = config.hidePlugins(); - boolean hidePvmPlugins = config.hidePvmPlugins(); - boolean hidePvpPlugins = config.hidePvpPlugins(); - boolean hideSkillingPlugins = config.hideSkillingPlugins(); - boolean hideUtilityPlugins = config.hideUtilityPlugins(); - boolean hideExternalPlugins = config.hideExternalPlugins(); - - for (PluginListItem pli : ConfigPanel.pluginList) - { - if (pli.getPlugin() != null) - { - switch (pli.getPlugin().getClass().getAnnotation(PluginDescriptor.class).type()) - { - case EXTERNAL: - pli.nameLabel.setForeground(this.externalColor); - pli.setHidden(hidePlugins || hideExternalPlugins); - break; - case PVM: - pli.nameLabel.setForeground(this.pvmColor); - pli.setHidden(hidePlugins || hidePvmPlugins); - break; - case PVP: - pli.nameLabel.setForeground(this.pvpColor); - pli.setHidden(hidePlugins || hidePvpPlugins); - break; - case SKILLING: - pli.nameLabel.setForeground(this.skillingColor); - pli.setHidden(hidePlugins || hideSkillingPlugins); - break; - case UTILITY: - pli.nameLabel.setForeground(this.utilityColor); - pli.setHidden(hidePlugins || hideUtilityPlugins); - break; - default: - pli.nameLabel.setForeground(Color.WHITE); - break; - } - } - } - - if (this.pluginSortMode == PluginSorterConfig.SortStyle.CATEGORY) - { - ConfigPanel.pluginList.sort(pluginTypeComparator.thenComparing(PluginListItem::getName)); - } - else - { - ConfigPanel.pluginList.sort(Comparator.comparing(PluginListItem::getName)); - } - } - - private void updateConfig() - { - this.pluginSortMode = config.pluginSortMode(); - this.externalColor = config.externalColor(); - this.pvmColor = config.pvmColor(); - this.pvpColor = config.pvpColor(); - this.skillingColor = config.skillingColor(); - this.utilityColor = config.utilityColor(); + migrateConfigs(); } } From ef1d57a2ce2d6795ac12e8a77691db554663dfe4 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Mon, 21 Oct 2019 20:03:55 +0200 Subject: [PATCH 040/185] configpanel: Add on off toggle in the title area --- .../client/plugins/config/ConfigPanel.java | 7 +++++++ .../client/plugins/config/PluginListItem.java | 16 ++++------------ 2 files changed, 11 insertions(+), 12 deletions(-) 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 18390bf0a1..5bb19be389 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 @@ -479,6 +479,13 @@ public class ConfigPanel extends PluginPanel title.setToolTipText("" + name + ":
" + listItem.getDescription() + ""); topPanel.add(title); + IconButton toggleButton = new IconButton(PluginListItem.OFF_SWITCHER); + toggleButton.setPreferredSize(new Dimension(25, 0)); + listItem.updateToggleButton(toggleButton); + listItem.attachToggleButtonListener(toggleButton); + + topPanel.add(toggleButton, BorderLayout.EAST); + final Map sectionWidgets = new HashMap<>(); final Map titleSectionWidgets = new HashMap<>(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index 3a7911faf9..ba4058c379 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -60,7 +60,7 @@ public class PluginListItem extends JPanel private static final ImageIcon CONFIG_ICON; private static final ImageIcon CONFIG_ICON_HOVER; private static final ImageIcon ON_SWITCHER; - private static final ImageIcon OFF_SWITCHER; + public static final ImageIcon OFF_SWITCHER; private static final ImageIcon ON_STAR; private static final ImageIcon OFF_STAR; @@ -93,6 +93,7 @@ public class PluginListItem extends JPanel private final IconButton configButton = new IconButton(CONFIG_ICON, CONFIG_ICON_HOVER); private final IconButton toggleButton = new IconButton(OFF_SWITCHER); + @Getter private boolean isPluginEnabled = false; @Getter @@ -214,7 +215,7 @@ public class PluginListItem extends JPanel buttonPanel.add(toggleButton); } - private void attachToggleButtonListener(IconButton button) + void attachToggleButtonListener(IconButton button) { // no need for a listener if there is no plugin to enable / disable if (plugin == null) @@ -239,15 +240,6 @@ public class PluginListItem extends JPanel }); } - IconButton createToggleButton() - { - IconButton button = new IconButton(OFF_SWITCHER); - button.setPreferredSize(new Dimension(25, 0)); - updateToggleButton(button); - attachToggleButtonListener(button); - return button; - } - void setPluginEnabled(boolean enabled) { isPluginEnabled = enabled; @@ -282,7 +274,7 @@ public class PluginListItem extends JPanel isHidden = hidden; } - private void updateToggleButton(IconButton button) + void updateToggleButton(IconButton button) { button.setIcon(isPluginEnabled ? ON_SWITCHER : OFF_SWITCHER); button.setToolTipText(isPluginEnabled ? "Disable plugin" : "Enable plugin"); From 7d1f3849c4d898b502e5eb3d67b6d9ef83ada0b0 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Mon, 21 Oct 2019 20:10:05 +0200 Subject: [PATCH 041/185] configpanel: handle important type directly and fix naming --- .../net/runelite/client/plugins/config/ConfigPanel.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) 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 5bb19be389..b8ef9d4ff6 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 @@ -140,7 +140,7 @@ public class ConfigPanel extends PluginPanel private static final String RUNELITE_GROUP_NAME = RuneLiteConfig.class.getAnnotation(ConfigGroup.class).value(); private static final String PINNED_PLUGINS_CONFIG_KEY = "pinnedPlugins"; private static final String RUNELITE_PLUGIN = "RuneLite"; - private static final String openosrs_PLUGIN = "OpenOSRS"; + private static final String OPENOSRS_PLUGIN = "OpenOSRS"; private static final String CHAT_COLOR_PLUGIN = "Chat Color"; private final PluginManager pluginManager; private final ConfigManager configManager; @@ -288,8 +288,8 @@ public class ConfigPanel extends PluginPanel // set OpenOSRS config on top, as it should always have been final PluginListItem openosrs = new PluginListItem(this, configManager, OpenOSRSConfig, configManager.getConfigDescriptor(OpenOSRSConfig), - openosrs_PLUGIN, "OpenOSRS client settings", PluginType.IMPORTANT, "client"); - openosrs.setPinned(pinnedPlugins.contains(openosrs_PLUGIN)); + OPENOSRS_PLUGIN, "OpenOSRS client settings", PluginType.IMPORTANT, "client"); + openosrs.setPinned(pinnedPlugins.contains(OPENOSRS_PLUGIN)); openosrs.nameLabel.setForeground(Color.WHITE); pluginList.add(openosrs); @@ -1410,8 +1410,6 @@ public class ConfigPanel extends PluginPanel return openOSRSConfig.skillingColor(); case UTILITY: return openOSRSConfig.utilityColor(); - case IMPORTANT: - return Color.WHITE; } return null; From 079ea52722c7f3c1ac846746c7a2a600a9828463 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Mon, 21 Oct 2019 20:22:57 +0200 Subject: [PATCH 042/185] pluginlistitem: checkstyle --- .../net/runelite/client/plugins/config/PluginListItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index ba4058c379..05f8f3c513 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -146,13 +146,13 @@ public class PluginListItem extends JPanel * Creates a new {@code PluginListItem} for a core configuration. */ PluginListItem(ConfigPanel configPanel, ConfigManager configManager, Config config, ConfigDescriptor configDescriptor, - String name, String description, PluginType pluginType, String... tags) + String name, String description, PluginType pluginType, String... tags) { this(configPanel, configManager, null, config, configDescriptor, name, description, pluginType, tags); } private PluginListItem(ConfigPanel configPanel, ConfigManager configManager, @Nullable Plugin plugin, @Nullable Config config, - @Nullable ConfigDescriptor configDescriptor, String name, String description, PluginType pluginType, String... tags) + @Nullable ConfigDescriptor configDescriptor, String name, String description, PluginType pluginType, String... tags) { this.configPanel = configPanel; this.plugin = plugin; From 3b356f7a25f901b4cc88884ed277052ae05f8068 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 16 Oct 2019 09:38:44 -0600 Subject: [PATCH 043/185] music: Add ingame granular volume adjustment --- .../java/net/runelite/api/ScriptEvent.java | 5 + .../main/java/net/runelite/api/ScriptID.java | 10 + .../java/net/runelite/api/widgets/Widget.java | 31 ++- .../net/runelite/api/widgets/WidgetID.java | 8 + .../net/runelite/api/widgets/WidgetInfo.java | 6 +- .../client/plugins/music/MusicConfig.java | 62 ++--- .../client/plugins/music/MusicPlugin.java | 219 ++++++++++++++++-- .../src/main/scripts/options_allsounds.hash | 1 + .../src/main/scripts/options_allsounds.rs2asm | 140 +++++++++++ 9 files changed, 434 insertions(+), 48 deletions(-) create mode 100644 runelite-client/src/main/scripts/options_allsounds.hash create mode 100644 runelite-client/src/main/scripts/options_allsounds.rs2asm diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java index 2af2c1bd92..b9fa224ea5 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java @@ -61,4 +61,9 @@ public interface ScriptEvent * @see net.runelite.api.events.MenuOptionClicked */ String getOpbase(); + + /** + * Parent relative x coordinate for mouse related events + */ + int getMouseX(); } diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index 657ec2dcb8..9d056b34e4 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -83,6 +83,16 @@ public final class ScriptID @ScriptArguments(integer = 2) public static final int MESSAGE_LAYER_CLOSE = 299; + /** + * Sets the background for sound option bars + *
    + *
  • int Value of the slider (0-4)
  • + *
  • int (WidgetID) * 5, segments of the slider
  • + *
+ */ + @ScriptArguments(integer = 6) + public static final int OPTIONS_ALLSOUNDS = 358; + /** * Readies the chatbox panel for things like the chatbox input * Inverse of MESSAGE_LAYER_CLOSE diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index e4ad3f3baa..f44e61e448 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -553,7 +553,7 @@ public interface Widget void setOnMouseOverListener(Object... args); /** - * Sets a script to be ran every frame when the mouse is in the widget bounds + * Sets a script to be ran every client tick when the mouse is in the widget bounds * * @param args A ScriptID, then the args for the script */ @@ -567,7 +567,7 @@ public interface Widget void setOnMouseLeaveListener(Object... args); /** - * Sets a script to be ran every frame + * Sets a script to be ran every client tick * * @param args A ScriptID, then the args for the script */ @@ -823,4 +823,31 @@ public interface Widget * Can widgets under this widgets be scrolled in this widgets bounding box */ void setNoScrollThrough(boolean noScrollThrough); + + /** + * {@link net.runelite.api.VarPlayer}s that triggers this widgets varTransmitListener + */ + void setVarTransmitTrigger(int ...trigger); + + /** + * Sets a script to be ran the first client tick the mouse is held ontop of this widget + * + * @param args A ScriptID, then the args for the script + */ + void setOnClickListener(Object ...args); + + /** + * Sets a script to be ran the every client tick the mouse is held ontop of this widget, + * except the first client tick. + * + * @param args A ScriptID, then the args for the script + */ + void setOnHoldListener(Object ...args); + + /** + * Sets a script to be ran the first client tick the mouse is not held ontop of this widget + * + * @param args A ScriptID, then the args for the script + */ + void setOnReleaseListener(Object ...args); } 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 349d29721b..06fca6a6b7 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 @@ -143,6 +143,7 @@ public class WidgetID public static final int ITEMS_KEPT_ON_DEATH_GROUP_ID = 4; public static final int SEED_VAULT_GROUP_ID = 631; public static final int EXPLORERS_RING_ALCH_GROUP_ID = 483; + public static final int OPTIONS_GROUP_ID = 261; static class WorldMap { @@ -834,4 +835,11 @@ public class WidgetID { static final int INVENTORY = 7; } + + static class Options + { + static final int MUSIC_SLIDER = 44; + static final int SOUND_EFFECT_SLIDER = 50; + static final int AREA_SOUND_SLIDER = 56; + } } 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 db1b7a57f6..32281cd2c8 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 @@ -498,7 +498,11 @@ public enum WidgetInfo SEED_VAULT_TITLE_CONTAINER(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.TITLE_CONTAINER), SEED_VAULT_ITEM_CONTAINER(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_CONTAINER), - SEED_VAULT_ITEM_TEXT(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_TEXT); + SEED_VAULT_ITEM_TEXT(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_TEXT), + + OPTIONS_MUSIC_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.MUSIC_SLIDER), + OPTIONS_SOUND_EFFECT_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.SOUND_EFFECT_SLIDER), + OPTIONS_AREA_SOUND_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.AREA_SOUND_SLIDER); private final int groupId; private final int childId; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java index 20b50545d0..da764e62c9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -27,20 +27,15 @@ package net.runelite.client.plugins.music; 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("music") public interface MusicConfig extends Config { @ConfigItem( keyName = "musicVolume", - name = "Music Volume", - description = "Overrides music volume in game with more granular control", - position = 1 - ) - @Range( - min = 0, - max = 255 + name = "", + description = "", + hidden = true ) default int getMusicVolume() { @@ -48,32 +43,47 @@ public interface MusicConfig extends Config } @ConfigItem( - keyName = "soundEffectVolume", - name = "Sound Effect Volume", - description = "Overrides the sound effect volume in game with more granular control", - position = 2 + keyName = "musicVolume", + name = "", + description = "", + hidden = true ) - @Range( - min = 0, - max = 127 + void setMusicVolume(int vol); + + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true ) default int getSoundEffectVolume() { return 0; } + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setSoundEffectVolume(int val); + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getAreaSoundEffectVolume() + { + return 0; + } @ConfigItem( keyName = "areaSoundEffectVolume", - name = "Area Sound Effect Volume", - description = "Overrides the area sound effect volume in game with more granular control", - position = 3 + name = "", + description = "", + hidden = true ) - @Range( - min = 0, - max = 127 - ) - default int getAreaSoundEffectVolume() - { - return 0; - } + void setAreaSoundEffectVolume(int vol); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 80ef0c22e3..167032278a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -29,23 +29,30 @@ import com.google.inject.Provides; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.function.BiConsumer; +import java.util.function.ToIntFunction; import java.util.stream.Collectors; import javax.inject.Inject; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.ScriptID; import net.runelite.api.SoundEffectID; import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; +import net.runelite.api.VarPlayer; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.VarClientIntChanged; import net.runelite.api.events.VolumeChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetConfig; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetPositionMode; @@ -85,17 +92,15 @@ public class MusicPlugin extends Plugin private MusicState currentMusicFilter = MusicState.ALL; - private int lastMusicVolume; - private int lastEffectVolume; - private int lastAreaEffectVolume; - @Override protected void startUp() { - lastMusicVolume = lastEffectVolume = lastAreaEffectVolume = -1; - - clientThread.invoke(this::addMusicButtons); - clientThread.invoke(this::applyMusicVolumeConfig); + clientThread.invoke(() -> + { + addMusicButtons(); + applyMusicVolumeConfig(); + updateMusicOptions(); + }); } @Override @@ -108,6 +113,8 @@ public class MusicPlugin extends Plugin } tracks = null; + + clientThread.invoke(this::teardownMusicOptions); } @Provides @@ -138,6 +145,10 @@ public class MusicPlugin extends Plugin currentMusicFilter = MusicState.ALL; addMusicButtons(); } + if (widgetLoaded.getGroupId() == WidgetID.OPTIONS_GROUP_ID) + { + updateMusicOptions(); + } } private void addMusicButtons() @@ -206,26 +217,24 @@ public class MusicPlugin extends Plugin private void applyMusicVolumeConfig() { int musicVolume = musicConfig.getMusicVolume(); - // Set the volume if it is >0, or if it was >0 and is now going back to 0 - if (musicVolume > 0 || lastMusicVolume > 0) + if (musicVolume > 0) { - client.setMusicVolume(musicVolume); - lastMusicVolume = musicVolume; + client.setMusicVolume(musicVolume - 1); } int soundEffectVolume = musicConfig.getSoundEffectVolume(); - if (soundEffectVolume > 0 || lastEffectVolume > 0) + if (soundEffectVolume > 0) { - client.setSoundEffectVolume(soundEffectVolume); - lastEffectVolume = soundEffectVolume; + client.setSoundEffectVolume(soundEffectVolume - 1); } int areaSoundEffectVolume = musicConfig.getAreaSoundEffectVolume(); - if (areaSoundEffectVolume > 0 || lastAreaEffectVolume > 0) + if (areaSoundEffectVolume > 0) { - client.setAreaSoundEffectVolume(areaSoundEffectVolume); - lastAreaEffectVolume = areaSoundEffectVolume; + client.setAreaSoundEffectVolume(areaSoundEffectVolume - 1); } + + updateMusicOptions(); } private boolean isOnMusicTab() @@ -351,4 +360,176 @@ public class MusicPlugin extends Plugin private final String name; private final int spriteID; } -} + + @RequiredArgsConstructor + @Getter + private enum MusicSlider + { + MUSIC(WidgetInfo.OPTIONS_MUSIC_SLIDER, VarPlayer.MUSIC_VOLUME, MusicConfig::getMusicVolume, MusicConfig::setMusicVolume, 255), + AREA(WidgetInfo.OPTIONS_AREA_SOUND_SLIDER, VarPlayer.AREA_EFFECT_VOLUME, MusicConfig::getAreaSoundEffectVolume, MusicConfig::setAreaSoundEffectVolume, 127), + EFFECT(WidgetInfo.OPTIONS_SOUND_EFFECT_SLIDER, VarPlayer.SOUND_EFFECT_VOLUME, MusicConfig::getSoundEffectVolume, MusicConfig::setSoundEffectVolume, 127); + + private final WidgetInfo widgetID; + private final VarPlayer var; + private final ToIntFunction getter; + private final BiConsumer setter; + private final int max; + + @Setter + private Widget handle; + + @Setter + private Widget track; + + private static int PADDING = 8; + + private int getX() + { + return getTrack().getRelativeX() + PADDING; + } + + private int getWidth() + { + return getTrack().getWidth() - (PADDING * 2) - handle.getWidth(); + } + } + + private void teardownMusicOptions() + { + for (MusicSlider slider : MusicSlider.values()) + { + Widget icon = client.getWidget(slider.getWidgetID()); + if (icon == null) + { + return; + } + + if (slider.getHandle() != null) + { + { + Widget handle = slider.getHandle(); + Widget[] siblings = handle.getParent().getChildren(); + if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + { + continue; + } + siblings[slider.getTrack().getIndex()] = null; + siblings[handle.getIndex()] = null; + } + + Object[] init = icon.getOnLoadListener(); + init[1] = slider.getWidgetID().getId(); + + // Readd the var transmit triggers and rerun options_allsounds + client.runScript(init); + slider.setHandle(null); + slider.setTrack(null); + } + } + } + + private void updateMusicOptions() + { + for (MusicSlider slider : MusicSlider.values()) + { + Widget icon = client.getWidget(slider.getWidgetID()); + if (icon == null) + { + return; + } + + Widget handle = slider.getHandle(); + if (handle != null) + { + Widget[] siblings = handle.getParent().getChildren(); + if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + { + handle = null; + } + } + if (handle == null) + { + Object[] init = icon.getOnLoadListener(); + icon.setVarTransmitTrigger((int[]) null); + + Widget track = icon.getParent().createChild(-1, WidgetType.TEXT); + slider.setTrack(track); + handle = icon.getParent().createChild(-1, WidgetType.GRAPHIC); + slider.setHandle(handle); + + { + // First widget of the track + int wid = (Integer) init[2]; + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + + track.setOriginalX(w.getRelativeX()); + track.setOriginalY(w.getRelativeY()); + } + { + // Last widget of the track + int wid = (Integer) init[6]; + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + + track.setOriginalWidth((w.getRelativeX() + w.getWidth()) - track.getOriginalX()); + } + + track.setOriginalHeight(16); + track.setNoClickThrough(true); + track.revalidate(); + + handle.setSpriteId(SpriteID.OPTIONS_ZOOM_SLIDER_THUMB); + handle.setOriginalWidth(16); + handle.setOriginalHeight(16); + handle.setClickMask(WidgetConfig.DRAG); + + JavaScriptCallback move = ev -> + { + int newVal = ((ev.getMouseX() - MusicSlider.PADDING - (slider.getHandle().getWidth() / 2)) * slider.getMax()) + / slider.getWidth(); + if (newVal < 0) + { + newVal = 0; + } + if (newVal > slider.getMax()) + { + newVal = slider.getMax(); + } + + // We store +1 so we can tell the difference between 0 and muted + slider.getSetter().accept(musicConfig, newVal + 1); + applyMusicVolumeConfig(); + }; + + track.setOnClickListener(move); + track.setOnHoldListener(move); + track.setOnReleaseListener(move); + track.setHasListener(true); + + client.runScript(ScriptID.OPTIONS_ALLSOUNDS, -1, init[2], init[3], init[4], init[5], init[6]); + } + + int value = slider.getGetter().applyAsInt(musicConfig) - 1; + if (value <= -1) + { + // Use the vanilla value + value = ((4 - client.getVar(slider.getVar())) * slider.getMax()) / 4; + } + + int newX = ((value * slider.getWidth()) / slider.getMax()) + slider.getX(); + slider.getHandle().setOriginalX(newX); + slider.getHandle().setOriginalY(slider.getTrack().getOriginalY()); + slider.getHandle().revalidate(); + } + } + + @Subscribe + public void onScriptCallbackEvent(ScriptCallbackEvent ev) + { + switch (ev.getEventName()) + { + case "optionsAllSounds": + // We have to override this script because it gets invoked periodically from the server + client.getIntStack()[client.getIntStackSize() - 1] = -1; + } + } +} \ No newline at end of file diff --git a/runelite-client/src/main/scripts/options_allsounds.hash b/runelite-client/src/main/scripts/options_allsounds.hash new file mode 100644 index 0000000000..84863d9bd2 --- /dev/null +++ b/runelite-client/src/main/scripts/options_allsounds.hash @@ -0,0 +1 @@ +950ADB6A28E029005D24F99A65EF4D2AC4486EDC680D8770F4435F0300AA1299 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/options_allsounds.rs2asm b/runelite-client/src/main/scripts/options_allsounds.rs2asm new file mode 100644 index 0000000000..2d4e94e9ce --- /dev/null +++ b/runelite-client/src/main/scripts/options_allsounds.rs2asm @@ -0,0 +1,140 @@ +.id 358 +.int_stack_count 6 +.string_stack_count 0 +.int_var_count 6 +.string_var_count 0 +; callback "optionsAllSounds" +; Used by the MusicPlugin to hide the vanilla (blue) volume handles +; Enable the MusicPlugin and go to the volume options panel. There should +; only be a green handle on the slider + iload 0 + sconst "optionsAllSounds" + runelite_callback + istore 0 + iload 0 + iconst 4 + if_icmpeq LABEL4 + jump LABEL20 +LABEL4: + iconst 687 + iload 1 + if_setgraphic + iconst 693 + iload 2 + if_setgraphic + iconst 694 + iload 3 + if_setgraphic + iconst 695 + iload 4 + if_setgraphic + iconst 696 + iload 5 + if_setgraphic + jump LABEL115 +LABEL20: + iload 0 + iconst 3 + if_icmpeq LABEL24 + jump LABEL40 +LABEL24: + iconst 692 + iload 1 + if_setgraphic + iconst 688 + iload 2 + if_setgraphic + iconst 694 + iload 3 + if_setgraphic + iconst 695 + iload 4 + if_setgraphic + iconst 696 + iload 5 + if_setgraphic + jump LABEL115 +LABEL40: + iload 0 + iconst 2 + if_icmpeq LABEL44 + jump LABEL60 +LABEL44: + iconst 692 + iload 1 + if_setgraphic + iconst 693 + iload 2 + if_setgraphic + iconst 689 + iload 3 + if_setgraphic + iconst 695 + iload 4 + if_setgraphic + iconst 696 + iload 5 + if_setgraphic + jump LABEL115 +LABEL60: + iload 0 + iconst 1 + if_icmpeq LABEL64 + jump LABEL80 +LABEL64: + iconst 692 + iload 1 + if_setgraphic + iconst 693 + iload 2 + if_setgraphic + iconst 694 + iload 3 + if_setgraphic + iconst 690 + iload 4 + if_setgraphic + iconst 696 + iload 5 + if_setgraphic + jump LABEL115 +LABEL80: + iload 0 + iconst 0 + if_icmpeq LABEL84 + jump LABEL100 +LABEL84: + iconst 692 + iload 1 + if_setgraphic + iconst 693 + iload 2 + if_setgraphic + iconst 694 + iload 3 + if_setgraphic + iconst 695 + iload 4 + if_setgraphic + iconst 691 + iload 5 + if_setgraphic + jump LABEL115 +LABEL100: + iconst 692 + iload 1 + if_setgraphic + iconst 693 + iload 2 + if_setgraphic + iconst 694 + iload 3 + if_setgraphic + iconst 695 + iload 4 + if_setgraphic + iconst 696 + iload 5 + if_setgraphic +LABEL115: + return From 348040367b6a16d8d57c8ed97bfa2e7f7518f998 Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Tue, 22 Oct 2019 00:12:39 +0000 Subject: [PATCH 044/185] project: Update gradle dependencies --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 535702c0a8..1889f90fec 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ ext { jopt = '5.0.4' jooq = '3.12.1' junit = '4.12' - jupiter = '5.5.2' + jupiter = '5.6.0-M1' logback = '1.2.3' lombok = '1.18.10' mapstruct = '1.3.1.Final' From 4e68451fc1d8fe318bd3639099e3e9230968efb5 Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 22 Oct 2019 18:27:44 +1100 Subject: [PATCH 045/185] slayermusiq: updated Animal Magnetism link suggestion 348 on discord can be closed --- .../runelite/client/plugins/slayermusiq/QuestGuideLinks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java index b18831f8fa..65527b4659 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayermusiq/QuestGuideLinks.java @@ -114,7 +114,7 @@ class QuestGuideLinks new Link("My Arm's Big Adventure", "https://www.youtube.com/watch?v=xa1KWOewgYA"), new Link("Enlightened Journey", "https://www.youtube.com/watch?v=XAPthC8d7k0"), new Link("Eagles' Peak", "https://www.youtube.com/watch?v=KDxIrrwXp7U"), - new Link("Animal Magnetism", "https://www.youtube.com/watch?v=kUyjXA7TaFU"), + new Link("Animal Magnetism", "https://www.youtube.com/watch?v=_JldgJTnc7I"), new Link("Contact!", "https://www.youtube.com/watch?v=czn-yWABBWs"), new Link("Cold War", "https://www.youtube.com/watch?v=0m1KpP-qKWI"), new Link("The Fremennik Isles", "https://www.youtube.com/watch?v=EvxhiOWmraY"), From 263a6daf1455a6b9bbe037c36438ff7bd7128854 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 2 Oct 2019 22:50:40 +0100 Subject: [PATCH 046/185] farming calc: fix white lily level --- .../runelite/client/plugins/skillcalculator/skill_farming.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json index 5953579264..805b2b365c 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json @@ -187,7 +187,7 @@ "xp": 6218.4 }, { - "level": 57, + "level": 58, "icon": 22932, "name": "White lily", "xp": 292 From 06c1732fa118e3618a57d7b678c5bbdbecf190b4 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 2 Oct 2019 22:51:29 +0100 Subject: [PATCH 047/185] fletching calc: add dragon crossbow --- .../skillcalculator/skill_fletching.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json index 7da4e7236c..e64e32c28d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json @@ -486,6 +486,24 @@ "name": "Amethyst Broad Bolts", "xp": 10.6 }, + { + "level": 78, + "icon": 21952, + "name": "Magic Stock", + "xp": 70 + }, + { + "level": 78, + "icon": 21921, + "name": "Dragon Crossbow (U)", + "xp": 135 + }, + { + "level": 78, + "icon": 21902, + "name": "Dragon Crossbow", + "xp": 70 + }, { "level": 80, "icon": 861, From e498ba59b4044de71f0236026f4c1b28e322fe84 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 2 Oct 2019 22:51:53 +0100 Subject: [PATCH 048/185] mining calc: add soft clay --- .../client/plugins/skillcalculator/skill_mining.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json index 7c7c3abd49..728f204861 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json @@ -126,6 +126,12 @@ "name": "Mithril Ore", "xp": 80 }, + { + "level": 70, + "icon": 1761, + "name": "Soft Clay", + "xp": 5 + }, { "level": 70, "icon": 449, From b109f935724a72423d54e2753c7b85e82b665dd3 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 2 Oct 2019 22:52:16 +0100 Subject: [PATCH 049/185] hunter calc: add crystal impling --- .../client/plugins/skillcalculator/skill_hunter.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json index 1337d233cb..a50c2164d6 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json @@ -318,6 +318,12 @@ "name": "Ninja Impling (Gielinor)", "xp": 240 }, + { + "level": 80, + "icon": 23768, + "name": "Crystal Impling", + "xp": 280 + }, { "level": 83, "icon": 11256, From a3ccd12db17002c0270789924c0abb5629587dcb Mon Sep 17 00:00:00 2001 From: dekvall Date: Sun, 6 Oct 2019 17:19:32 +0200 Subject: [PATCH 050/185] fishing: reset trawler start time when back on land --- .../java/net/runelite/client/plugins/fishing/FishingPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index 39cbb4253e..a8371cf81c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -386,6 +386,7 @@ public class FishingPlugin extends Plugin if (regionID != TRAWLER_SHIP_REGION_NORMAL && regionID != TRAWLER_SHIP_REGION_SINKING) { log.debug("Trawler session ended"); + trawlerStartTime = null; return; } From 27a304dce6db8dab5f463c83b31831758c690eb3 Mon Sep 17 00:00:00 2001 From: dekvall Date: Sun, 6 Oct 2019 17:17:32 +0200 Subject: [PATCH 051/185] loottracker: add fishing trawler --- runelite-api/src/main/java/net/runelite/api/InventoryID.java | 4 ++++ .../src/main/java/net/runelite/api/widgets/WidgetID.java | 1 + .../client/plugins/loottracker/LootTrackerPlugin.java | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/InventoryID.java b/runelite-api/src/main/java/net/runelite/api/InventoryID.java index a5e4de4bdc..83a8ffe68e 100644 --- a/runelite-api/src/main/java/net/runelite/api/InventoryID.java +++ b/runelite-api/src/main/java/net/runelite/api/InventoryID.java @@ -29,6 +29,10 @@ package net.runelite.api; */ public enum InventoryID { + /** + * Reward from fishing trawler + */ + FISHING_TRAWLER_REWARD(0), /** * Standard player inventory. */ 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 4c8b3efc80..33d0f462ac 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 @@ -120,6 +120,7 @@ public class WidgetID public static final int SPELLBOOK_GROUP_ID = 218; public static final int PVP_GROUP_ID = 90; public static final int FISHING_TRAWLER_GROUP_ID = 366; + public static final int FISHING_TRAWLER_REWARD_GROUP_ID = 367; public static final int ZEAH_MESS_HALL_GROUP_ID = 235; public static final int KOUREND_FAVOUR_GROUP_ID = 246; public static final int LOOTING_BAG_GROUP_ID = 81; 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 edec90e676..89a6c0a685 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 @@ -407,6 +407,10 @@ public class LootTrackerPlugin extends Plugin eventType = "Kingdom of Miscellania"; container = client.getItemContainer(InventoryID.KINGDOM_OF_MISCELLANIA); break; + case (WidgetID.FISHING_TRAWLER_REWARD_GROUP_ID): + eventType = "Fishing Trawler"; + container = client.getItemContainer(InventoryID.FISHING_TRAWLER_REWARD); + break; default: return; } From a94637d3be596b50cbe06a577f6f6b90b2486350 Mon Sep 17 00:00:00 2001 From: Abex Date: Tue, 22 Oct 2019 12:49:01 -0600 Subject: [PATCH 052/185] wiki: support wiki-casting on non-inventory items --- .../net/runelite/api/widgets/WidgetID.java | 12 +- .../net/runelite/api/widgets/WidgetInfo.java | 6 +- .../client/plugins/wiki/WikiPlugin.java | 138 ++++++++++++++---- 3 files changed, 123 insertions(+), 33 deletions(-) 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 33d0f462ac..8dc2e13152 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 @@ -52,7 +52,7 @@ public class WidgetID public static final int EQUIPMENT_INVENTORY_GROUP_ID = 85; public static final int EMOTES_GROUP_ID = 216; public static final int RUNE_POUCH_GROUP_ID = 190; - public static final int DIARY_GROUP_ID = 259; + public static final int ACHIEVEMENT_DIARY_GROUP_ID = 259; public static final int PEST_CONTROL_BOAT_GROUP_ID = 407; public static final int PEST_CONTROL_GROUP_ID = 408; public static final int CLAN_CHAT_GROUP_ID = 7; @@ -843,4 +843,14 @@ public class WidgetID static final int SOUND_EFFECT_SLIDER = 50; static final int AREA_SOUND_SLIDER = 56; } + + static class AchievementDiary + { + static final int CONTAINER = 2; + } + + static class Skills + { + static final int CONTAINER = 0; + } } 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 32281cd2c8..c7e3efb585 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 @@ -502,7 +502,11 @@ public enum WidgetInfo OPTIONS_MUSIC_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.MUSIC_SLIDER), OPTIONS_SOUND_EFFECT_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.SOUND_EFFECT_SLIDER), - OPTIONS_AREA_SOUND_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.AREA_SOUND_SLIDER); + OPTIONS_AREA_SOUND_SLIDER(WidgetID.OPTIONS_GROUP_ID, WidgetID.Options.AREA_SOUND_SLIDER), + + ACHIEVEMENT_DIARY_CONTAINER(WidgetID.ACHIEVEMENT_DIARY_GROUP_ID, WidgetID.AchievementDiary.CONTAINER), + + SKILLS_CONTAINER(WidgetID.SKILLS_GROUP_ID, WidgetID.Skills.CONTAINER); private final int groupId; private final int childId; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java index afbc30b766..3c14556492 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java @@ -26,8 +26,7 @@ package net.runelite.client.plugins.wiki; import com.google.common.primitives.Ints; import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.stream.Stream; import javax.inject.Inject; import javax.inject.Provider; import lombok.extern.slf4j.Slf4j; @@ -82,9 +81,6 @@ public class WikiPlugin extends Plugin private static final String MENUOP_QUICKGUIDE = "Quick Guide"; private static final String MENUOP_WIKI = "Wiki"; - private static final Pattern SKILL_REGEX = Pattern.compile("([A-Za-z]+) guide"); - private static final Pattern DIARY_REGEX = Pattern.compile("([A-Za-z &]+) Journal"); - @Inject private SpriteManager spriteManager; @@ -164,12 +160,14 @@ public class WikiPlugin extends Plugin icon.setOriginalHeight(16); icon.setTargetVerb("Lookup"); icon.setName("Wiki"); - icon.setClickMask(WidgetConfig.USE_GROUND_ITEM | WidgetConfig.USE_ITEM | WidgetConfig.USE_NPC | WidgetConfig.USE_OBJECT); + icon.setClickMask(WidgetConfig.USE_GROUND_ITEM | WidgetConfig.USE_ITEM | WidgetConfig.USE_NPC + | WidgetConfig.USE_OBJECT | WidgetConfig.USE_WIDGET); icon.setNoClickThrough(true); icon.setOnTargetEnterListener((JavaScriptCallback) ev -> { wikiSelected = true; icon.setSpriteId(WikiSprite.WIKI_SELECTED_ICON.getSpriteId()); + client.setAllWidgetsAreOpTargetable(true); }); icon.setAction(5, "Search"); // Start at option 5 so the target op is ontop icon.setOnOpListener((JavaScriptCallback) ev -> @@ -188,6 +186,8 @@ public class WikiPlugin extends Plugin private void onDeselect() { + client.setAllWidgetsAreOpTargetable(false); + wikiSelected = false; if (icon != null) { @@ -198,6 +198,7 @@ public class WikiPlugin extends Plugin @Subscribe private void onMenuOptionClicked(MenuOptionClicked ev) { + optarget: if (wikiSelected) { onDeselect(); @@ -211,6 +212,9 @@ public class WikiPlugin extends Plugin switch (ev.getMenuAction()) { + case RUNELITE: + // This is a quest widget op + break optarget; case CANCEL: return; case ITEM_USE_ON_WIDGET: @@ -245,6 +249,18 @@ public class WikiPlugin extends Plugin location = WorldPoint.fromScene(client, ev.getActionParam(), ev.getWidgetId(), client.getPlane()); break; } + case SPELL_CAST_ON_WIDGET: + Widget w = getWidget(ev.getWidgetId(), ev.getActionParam()); + + if (w.getType() == WidgetType.GRAPHIC && w.getItemId() != -1) + { + type = "item"; + id = itemManager.canonicalize(w.getItemId()); + name = itemManager.getItemComposition(id).getName(); + location = null; + break; + } + // fallthrough default: log.info("Unknown menu option: {} {} {}", ev, ev.getMenuAction(), ev.getMenuAction() == MenuAction.CANCEL); return; @@ -293,25 +309,12 @@ public class WikiPlugin extends Plugin LinkBrowser.browse(ub.build().toString()); break; case MENUOP_WIKI: - Matcher skillRegex = WikiPlugin.SKILL_REGEX.matcher(Text.removeTags(ev.getMenuTarget())); - Matcher diaryRegex = WikiPlugin.DIARY_REGEX.matcher(Text.removeTags(ev.getMenuTarget())); + LinkBrowser.browse(WIKI_BASE.newBuilder() + .addPathSegment("w") + .addPathSegment(Text.removeTags(ev.getMenuTarget())) + .addQueryParameter(UTM_SORUCE_KEY, UTM_SORUCE_VALUE) + .build().toString()); - if (skillRegex.find()) - { - LinkBrowser.browse(WIKI_BASE.newBuilder() - .addPathSegment("w") - .addPathSegment(skillRegex.group(1)) - .addQueryParameter(UTM_SORUCE_KEY, UTM_SORUCE_VALUE) - .build().toString()); - } - else if (diaryRegex.find()) - { - LinkBrowser.browse(WIKI_BASE.newBuilder() - .addPathSegment("w") - .addPathSegment(diaryRegex.group(1) + " Diary") - .addQueryParameter(UTM_SORUCE_KEY, UTM_SORUCE_VALUE) - .build().toString()); - } } } } @@ -322,6 +325,16 @@ public class WikiPlugin extends Plugin .build(); } + private Widget getWidget(int wid, int index) + { + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + if (index != -1) + { + w = w.getChild(index); + } + return w; + } + @Subscribe public void onMenuEntryAdded(MenuEntryAdded event) { @@ -329,19 +342,42 @@ public class WikiPlugin extends Plugin int widgetID = event.getActionParam1(); MenuEntry[] menuEntries = client.getMenuEntries(); - if (Ints.contains(QUESTLIST_WIDGET_IDS, widgetID) && "Read Journal:".equals(event.getOption())) + if (wikiSelected && event.getType() == MenuAction.SPELL_CAST_ON_WIDGET.getId()) { + Widget w = getWidget(widgetID, widgetIndex); + if (!(w.getType() == WidgetType.GRAPHIC && w.getItemId() != -1)) + { + // we don't support this widget + // remove the last SPELL_CAST_ON_WIDGET; we can't blindly remove the top action because some other + // plugin might have added something on this same event, and we probably shouldn't remove that instead + MenuEntry[] oldEntries = menuEntries; + menuEntries = Arrays.copyOf(menuEntries, menuEntries.length - 1); + for (int ourEntry = oldEntries.length - 1; + ourEntry >= 2 && oldEntries[oldEntries.length - 1].getType() != MenuAction.SPELL_CAST_ON_WIDGET.getId(); + ourEntry--) + { + menuEntries[ourEntry - 1] = oldEntries[ourEntry]; + } + client.setMenuEntries(menuEntries); + } + } + + if (Ints.contains(QUESTLIST_WIDGET_IDS, widgetID) + && ((wikiSelected && widgetIndex != -1) || "Read Journal:".equals(event.getOption()))) + { + Widget w = getWidget(widgetID, widgetIndex); + String target = w.getName(); menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 2); MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); - menuEntry.setTarget(event.getTarget()); + menuEntry.setTarget(target); menuEntry.setOption(MENUOP_GUIDE); menuEntry.setParam0(widgetIndex); menuEntry.setParam1(widgetID); menuEntry.setType(MenuAction.RUNELITE.getId()); menuEntry = menuEntries[menuEntries.length - 2] = new MenuEntry(); - menuEntry.setTarget(event.getTarget()); + menuEntry.setTarget(target); menuEntry.setOption(MENUOP_QUICKGUIDE); menuEntry.setParam0(widgetIndex); menuEntry.setParam1(widgetID); @@ -350,17 +386,57 @@ public class WikiPlugin extends Plugin client.setMenuEntries(menuEntries); } - if ((WidgetInfo.TO_GROUP(widgetID) == WidgetID.SKILLS_GROUP_ID && event.getOption().startsWith("View")) - || (WidgetInfo.TO_GROUP(widgetID) == WidgetID.DIARY_GROUP_ID && event.getOption().startsWith("Open"))) + if (widgetID == WidgetInfo.ACHIEVEMENT_DIARY_CONTAINER.getId()) { + Widget w = getWidget(widgetID, widgetIndex); + if (w.getActions() == null) + { + return; + } + + String action = Stream.of(w.getActions()) + .filter(s -> s != null && !s.isEmpty()) + .findFirst().orElse(null); + if (action == null) + { + return; + } + menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); - menuEntry.setTarget(event.getOption().replace("View ", "").replace("Open ", "")); + menuEntry.setTarget(action.replace("Open ", "").replace("Journal", "Diary")); + menuEntry.setOption(MENUOP_WIKI); + menuEntry.setParam0(widgetIndex); + menuEntry.setParam1(widgetID); + menuEntry.setType(MenuAction.RUNELITE.getId()); + + client.setMenuEntries(menuEntries); + } + + if (WidgetInfo.TO_GROUP(widgetID) == WidgetInfo.SKILLS_CONTAINER.getGroupId()) + { + Widget w = getWidget(widgetID, widgetIndex); + if (w.getParentId() != WidgetInfo.SKILLS_CONTAINER.getId()) + { + return; + } + + String action = Stream.of(w.getActions()) + .filter(s -> s != null && !s.isEmpty()) + .findFirst().orElse(null); + if (action == null) + { + return; + } + + menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); + + MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); + menuEntry.setTarget(action.replace("View ", "").replace(" guide", "")); menuEntry.setOption(MENUOP_WIKI); menuEntry.setParam0(widgetIndex); menuEntry.setParam1(widgetID); - menuEntry.setIdentifier(event.getIdentifier()); menuEntry.setType(MenuAction.RUNELITE.getId()); client.setMenuEntries(menuEntries); From def32e5bfb31adfa590e19d72c36e84e302b7343 Mon Sep 17 00:00:00 2001 From: Elpan <47849683+Elpan1@users.noreply.github.com> Date: Tue, 22 Oct 2019 20:52:26 +0200 Subject: [PATCH 053/185] world map: fix Prifddinas farming patch tooltip There is no herb patch in Prifddinas --- .../client/plugins/worldmap/FarmingPatchLocation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java index bfb3e446ae..eaadd3a5be 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java @@ -35,13 +35,13 @@ enum FarmingPatchLocation new WorldPoint(3793, 2836, 0), new WorldPoint(1269, 3730, 0) ), + ALLOTMENT_FLOWER("Allotment/Flower", new WorldPoint(3289, 6100, 0)), ALLOTMENT_HERB_FLOWER("Allotment/Herb/Flower", new WorldPoint(1809, 3490, 0), new WorldPoint(3598, 3524, 0), new WorldPoint(3052, 3309, 0), new WorldPoint(2810, 3462, 0), - new WorldPoint(2663, 3375, 0), - new WorldPoint(3289, 6100, 0) + new WorldPoint(2663, 3375, 0) ), ANIMA_HERB("Anima/Herb", new WorldPoint(1235, 3724, 0)), BELLADONNA("Belladonna", new WorldPoint(3084, 3356, 0)), From fbe9f71e706643a4568eb876e2214a5016c56866 Mon Sep 17 00:00:00 2001 From: dekvall Date: Sat, 19 Oct 2019 18:58:54 +0200 Subject: [PATCH 054/185] loottracker: add confirm dialog to reset all --- .../plugins/loottracker/LootTrackerPanel.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 9dc783bab8..39a1b0134a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -40,6 +40,7 @@ import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JMenuItem; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.border.EmptyBorder; @@ -74,6 +75,10 @@ class LootTrackerPanel extends PluginPanel private static final String HTML_LABEL_TEMPLATE = "%s%s"; + private static final String SYNC_RESET_ALL_WARNING_TEXT = + "This will permanently delete the current loot from both the client and the RuneLite website."; + private static final String NO_SYNC_RESET_ALL_WARNING_TEXT = + "This will permanently delete the current loot from the client."; // When there is no loot, display this private final PluginErrorPanel errorPanel = new PluginErrorPanel(); @@ -312,6 +317,18 @@ class LootTrackerPanel extends PluginPanel final JMenuItem reset = new JMenuItem("Reset All"); reset.addActionListener(e -> { + final LootTrackerClient client = plugin.getLootTrackerClient(); + final boolean syncLoot = client != null && config.syncPanel(); + final int result = JOptionPane.showOptionDialog(overallPanel, + syncLoot ? SYNC_RESET_ALL_WARNING_TEXT : NO_SYNC_RESET_ALL_WARNING_TEXT, + "Are you sure?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, + null, new String[]{"Yes", "No"}, "No"); + + if (result != JOptionPane.YES_OPTION) + { + return; + } + // If not in detailed view, remove all, otherwise only remove for the currently detailed title records.removeIf(r -> r.matches(currentView)); boxes.removeIf(b -> b.matches(currentView)); @@ -320,8 +337,7 @@ class LootTrackerPanel extends PluginPanel logsContainer.repaint(); // Delete all loot, or loot matching the current view - LootTrackerClient client = plugin.getLootTrackerClient(); - if (client != null && config.syncPanel()) + if (syncLoot) { client.delete(currentView); } From 1b60dbb5757af168f7f55b2151f5672646425146 Mon Sep 17 00:00:00 2001 From: dekvall Date: Wed, 23 Oct 2019 00:04:54 +0200 Subject: [PATCH 055/185] random events: fix npe on login on login, interactingChanged fires once with both player and target set to null. --- .../client/plugins/randomevents/RandomEventPlugin.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java index bc9cb52977..85aace2e7c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java @@ -118,7 +118,11 @@ public class RandomEventPlugin extends Plugin // Check that the npc is interacting with the player and the player isn't interacting with the npc, so // that the notification doesn't fire from talking to other user's randoms - if (target != player || player.getInteracting() == source || !(source instanceof NPC) || !EVENT_NPCS.contains(((NPC) source).getId())) + if (player == null + || target != player + || player.getInteracting() == source + || !(source instanceof NPC) + || !EVENT_NPCS.contains(((NPC) source).getId())) { return; } From f025082676c454dee9c96f13a8513ec2526489bf Mon Sep 17 00:00:00 2001 From: dekvall Date: Wed, 23 Oct 2019 01:48:41 +0200 Subject: [PATCH 056/185] examine plugin: add pricecheck for trade interface --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 2 ++ .../net/runelite/client/plugins/examine/ExaminePlugin.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) 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 8dc2e13152..a0a6c4bf62 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 @@ -45,6 +45,8 @@ public class WidgetID public static final int GRAND_EXCHANGE_GROUP_ID = 465; public static final int DEPOSIT_BOX_GROUP_ID = 192; public static final int INVENTORY_GROUP_ID = 149; + public static final int PLAYER_TRADE_SCREEN_GROUP_ID = 335; + public static final int PLAYER_TRADE_INVENTORY_GROUP_ID = 336; public static final int FRIENDS_LIST_GROUP_ID = 429; public static final int IGNORE_LIST_GROUP_ID = 432; public static final int RAIDING_PARTY_GROUP_ID = 500; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index 02769cb2a5..73488efd52 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -95,7 +95,6 @@ public class ExaminePlugin extends Plugin @Inject private ScheduledExecutorService executor; - @Subscribe public void onGameStateChanged(GameStateChanged event) { @@ -287,7 +286,9 @@ public class ExaminePlugin extends Plugin || WidgetInfo.CLUE_SCROLL_REWARD_ITEM_CONTAINER.getGroupId() == widgetGroup || WidgetInfo.LOOTING_BAG_CONTAINER.getGroupId() == widgetGroup || WidgetID.SEED_VAULT_INVENTORY_GROUP_ID == widgetGroup - || WidgetID.SEED_BOX_GROUP_ID == widgetGroup) + || WidgetID.SEED_BOX_GROUP_ID == widgetGroup + || WidgetID.PLAYER_TRADE_SCREEN_GROUP_ID == widgetGroup + || WidgetID.PLAYER_TRADE_INVENTORY_GROUP_ID == widgetGroup) { Widget[] children = widget.getDynamicChildren(); if (actionParam < children.length) From 60dee97b02e385d4836228659af0aa2be9ba9975 Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Wed, 23 Oct 2019 00:11:59 +0000 Subject: [PATCH 057/185] project: Update gradle dependencies --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1889f90fec..94aa44e5d5 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ ext { jna = '5.4.0' jogamp = '2.3.2' jopt = '5.0.4' - jooq = '3.12.1' + jooq = '3.12.2' junit = '4.12' jupiter = '5.6.0-M1' logback = '1.2.3' From 7b7d436f007ade619aa16dbe40eb7c344202ab30 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Wed, 23 Oct 2019 08:14:16 +0100 Subject: [PATCH 058/185] clues: fix Shayzien supply armour Sherlock clue --- .../client/plugins/cluescrolls/clues/SkillChallengeClue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java index d563c0c0de..ced104cc30 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java @@ -144,7 +144,7 @@ public class SkillChallengeClue extends ClueScroll implements NpcClueScroll new SkillChallengeClue("Craft multiple cosmic runes from a single essence.", item(ItemID.PURE_ESSENCE)), new SkillChallengeClue("Plant a watermelon seed.", item(ItemID.RAKE), item(ItemID.SEED_DIBBER), xOfItem(ItemID.WATERMELON_SEED, 3)), new SkillChallengeClue("Activate the Chivalry prayer."), - new SkillChallengeClue("Hand in a Tier 2 or higher set of Shayzien supply armour", "hand in a boxed set of shayzien supply armour at tier 2 or above.", any("Shayzien Supply Set (Tier 2 or higher)", item(ItemID.SHAYZIEN_SUPPLY_SET_2), item(ItemID.SHAYZIEN_SUPPLY_SET_3), item(ItemID.SHAYZIEN_SUPPLY_SET_4), item(ItemID.SHAYZIEN_SUPPLY_SET_5))), + new SkillChallengeClue("Hand in a Tier 2 or higher set of Shayzien supply armour", "take the lovakengj armourers a boxed set of shayzien supply armour at tier 2 or above.", any("Shayzien Supply Set (Tier 2 or higher)", item(ItemID.SHAYZIEN_SUPPLY_SET_2), item(ItemID.SHAYZIEN_SUPPLY_SET_3), item(ItemID.SHAYZIEN_SUPPLY_SET_4), item(ItemID.SHAYZIEN_SUPPLY_SET_5))), // Master Sherlock Tasks new SkillChallengeClue("Equip an abyssal whip in front of the abyssal demons of the Slayer Tower.", true, any("Abyssal Whip", item(ItemID.ABYSSAL_WHIP), item(ItemID.FROZEN_ABYSSAL_WHIP), item(ItemID.VOLCANIC_ABYSSAL_WHIP))), new SkillChallengeClue("Smith a runite med helm.", item(ItemID.HAMMER), item(ItemID.RUNITE_BAR)), From 6aea005bfa707b10be3182ba44e50681058839ed Mon Sep 17 00:00:00 2001 From: dekvall Date: Wed, 23 Oct 2019 01:29:32 +0200 Subject: [PATCH 059/185] chat timestamps: add timestamps to split private chat --- .../src/main/scripts/ChatSplitBuilder.rs2asm | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm b/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm index 73badbb543..354aa42e71 100644 --- a/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm +++ b/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm @@ -377,12 +377,17 @@ LABEL327: jump LABEL372 LABEL330: iload 7 + iload 12 ; Load the id of the messageNode + sconst "" ; Push a container for the timestamp + sconst "addTimestamp" ; Push event name + runelite_callback ; Invoke callback + pop_int ; Pop the id of the messageNode sconst "From " sload 1 sconst ":" sconst "privateChatSplitFrom" runelite_callback - join_string 3 + join_string 4 ; Add the timestamp to the message sload 0 iload 9 iload 10 @@ -401,12 +406,17 @@ LABEL330: jump LABEL407 LABEL351: iload 7 + iload 12 ; Load the id of the messageNode + sconst "" ; Push container for the timestamp + sconst "addTimestamp" ; Push event name + runelite_callback ; Invoke callback + pop_int ; Pop the id of the messageNode sconst "To " sload 1 sconst ":" sconst "privateChatSplitTo" runelite_callback - join_string 3 + join_string 4 ; Add the timestamp to the message sload 0 iload 9 iload 10 @@ -425,7 +435,13 @@ LABEL351: jump LABEL407 LABEL372: iload 7 - sload 0 + iload 12 ; Load the id of the messageNode + sconst "" ; Push a container for the timestamp + sconst "addTimestamp" ; Push event name + runelite_callback ; Invoke callback + pop_int ; Pop the id of the messageNode + sload 0 ; Load the log in/out message + join_string 2 ; Add the timestamp to the message iload 9 iload 10 iconst 10682368 From 37e025ed799f15739e0029dff5a3bbac2394c2d7 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 23 Oct 2019 10:03:30 -0400 Subject: [PATCH 060/185] client: update mockito Remove various unused stubbing detected by the newer Mockito version Update references to deprecated Matchers and MockitoJUnitRunner classes --- runelite-client/pom.xml | 4 +- .../client/chat/ChatMessageManagerTest.java | 4 +- .../client/config/ConfigManagerTest.java | 2 +- .../client/game/ItemVariationMappingTest.java | 2 +- .../client/plugins/PluginManagerTest.java | 2 +- .../attackstyles/AttackStylesPluginTest.java | 3 +- .../client/plugins/bank/BankPluginTest.java | 4 +- .../bank/ContainerCalculationTest.java | 4 +- .../plugins/cerberus/CerberusPluginTest.java | 2 +- .../chatcommands/ChatCommandsPluginTest.java | 4 +- .../chatfilter/ChatFilterPluginTest.java | 6 +-- .../ChatNotificationsPluginTest.java | 2 +- .../plugins/cooking/CookingPluginTest.java | 4 +- .../plugins/emojis/EmojiPluginTest.java | 2 +- .../plugins/examine/ExaminePluginTest.java | 6 +-- .../GrandExchangeOfferSlotTest.java | 2 +- .../idlenotifier/IdleNotifierPluginTest.java | 21 +++++----- .../itemcharges/ItemChargePluginTest.java | 4 +- .../ItemsKeptOnDeathPluginTest.java | 2 +- .../MenuEntrySwapperPluginTest.java | 4 +- .../motherlode/MotherlodePluginTest.java | 2 +- .../npchighlight/NpcIndicatorsPluginTest.java | 2 +- .../screenshot/ScreenshotPluginTest.java | 39 +++++++------------ .../plugins/slayer/SlayerPluginTest.java | 7 ++-- .../plugins/smelting/SmeltingPluginTest.java | 2 +- .../plugins/timers/TimersPluginTest.java | 3 +- .../timestamp/TimestampPluginTest.java | 2 +- .../wintertodt/WintertodtPluginTest.java | 2 +- .../xptracker/XpTrackerPluginTest.java | 5 +-- .../overlay/components/TextComponentTest.java | 6 +-- .../components/TooltipComponentTest.java | 2 +- 31 files changed, 65 insertions(+), 91 deletions(-) diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index a35b5065da..ebf7d9280f 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -222,8 +222,8 @@ org.mockito - mockito-all - 1.10.19 + mockito-core + 3.1.0 test diff --git a/runelite-client/src/test/java/net/runelite/client/chat/ChatMessageManagerTest.java b/runelite-client/src/test/java/net/runelite/client/chat/ChatMessageManagerTest.java index b6912fa959..24e3539106 100644 --- a/runelite-client/src/test/java/net/runelite/client/chat/ChatMessageManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/chat/ChatMessageManagerTest.java @@ -37,12 +37,12 @@ import net.runelite.client.config.ChatColorConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.eq; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ChatMessageManagerTest diff --git a/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java b/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java index 63afbbd2a6..14e4b80f06 100644 --- a/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/config/ConfigManagerTest.java @@ -39,7 +39,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ConfigManagerTest diff --git a/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java b/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java index ba67d6b9c2..64d4ec9454 100644 --- a/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java +++ b/runelite-client/src/test/java/net/runelite/client/game/ItemVariationMappingTest.java @@ -31,7 +31,7 @@ import static net.runelite.api.ItemID.*; import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ItemVariationMappingTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java index 93dbeff17c..99c85db67d 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java @@ -58,7 +58,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class PluginManagerTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java index 2060d0d536..f84e1fddad 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/attackstyles/AttackStylesPluginTest.java @@ -46,7 +46,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class AttackStylesPluginTest @@ -161,7 +161,6 @@ public class AttackStylesPluginTest hideWidgetEvent.setKey("removeWarnedStyles"); hideWidgetEvent.setNewValue("false"); attackPlugin.onConfigChanged(hideWidgetEvent); - when(attackConfig.removeWarnedStyles()).thenReturn(false); // verify that the aggressive and accurate attack style widgets are no longer hidden assertFalse(attackPlugin.getHiddenWidgets().get(WeaponType.TYPE_4, diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankPluginTest.java index 974b9dc248..bc9caff9da 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/bank/BankPluginTest.java @@ -44,7 +44,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class BankPluginTest @@ -80,8 +80,6 @@ public class BankPluginTest when(client.getItemContainer(InventoryID.BANK)).thenReturn(itemContainer); ItemComposition comp = mock(ItemComposition.class); - when(comp.getId()) - .thenReturn(itemId); // 60k HA price * 30 = 1.8m when(comp.getPrice()) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java index 8697f78859..ca52a5bff2 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java @@ -42,7 +42,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ContainerCalculationTest @@ -77,8 +77,6 @@ public class ContainerCalculationTest ).toArray(new Item[0]); ItemComposition whipComp = mock(ItemComposition.class); - when(whipComp.getId()) - .thenReturn(ItemID.ABYSSAL_WHIP); when(whipComp.getPrice()) .thenReturn(7); // 7 * .6 = 4, 4 * 1m overflows when(itemManager.getItemComposition(ItemID.ABYSSAL_WHIP)) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java index 4f35f7b174..e4289fa2f2 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java @@ -41,7 +41,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class CerberusPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java index 70a4a98ec1..175fd22a41 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java @@ -38,11 +38,11 @@ import net.runelite.client.config.ConfigManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.eq; import org.mockito.Mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ChatCommandsPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java index 1c9aa48601..9af09b1d63 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatfilter/ChatFilterPluginTest.java @@ -40,7 +40,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ChatFilterPluginTest @@ -132,7 +132,7 @@ public class ChatFilterPluginTest @Test public void testMessageFromFriendIsFiltered() { - when(client.isFriended("Iron Mammal", false)).thenReturn(true); + when(client.isClanMember("Iron Mammal")).thenReturn(false); when(chatFilterConfig.filterFriends()).thenReturn(true); assertTrue(chatFilterPlugin.shouldFilterPlayerMessage("Iron Mammal")); } @@ -148,7 +148,7 @@ public class ChatFilterPluginTest @Test public void testMessageFromClanIsFiltered() { - when(client.isClanMember("B0aty")).thenReturn(true); + when(client.isFriended("B0aty", false)).thenReturn(false); when(chatFilterConfig.filterClan()).thenReturn(true); assertTrue(chatFilterPlugin.shouldFilterPlayerMessage("B0aty")); } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java index 5eda571f9a..de7bbc6e26 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPluginTest.java @@ -45,7 +45,7 @@ import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ChatNotificationsPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java index 1384eb908c..65e9cdd3ed 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/cooking/CookingPluginTest.java @@ -42,12 +42,12 @@ import static org.junit.Assert.assertNotNull; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class CookingPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java index 5fd260b110..326ea07a38 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/emojis/EmojiPluginTest.java @@ -43,7 +43,7 @@ import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java index de5c346980..dccf97258a 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java @@ -42,14 +42,14 @@ import net.runelite.http.api.examine.ExamineClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ExaminePluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java index f947c81ba5..d2c4bc84c1 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java @@ -34,7 +34,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class GrandExchangeOfferSlotTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java index f1f21f2898..0d4114e215 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java @@ -28,6 +28,7 @@ import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.testing.fieldbinder.Bind; import com.google.inject.testing.fieldbinder.BoundFieldModule; +import net.runelite.api.Actor; import net.runelite.api.AnimationID; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -46,16 +47,15 @@ import net.runelite.client.Notifier; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Matchers; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class IdleNotifierPluginTest @@ -195,13 +195,11 @@ public class IdleNotifierPluginTest @Test public void checkCombatReset() { - when(player.getInteracting()).thenReturn(monster); + when(player.getInteracting()).thenReturn(mock(Actor.class)); plugin.onInteractingChanged(new InteractingChanged(player, monster)); plugin.onGameTick(new GameTick()); - when(player.getInteracting()).thenReturn(randomEvent); plugin.onInteractingChanged(new InteractingChanged(player, randomEvent)); plugin.onGameTick(new GameTick()); - when(player.getInteracting()).thenReturn(null); plugin.onInteractingChanged(new InteractingChanged(player, null)); plugin.onGameTick(new GameTick()); verify(notifier, times(0)).notify(any()); @@ -211,7 +209,7 @@ public class IdleNotifierPluginTest public void checkCombatLogout() { plugin.onInteractingChanged(new InteractingChanged(player, monster)); - when(player.getInteracting()).thenReturn(monster); + when(player.getInteracting()).thenReturn(mock(Actor.class)); plugin.onGameTick(new GameTick()); // Logout @@ -226,7 +224,6 @@ public class IdleNotifierPluginTest plugin.onGameStateChanged(gameStateChanged); // Tick - when(player.getInteracting()).thenReturn(null); plugin.onInteractingChanged(new InteractingChanged(player, null)); plugin.onGameTick(new GameTick()); verify(notifier, times(0)).notify(any()); @@ -266,13 +263,13 @@ public class IdleNotifierPluginTest { when(config.getSpecEnergyThreshold()).thenReturn(50); - when(client.getVar(Matchers.eq(VarPlayer.SPECIAL_ATTACK_PERCENT))).thenReturn(400); // 40% + when(client.getVar(eq(VarPlayer.SPECIAL_ATTACK_PERCENT))).thenReturn(400); // 40% plugin.onGameTick(new GameTick()); // once to set lastSpecEnergy to 400 verify(notifier, never()).notify(any()); - when(client.getVar(Matchers.eq(VarPlayer.SPECIAL_ATTACK_PERCENT))).thenReturn(500); // 50% + when(client.getVar(eq(VarPlayer.SPECIAL_ATTACK_PERCENT))).thenReturn(500); // 50% plugin.onGameTick(new GameTick()); - verify(notifier).notify(Matchers.eq("[" + PLAYER_NAME + "] has restored spec energy!")); + verify(notifier).notify(eq("[" + PLAYER_NAME + "] has restored spec energy!")); } @Test diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java index 703b0a7c51..a769cc3784 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java @@ -43,13 +43,13 @@ import net.runelite.client.ui.overlay.OverlayManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.eq; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ItemChargePluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java index 16d3d06016..d9e15ae9a7 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java @@ -46,7 +46,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ItemsKeptOnDeathPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java index fd0fe86f91..d34331e209 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java @@ -40,13 +40,13 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; import org.mockito.Mock; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; import org.mockito.stubbing.Answer; @RunWith(MockitoJUnitRunner.class) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java index 34df2247f3..6646ca5aad 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java @@ -47,7 +47,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class MotherlodePluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java index 87f69cceb3..6b20c0fc3a 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java @@ -38,7 +38,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class NpcIndicatorsPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java index 9aff61c346..631e94dcde 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java @@ -40,7 +40,6 @@ import static net.runelite.api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; import static net.runelite.api.widgets.WidgetInfo.DIALOG_SPRITE_TEXT; import static net.runelite.api.widgets.WidgetInfo.LEVEL_UP_LEVEL; -import static net.runelite.api.widgets.WidgetInfo.PACK; import net.runelite.client.Notifier; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.ui.ClientUI; @@ -49,12 +48,13 @@ import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Matchers; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class ScreenshotPluginTest @@ -101,7 +101,6 @@ public class ScreenshotPluginTest public void before() { Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); - when(screenshotConfig.screenshotRewards()).thenReturn(true); when(screenshotConfig.screenshotLevels()).thenReturn(true); when(screenshotConfig.screenshotValuableDrop()).thenReturn(true); when(screenshotConfig.screenshotUntradeableDrop()).thenReturn(true); @@ -150,7 +149,7 @@ public class ScreenshotPluginTest ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", VALUABLE_DROP, null, 0); screenshotPlugin.onChatMessage(chatMessageEvent); - verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + verify(drawManager).requestNextFrameListener(any(Consumer.class)); } @Test @@ -159,17 +158,14 @@ public class ScreenshotPluginTest ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", UNTRADEABLE_DROP, null, 0); screenshotPlugin.onChatMessage(chatMessageEvent); - verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + verify(drawManager).requestNextFrameListener(any(Consumer.class)); } @Test public void testHitpointsLevel99() { - Widget widget = mock(Widget.class); - when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); - Widget levelChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); + when(client.getWidget(eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); when(levelChild.getText()).thenReturn("Your Hitpoints are now 99."); @@ -182,17 +178,14 @@ public class ScreenshotPluginTest GameTick tick = new GameTick(); screenshotPlugin.onGameTick(tick); - verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + verify(drawManager).requestNextFrameListener(any(Consumer.class)); } @Test public void testFiremakingLevel9() { - Widget widget = mock(Widget.class); - when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); - Widget levelChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); + when(client.getWidget(eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); when(levelChild.getText()).thenReturn("Your Firemaking level is now 9."); @@ -205,17 +198,14 @@ public class ScreenshotPluginTest GameTick tick = new GameTick(); screenshotPlugin.onGameTick(tick); - verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + verify(drawManager).requestNextFrameListener(any(Consumer.class)); } @Test public void testAttackLevel70() { - Widget widget = mock(Widget.class); - when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); - Widget levelChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); + when(client.getWidget(eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); when(levelChild.getText()).thenReturn("Your Attack level is now 70."); @@ -228,17 +218,14 @@ public class ScreenshotPluginTest GameTick tick = new GameTick(); screenshotPlugin.onGameTick(tick); - verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + verify(drawManager).requestNextFrameListener(any(Consumer.class)); } @Test public void testHunterLevel2() { - Widget widget = mock(Widget.class); - when(widget.getId()).thenReturn(PACK(DIALOG_SPRITE_GROUP_ID, 0)); - Widget levelChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(DIALOG_SPRITE_TEXT))).thenReturn(levelChild); + when(client.getWidget(eq(DIALOG_SPRITE_TEXT))).thenReturn(levelChild); when(levelChild.getText()).thenReturn("Congratulations, you've just advanced a Hunter level.

Your Hunter level is now 2."); @@ -251,6 +238,6 @@ public class ScreenshotPluginTest GameTick tick = new GameTick(); screenshotPlugin.onGameTick(tick); - verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); + verify(drawManager).requestNextFrameListener(any(Consumer.class)); } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index 2781ddbb16..fb7e705877 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -55,15 +55,15 @@ import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class SlayerPluginTest @@ -710,7 +710,6 @@ public class SlayerPluginTest public void infoboxNotAddedOnLogin() { when(slayerConfig.taskName()).thenReturn(Task.BLOODVELD.getName()); - when(slayerConfig.showInfobox()).thenReturn(true); GameStateChanged loggingIn = new GameStateChanged(); loggingIn.setGameState(GameState.LOGGING_IN); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java index 1c8573f26c..581307f27f 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/smelting/SmeltingPluginTest.java @@ -37,7 +37,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class SmeltingPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java index 618ad296c1..976b0e2970 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java @@ -45,7 +45,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class TimersPluginTest @@ -114,7 +114,6 @@ public class TimersPluginTest public void testDmmHalfTb() { when(timersConfig.showTeleblock()).thenReturn(true); - when(client.getWorldType()).thenReturn(EnumSet.of(WorldType.DEADMAN)); ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.SPAM, "", DMM_HALF_TELEBLOCK_MESSAGE, "", 0); timersPlugin.onChatMessage(chatMessage); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java index e9033043cf..7520de61fd 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/timestamp/TimestampPluginTest.java @@ -37,7 +37,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class TimestampPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/wintertodt/WintertodtPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/wintertodt/WintertodtPluginTest.java index 7069d4f06a..3abf2f919f 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/wintertodt/WintertodtPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/wintertodt/WintertodtPluginTest.java @@ -42,7 +42,7 @@ import org.mockito.Mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class WintertodtPluginTest diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java index 372b51d9ed..5c1724b1e5 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java @@ -27,13 +27,11 @@ package net.runelite.client.plugins.xptracker; import com.google.inject.Guice; import com.google.inject.testing.fieldbinder.Bind; import com.google.inject.testing.fieldbinder.BoundFieldModule; -import java.util.EnumSet; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.Skill; -import net.runelite.api.WorldType; import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; @@ -48,7 +46,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class XpTrackerPluginTest @@ -85,7 +83,6 @@ public class XpTrackerPluginTest { Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); - when(client.getWorldType()).thenReturn(EnumSet.of(WorldType.MEMBERS)); when(client.getLocalPlayer()).thenReturn(mock(Player.class)); xpTrackerPlugin.setXpPanel(mock(XpPanel.class)); diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java index 067205bd3b..d30b04f681 100644 --- a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java @@ -30,15 +30,15 @@ import java.awt.Graphics2D; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import org.mockito.Mock; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class TextComponentTest diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java index f50bf45530..3248b345f8 100644 --- a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TooltipComponentTest.java @@ -28,7 +28,7 @@ import java.awt.FontMetrics; import static net.runelite.client.ui.overlay.components.TooltipComponent.calculateTextWidth; import static org.junit.Assert.assertEquals; import org.junit.Test; -import static org.mockito.Matchers.anyString; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; From fcbd26bbc9531febaf7171b9c391530e088d17bc Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 11 Oct 2019 20:11:24 +0100 Subject: [PATCH 061/185] menu entry swapper: add shift click teleport spell swap Co-authored-by: Adam --- .../MenuEntrySwapperConfig.java | 10 ++++ .../MenuEntrySwapperPlugin.java | 32 +++++++++++ .../MenuEntrySwapperPluginTest.java | 54 +++++++++++++++++++ 3 files changed, 96 insertions(+) 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 e687522286..13f780a823 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 @@ -311,4 +311,14 @@ public interface MenuEntrySwapperConfig extends Config { return true; } + + @ConfigItem( + keyName = "swapTeleportSpell", + name = "Shift-click teleport spells", + description = "Swap teleport spells that have a second destination on shift" + ) + default boolean swapTeleportSpell() + { + return false; + } } 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 d19b47455f..91fddefb66 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 @@ -604,6 +604,38 @@ public class MenuEntrySwapperPlugin extends Plugin { swap("use", option, target, index); } + + if (shiftModifier && config.swapTeleportSpell()) + { + if (target.equals("varrock teleport")) + { + swapTeleport(target, option, "grand exchange", index); + } + else if (target.equals("camelot teleport")) + { + swapTeleport(target, option, "seers'", index); + } + else if (target.equals("watchtower teleport")) + { + swapTeleport(target, option, "yanille", index); + } + else if (target.equals("teleport to house")) + { + swapTeleport(target, option, "outside", index); + } + } + } + + private void swapTeleport(String target, String option, String optionA, int index) + { + if (option.equals("cast")) + { + swap(optionA, option, target, index); + } + else if (option.equals(optionA)) + { + swap("cast", option, target, index); + } } private static boolean shouldSwapPickpocket(String target) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java index d34331e209..19b101c931 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java @@ -42,6 +42,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import static org.mockito.ArgumentMatchers.any; import org.mockito.Mock; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -209,4 +210,57 @@ public class MenuEntrySwapperPluginTest menu("Pay (north)", "Kragen", MenuAction.NPC_THIRD_OPTION), }, argumentCaptor.getValue()); } + + @Test + public void testTeleport() + { + when(config.swapTeleportSpell()).thenReturn(true); + menuEntrySwapperPlugin.setShiftModifier(true); + + // Cast -> Grand Exchange + entries = new MenuEntry[]{ + menu("Cancel", "", MenuAction.CANCEL), + + menu("Configure", "Varrock Teleport", MenuAction.WIDGET_THIRD_OPTION), + menu("Grand Exchange", "Varrock Teleport", MenuAction.WIDGET_SECOND_OPTION), + menu("Cast", "Varrock Teleport", MenuAction.WIDGET_FIRST_OPTION), + }; + + menuEntrySwapperPlugin.onClientTick(new ClientTick()); + + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(MenuEntry[].class); + verify(client).setMenuEntries(argumentCaptor.capture()); + + assertArrayEquals(new MenuEntry[]{ + menu("Cancel", "", MenuAction.CANCEL), + + menu("Configure", "Varrock Teleport", MenuAction.WIDGET_THIRD_OPTION), + menu("Cast", "Varrock Teleport", MenuAction.WIDGET_FIRST_OPTION), + menu("Grand Exchange", "Varrock Teleport", MenuAction.WIDGET_SECOND_OPTION), + }, argumentCaptor.getValue()); + + clearInvocations(client); + + // Grand Exchange -> Cast + entries = new MenuEntry[]{ + menu("Cancel", "", MenuAction.CANCEL), + + menu("Configure", "Varrock Teleport", MenuAction.WIDGET_THIRD_OPTION), + menu("Cast", "Varrock Teleport", MenuAction.WIDGET_SECOND_OPTION), + menu("Grand Exchange", "Varrock Teleport", MenuAction.WIDGET_FIRST_OPTION), + }; + + menuEntrySwapperPlugin.onClientTick(new ClientTick()); + + argumentCaptor = ArgumentCaptor.forClass(MenuEntry[].class); + verify(client).setMenuEntries(argumentCaptor.capture()); + + assertArrayEquals(new MenuEntry[]{ + menu("Cancel", "", MenuAction.CANCEL), + + menu("Configure", "Varrock Teleport", MenuAction.WIDGET_THIRD_OPTION), + menu("Grand Exchange", "Varrock Teleport", MenuAction.WIDGET_FIRST_OPTION), + menu("Cast", "Varrock Teleport", MenuAction.WIDGET_SECOND_OPTION), + }, argumentCaptor.getValue()); + } } \ No newline at end of file From 90fbd21bd7a1080bee2036fc0293a6d7ee7466da Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Thu, 24 Oct 2019 00:37:42 +0000 Subject: [PATCH 062/185] Client: Update NPC stats --- runelite-client/src/main/resources/npc_stats.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/resources/npc_stats.json b/runelite-client/src/main/resources/npc_stats.json index aba35e940b..f10f40399b 100644 --- a/runelite-client/src/main/resources/npc_stats.json +++ b/runelite-client/src/main/resources/npc_stats.json @@ -1 +1 @@ -{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"slayerLevel":1,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"undead":true},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"99":{"name":"Death wing","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"241":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"242":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"243":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"244":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"245":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"246":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"293":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"294":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"295":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"undead":true},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"466":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"467":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"468":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"473":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"474":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"508":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"509":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"510":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"511":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"512":{"name":"Chaos druid","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,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"518":{"name":"Rogue","hitpoints":17,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"522":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"523":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"524":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"525":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"681":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"720":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"721":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"722":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"723":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"724":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"725":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"726":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"727":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"728":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"slayerLevel":1,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":15,"magic":70},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"undead":true},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22,"undead":true},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"undead":true},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":22,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"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":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1118":{"name":"Man","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"slayerLevel":1,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"slayerLevel":1,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":4,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"slayerLevel":1,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26,"undead":true},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42,"poisonImmune":true},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"slayerLevel":1,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85,"undead":true},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"slayerLevel":1,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1402":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1403":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1404":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1407":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1408":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"slayerLevel":1},"1494":{"name":"Kebbit","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"stab":12,"crush":65,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slash":103,"crush":95,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":75,"slash":75,"crush":75,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4},"1736":{"name":"Brawler","hitpoints":97,"combatLevel":101,"attackSpeed":4},"1737":{"name":"Brawler","hitpoints":113,"combatLevel":129,"attackSpeed":4},"1738":{"name":"Brawler","hitpoints":143,"combatLevel":158,"attackSpeed":4},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":50,"combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":50,"combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1872":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":24,"combatLevel":23,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2058":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2059":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"crush":22,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2143":{"name":"Sraracha","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50,"undead":true},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"slayerLevel":1,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"slayerLevel":1,"attackSpeed":6,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"slayerLevel":1,"attackSpeed":6,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stab":11,"slash":11,"crush":11,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"crush":16,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"slayerLevel":1,"attackSpeed":6,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"slayerLevel":1,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"slayerLevel":1,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"slayerLevel":1,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2504":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2505":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2506":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2527":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2528":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2529":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2530":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2531":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2532":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2533":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2534":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2694":{"name":"Sheep","hitpoints":7,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2885":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"2886":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"2887":{"name":"Asyff","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"2892":{"name":"Brian","hitpoints":27,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stab":11,"slashDef":3,"crushDef":2,"bonusStrength":12},"2916":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"slayerLevel":1,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"undead":true},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"slayerLevel":1,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3078":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3079":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3080":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3081":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3082":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3083":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3084":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3085":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3086":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3087":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3088":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3092":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3093":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3094":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3096":{"name":"Barbarian","combatLevel":7},"3097":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":3,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3098":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3100":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3101":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3102":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3103":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":10,"slash":10,"crush":10,"range":10,"magic":10,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3104":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3105":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3106":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3108":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3112":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14,"demon":true},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20,"demon":true},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"slayerLevel":1,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10,"demon":true},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"slayerLevel":1,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3200":{"name":"Arhein","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3245":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3251":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"3252":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"3255":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3256":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3259":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"3260":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3266":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3267":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","combatLevel":22,"slayerLevel":1,"attackSpeed":4,"undead":true},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true,"undead":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20},"4044":{"name":"Pirate","hitpoints":20},"4045":{"name":"Pirate","hitpoints":20},"4046":{"name":"Pirate","hitpoints":20},"4047":{"name":"Pirate","hitpoints":20},"4048":{"name":"Pirate","hitpoints":20},"4049":{"name":"Pirate","hitpoints":20},"4050":{"name":"Pirate","hitpoints":20},"4051":{"name":"Pirate","hitpoints":20},"4052":{"name":"Pirate","hitpoints":20},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4088":{"name":"Soldier","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"magicLevel":1,"stabDef":15,"slashDef":23,"crushDef":21,"rangeDef":14,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4163":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","combatLevel":81,"attackSpeed":4},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","combatLevel":75,"attackSpeed":4},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15,"undead":true},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4958":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":7,"combatLevel":27,"demon":true},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50,"undead":true},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"slayerLevel":1,"attackSpeed":6},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35,"undead":true},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35,"undead":true},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15,"undead":true},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":64,"combatLevel":31,"slayerLevel":1,"attackSpeed":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270,"poisonImmune":true,"venomImmune":true},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30,"undead":true},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30,"undead":true},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30,"undead":true},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"slayerLevel":1,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5648":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5649":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5650":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5651":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5652":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5653":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5654":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5655":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5873":{"name":"Baby dragon","hitpoints":52,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5947":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5961":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5963":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":2,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":3,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":157,"combatLevel":292,"slayerLevel":1,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":10,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"stab":100,"slash":100,"crush":100,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":198,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320,"demon":true},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220,"demon":true},"6328":{"name":"King Roald (hard)","hitpoints":150,"combatLevel":188,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"slayerLevel":1,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"6389":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":3,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"slayerLevel":1,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"slayerLevel":1,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"slayerLevel":1,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40,"undead":true},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"slayerLevel":1,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"slayerLevel":1,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"slayerLevel":1,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"slayerLevel":1,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"slayerLevel":1,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stab":57,"slashDef":23,"crushDef":22,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":137,"combatLevel":145,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":98,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180,"undead":true},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210,"undead":true},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"slayerLevel":1,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"slayerLevel":1,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"slayerLevel":1,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"magicDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"slayerLevel":1,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6816":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6817":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6818":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6819":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6820":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6821":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6822":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4},"7027":{"name":"Reanimated giant","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":5},"7029":{"name":"Reanimated elf","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7030":{"name":"Reanimated troll","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7031":{"name":"Reanimated horror","hitpoints":35,"slayerLevel":58,"attackSpeed":4},"7032":{"name":"Reanimated kalphite","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4},"7037":{"name":"Reanimated aviansie","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"dragon":true},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"slayerLevel":1,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1,"demon":true},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1,"demon":true},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"demon":true},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"demon":true},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"slayerLevel":1,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"slayerLevel":1,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"slayerLevel":1,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"undead":true},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":109,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"undead":true},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"slayerLevel":1,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"demon":true},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85,"undead":true},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"slayerLevel":1,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true,"demon":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7288":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7290":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7292":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7294":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"undead":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true,"undead":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true,"undead":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true,"undead":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true,"undead":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true,"demon":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"demon":true},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"stabDef":65,"slashDef":80,"crushDef":100,"rangeDef":400,"magicDef":80,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7573":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7604":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7658":{"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":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"slayerLevel":1,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"slayerLevel":1,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"stab":45,"slash":45,"crush":45,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stab":25,"slash":25,"crush":25,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stab":40,"slash":40,"crush":40,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"crush":300,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170,"dragon":true},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stab":50,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":30},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"slayerLevel":1,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5,"undead":true},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"7921":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7922":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"slayerLevel":1,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12,"undead":true},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15,"undead":true},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24,"undead":true},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64,"undead":true},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40,"undead":true},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24,"undead":true},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"slayerLevel":1,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55,"undead":true},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"slayerLevel":1,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60,"undead":true},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50,"undead":true},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"slayerLevel":1,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35,"undead":true},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4,"undead":true},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8428":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8429":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8430":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160,"dragon":true},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9026":{"name":"Crystalline Rat","combatLevel":24,"attackSpeed":4},"9028":{"name":"Crystalline Bat","combatLevel":33,"attackSpeed":4},"9029":{"name":"Crystalline Unicorn","combatLevel":48,"attackSpeed":4},"9030":{"name":"Crystalline Scorpion","combatLevel":64,"attackSpeed":4},"9031":{"name":"Crystalline Wolf","combatLevel":74,"attackSpeed":4},"9032":{"name":"Crystalline Bear","combatLevel":172,"attackSpeed":4},"9033":{"name":"Crystalline Dragon","combatLevel":172,"attackSpeed":4},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9040":{"name":"Corrupted Rat","combatLevel":34,"attackSpeed":4},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4},"9043":{"name":"Corrupted Unicorn","combatLevel":64,"attackSpeed":4},"9044":{"name":"Corrupted Scorpion","combatLevel":89,"attackSpeed":4},"9045":{"name":"Corrupted Wolf","combatLevel":102,"attackSpeed":4},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9047":{"name":"Corrupted Dragon","combatLevel":258,"attackSpeed":4},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9246":{"name":"Arianwyn (hard)","hitpoints":300,"combatLevel":368,"attackSpeed":5,"defenceLevel":102,"rangeLevel":552,"magicLevel":153,"range":126,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":260},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":520,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"9282":{"name":"Basilisk Youngling","hitpoints":60,"combatLevel":57,"slayerLevel":40,"attackSpeed":4,"attackLevel":25,"strengthLevel":40,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"9287":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9288":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9289":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true}} \ No newline at end of file +{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"slayerLevel":1,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"undead":true},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"99":{"name":"Death wing","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"241":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"242":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"243":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"244":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"245":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"246":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"293":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"294":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"295":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"undead":true},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"466":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"467":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"468":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"473":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"474":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"508":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"509":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"510":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"511":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"512":{"name":"Chaos druid","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,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"518":{"name":"Rogue","hitpoints":17,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"522":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"523":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"524":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"525":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"681":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"720":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"721":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"722":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"723":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"724":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"725":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"726":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"727":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"728":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"slayerLevel":1,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":15,"magic":70},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"undead":true},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22,"undead":true},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"undead":true},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":22,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"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":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1118":{"name":"Man","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"slayerLevel":1,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"slayerLevel":1,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":4,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"slayerLevel":1,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26,"undead":true},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42,"poisonImmune":true},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"slayerLevel":1,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85,"undead":true},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"slayerLevel":1,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1402":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1403":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1404":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1407":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1408":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"slayerLevel":1},"1494":{"name":"Kebbit","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"stab":12,"crush":65,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slash":103,"crush":95,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":75,"slash":75,"crush":75,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4},"1736":{"name":"Brawler","hitpoints":97,"combatLevel":101,"attackSpeed":4},"1737":{"name":"Brawler","hitpoints":113,"combatLevel":129,"attackSpeed":4},"1738":{"name":"Brawler","hitpoints":143,"combatLevel":158,"attackSpeed":4},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":50,"combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":50,"combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1872":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":24,"combatLevel":23,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2058":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2059":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"crush":22,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2143":{"name":"Sraracha","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50,"undead":true},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"slayerLevel":1,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"slayerLevel":1,"attackSpeed":6,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"slayerLevel":1,"attackSpeed":6,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stab":11,"slash":11,"crush":11,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"crush":16,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"slayerLevel":1,"attackSpeed":6,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"slayerLevel":1,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"slayerLevel":1,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"slayerLevel":1,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2504":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2505":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2506":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2527":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2528":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2529":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2530":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2531":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2532":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2533":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2534":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2694":{"name":"Sheep","hitpoints":7,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2885":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"2886":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"2887":{"name":"Asyff","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"2892":{"name":"Brian","hitpoints":27,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stab":11,"slashDef":3,"crushDef":2,"bonusStrength":12},"2916":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"slayerLevel":1,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"undead":true},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"slayerLevel":1,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3078":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3079":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3080":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3081":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3082":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3083":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3084":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3085":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3086":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3087":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3088":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3092":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3093":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3094":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3096":{"name":"Barbarian","combatLevel":7},"3097":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":3,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3098":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3100":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3101":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3102":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3103":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":10,"slash":10,"crush":10,"range":10,"magic":10,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3104":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3105":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3106":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3108":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3112":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14,"demon":true},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20,"demon":true},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"slayerLevel":1,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10,"demon":true},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"slayerLevel":1,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3200":{"name":"Arhein","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3245":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3251":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"3252":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"3255":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3256":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3259":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"3260":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3266":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3267":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","combatLevel":22,"slayerLevel":1,"attackSpeed":4,"undead":true},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true,"undead":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20},"4044":{"name":"Pirate","hitpoints":20},"4045":{"name":"Pirate","hitpoints":20},"4046":{"name":"Pirate","hitpoints":20},"4047":{"name":"Pirate","hitpoints":20},"4048":{"name":"Pirate","hitpoints":20},"4049":{"name":"Pirate","hitpoints":20},"4050":{"name":"Pirate","hitpoints":20},"4051":{"name":"Pirate","hitpoints":20},"4052":{"name":"Pirate","hitpoints":20},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4088":{"name":"Soldier","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"magicLevel":1,"stabDef":15,"slashDef":23,"crushDef":21,"rangeDef":14,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4163":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","combatLevel":81,"attackSpeed":4},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","combatLevel":75,"attackSpeed":4},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15,"undead":true},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4958":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":7,"combatLevel":27,"demon":true},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50,"undead":true},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"slayerLevel":1,"attackSpeed":6},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35,"undead":true},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35,"undead":true},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15,"undead":true},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":64,"combatLevel":31,"slayerLevel":1,"attackSpeed":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270,"poisonImmune":true,"venomImmune":true},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30,"undead":true},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30,"undead":true},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30,"undead":true},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"slayerLevel":1,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5648":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5649":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5650":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5651":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5652":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5653":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5654":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5655":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5873":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5947":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5961":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5963":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":3,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":157,"combatLevel":292,"slayerLevel":1,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":10,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"stab":100,"slash":100,"crush":100,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":198,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320,"demon":true},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220,"demon":true},"6328":{"name":"King Roald (hard)","hitpoints":150,"combatLevel":188,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"slayerLevel":1,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"6389":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":3,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"slayerLevel":1,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"slayerLevel":1,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"slayerLevel":1,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40,"undead":true},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"slayerLevel":1,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"slayerLevel":1,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"slayerLevel":1,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"slayerLevel":1,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"slayerLevel":1,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stab":57,"slashDef":23,"crushDef":22,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":137,"combatLevel":145,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":98,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180,"undead":true},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210,"undead":true},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"slayerLevel":1,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"slayerLevel":1,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"slayerLevel":1,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"magicDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"slayerLevel":1,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6816":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6817":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6818":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6819":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6820":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6821":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6822":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4},"7027":{"name":"Reanimated giant","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":5},"7029":{"name":"Reanimated elf","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7030":{"name":"Reanimated troll","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7031":{"name":"Reanimated horror","hitpoints":35,"slayerLevel":58,"attackSpeed":4},"7032":{"name":"Reanimated kalphite","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4},"7037":{"name":"Reanimated aviansie","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"dragon":true},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"slayerLevel":1,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1,"demon":true},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1,"demon":true},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"demon":true},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"demon":true},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"slayerLevel":1,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"slayerLevel":1,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"slayerLevel":1,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"undead":true},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":109,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"undead":true},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"slayerLevel":1,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"demon":true},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85,"undead":true},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"slayerLevel":1,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true,"demon":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7288":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7290":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7292":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7294":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"undead":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true,"undead":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true,"undead":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true,"undead":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true,"undead":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true,"demon":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"demon":true},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"stabDef":65,"slashDef":80,"crushDef":100,"rangeDef":400,"magicDef":80,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7573":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7604":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7658":{"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":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"slayerLevel":1,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"slayerLevel":1,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"stab":45,"slash":45,"crush":45,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stab":25,"slash":25,"crush":25,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stab":40,"slash":40,"crush":40,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"crush":300,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170,"dragon":true},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stab":50,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":30},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"slayerLevel":1,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5,"undead":true},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"7921":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7922":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"slayerLevel":1,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12,"undead":true},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15,"undead":true},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24,"undead":true},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64,"undead":true},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40,"undead":true},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24,"undead":true},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"slayerLevel":1,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55,"undead":true},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"slayerLevel":1,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60,"undead":true},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50,"undead":true},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"slayerLevel":1,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35,"undead":true},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4,"undead":true},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8428":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8429":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8430":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160,"dragon":true},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9026":{"name":"Crystalline Rat","combatLevel":24,"attackSpeed":4},"9028":{"name":"Crystalline Bat","combatLevel":33,"attackSpeed":4},"9029":{"name":"Crystalline Unicorn","combatLevel":48,"attackSpeed":4},"9030":{"name":"Crystalline Scorpion","combatLevel":64,"attackSpeed":4},"9031":{"name":"Crystalline Wolf","combatLevel":74,"attackSpeed":4},"9032":{"name":"Crystalline Bear","combatLevel":172,"attackSpeed":4},"9033":{"name":"Crystalline Dragon","combatLevel":172,"attackSpeed":4},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9040":{"name":"Corrupted Rat","combatLevel":34,"attackSpeed":4},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4},"9043":{"name":"Corrupted Unicorn","combatLevel":64,"attackSpeed":4},"9044":{"name":"Corrupted Scorpion","combatLevel":89,"attackSpeed":4},"9045":{"name":"Corrupted Wolf","combatLevel":102,"attackSpeed":4},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9047":{"name":"Corrupted Dragon","combatLevel":258,"attackSpeed":4},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9246":{"name":"Arianwyn (hard)","hitpoints":300,"combatLevel":368,"attackSpeed":5,"defenceLevel":102,"rangeLevel":552,"magicLevel":153,"range":126,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":260},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":520,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"9282":{"name":"Basilisk Youngling","hitpoints":60,"combatLevel":57,"slayerLevel":40,"attackSpeed":4,"attackLevel":25,"strengthLevel":40,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"9287":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9288":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9289":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true}} \ No newline at end of file From 0cb7b30e29c18ee20cb03800780eee87b075afc4 Mon Sep 17 00:00:00 2001 From: tha23rd <54587508+tha23rd@users.noreply.github.com> Date: Wed, 23 Oct 2019 20:45:43 -0400 Subject: [PATCH 063/185] correctly read pretty printed json --- .../plugins/loottracker/localstorage/LootRecordWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/localstorage/LootRecordWriter.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/localstorage/LootRecordWriter.java index 4e0c5497dc..e5b3faabd9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/localstorage/LootRecordWriter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/localstorage/LootRecordWriter.java @@ -118,7 +118,7 @@ public class LootRecordWriter { totalBrackets++; } - else if (line.contains("}")) + if (line.contains("}")) { totalBrackets--; } From 7639bfffb8ef53a47996b79ba6c9a7eebcdc3c16 Mon Sep 17 00:00:00 2001 From: tha23rd <54587508+tha23rd@users.noreply.github.com> Date: Wed, 23 Oct 2019 21:05:41 -0400 Subject: [PATCH 064/185] empty commit to restart ci From 83f31b87b79f0ca178c2e74035e57d52294bdafb Mon Sep 17 00:00:00 2001 From: Ganom Date: Wed, 23 Oct 2019 21:24:39 -0400 Subject: [PATCH 065/185] itemskeptondeath: add true risk handling. (#1807) * itemskeptondeath: add true risk handling. * itemmanager: ensure itemManager is grabbing true break value. * itemskeptondeath: update test. * itemskeptondeath: fix test this time. * itemskeptondeath: i hate tests. * itemskeptondeath: kms. * itemreclaimcost: refactor. --- .../net/runelite/client/game/ItemManager.java | 13 +- ...ueBrokenItem.java => ItemReclaimCost.java} | 28 +++-- .../itemskeptondeath/BrokenOnDeathItem.java | 113 ------------------ .../ItemsKeptOnDeathPlugin.java | 53 ++++++-- .../itemskeptondeath/TrueItemValue.java | 45 +++++++ .../plugins/playerscouter/PlayerScouter.java | 8 +- .../ItemsKeptOnDeathPluginTest.java | 5 +- 7 files changed, 126 insertions(+), 139 deletions(-) rename runelite-client/src/main/java/net/runelite/client/game/{PvPValueBrokenItem.java => ItemReclaimCost.java} (81%) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/TrueItemValue.java diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index ff22e90cf9..0415a40518 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -326,12 +326,21 @@ public class ItemManager return (int) Math.max(1, getItemDefinition(itemID).getPrice() * HIGH_ALCHEMY_MULTIPLIER); } - public int getBrokenValue(int itemId) + public int getRepairValue(int itemId) { - PvPValueBrokenItem b = PvPValueBrokenItem.of(itemId); + return getRepairValue(itemId, false); + } + + public int getRepairValue(int itemId, boolean fullValue) + { + final ItemReclaimCost b = ItemReclaimCost.of(itemId); if (b != null) { + if (fullValue || b.getItemID() == GRANITE_MAUL_24225 || b.getItemID() == GRANITE_MAUL_24227) + { + return b.getValue(); + } return (int) (b.getValue() * (75.0f / 100.0f)); } diff --git a/runelite-client/src/main/java/net/runelite/client/game/PvPValueBrokenItem.java b/runelite-client/src/main/java/net/runelite/client/game/ItemReclaimCost.java similarity index 81% rename from runelite-client/src/main/java/net/runelite/client/game/PvPValueBrokenItem.java rename to runelite-client/src/main/java/net/runelite/client/game/ItemReclaimCost.java index e84354f4fc..9b6a1b4cbc 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/PvPValueBrokenItem.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemReclaimCost.java @@ -37,15 +37,21 @@ import net.runelite.api.ItemID; */ @AllArgsConstructor @Getter -public enum PvPValueBrokenItem +public enum ItemReclaimCost { // Capes FIRE_CAPE(ItemID.FIRE_CAPE, 50000), - FIRE_MAX_CAPE(ItemID.FIRE_MAX_CAPE, 50000), + FIRE_MAX_CAPE(ItemID.FIRE_MAX_CAPE, 99000), INFERNAL_CAPE(ItemID.INFERNAL_CAPE, 50000), - INFERNAL_MAX_CAPE(ItemID.INFERNAL_MAX_CAPE, 50000), + INFERNAL_MAX_CAPE(ItemID.INFERNAL_MAX_CAPE, 99000), AVAS_ASSEMBLER(ItemID.AVAS_ASSEMBLER, 75000), - ASSEMBLER_MAX_CAPE(ItemID.ASSEMBLER_MAX_CAPE, 75000), + ASSEMBLER_MAX_CAPE(ItemID.ASSEMBLER_MAX_CAPE, 99000), + IMBUED_GUTHIX_CAPE(ItemID.IMBUED_GUTHIX_CAPE, 75000), + IMBUED_GUTHIX_MAX_CAPE(ItemID.GUTHIX_MAX_CAPE, 99000), + IMBUED_SARADOMIN_CAPE(ItemID.IMBUED_SARADOMIN_CAPE, 75000), + IMBUED_SARADOMIN_MAX_CAPE(ItemID.SARADOMIN_MAX_CAPE, 99000), + IMBUED_ZAMORAK_CAPE(ItemID.IMBUED_ZAMORAK_CAPE, 75000), + IMBUED_ZAMORAK_MAX_CAPE(ItemID.ZAMORAK_MAX_CAPE, 99000), // Defenders BRONZE_DEFENDER(ItemID.BRONZE_DEFENDER, 1000), @@ -90,15 +96,19 @@ public enum PvPValueBrokenItem GOLD_DECORATIVE_LEGS(ItemID.DECORATIVE_ARMOUR_4510, 5000), GOLD_DECORATIVE_SKIRT(ItemID.DECORATIVE_ARMOUR_11895, 5000), GOLD_DECORATIVE_SHIELD(ItemID.DECORATIVE_SHIELD_4512, 5000), - GOLD_DECORATIVE_SWORD(ItemID.DECORATIVE_SWORD_4508, 5000); + GOLD_DECORATIVE_SWORD(ItemID.DECORATIVE_SWORD_4508, 5000), - private static final ImmutableMap idMap; + // Granite Maul + GRANITE_MAUL(ItemID.GRANITE_MAUL_24225, 375000), + GRANITE_MAUL_OR(ItemID.GRANITE_MAUL_24227, 375000); + + private static final ImmutableMap idMap; static { - ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMap.Builder builder = ImmutableMap.builder(); - for (PvPValueBrokenItem items : values()) + for (ItemReclaimCost items : values()) { builder.put(items.itemID, items); } @@ -110,7 +120,7 @@ public enum PvPValueBrokenItem private final int value; @Nullable - public static PvPValueBrokenItem of(int itemId) + public static ItemReclaimCost of(int itemId) { return idMap.get(itemId); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java deleted file mode 100644 index 8512a05541..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * 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.itemskeptondeath; - -import com.google.common.collect.ImmutableMap; -import javax.annotation.Nullable; -import lombok.AllArgsConstructor; -import net.runelite.api.ItemID; - -/** - * Some non tradeable items are kept on death inside low level wilderness (1-20) but are turned into a broken variant. - * - * The non-broken variant will be shown inside the interface. - */ -@AllArgsConstructor -enum BrokenOnDeathItem -{ - // Capes - FIRE_CAPE(ItemID.FIRE_CAPE, 50000), - FIRE_MAX_CAPE(ItemID.FIRE_MAX_CAPE, 50000), - INFERNAL_CAPE(ItemID.INFERNAL_CAPE, 50000), - INFERNAL_MAX_CAPE(ItemID.INFERNAL_MAX_CAPE, 50000), - AVAS_ASSEMBLER(ItemID.AVAS_ASSEMBLER, 75000), - ASSEMBLER_MAX_CAPE(ItemID.ASSEMBLER_MAX_CAPE, 75000), - - // Defenders - BRONZE_DEFENDER(ItemID.BRONZE_DEFENDER, 1000), - IRON_DEFENDER(ItemID.IRON_DEFENDER, 2000), - STEEL_DEFENDER(ItemID.STEEL_DEFENDER, 2500), - BLACK_DEFENDER(ItemID.BLACK_DEFENDER, 5000), - MITHRIL_DEFENDER(ItemID.MITHRIL_DEFENDER, 15000), - ADAMANT_DEFENDER(ItemID.ADAMANT_DEFENDER, 25000), - RUNE_DEFENDER(ItemID.RUNE_DEFENDER, 35000), - DRAGON_DEFENDER(ItemID.DRAGON_DEFENDER, 40000), - AVERNIC_DEFENDER(ItemID.AVERNIC_DEFENDER, 1000000), - - // Void - VOID_MAGE_HELM(ItemID.VOID_MAGE_HELM, 40000), - VOID_RANGER_HELM(ItemID.VOID_RANGER_HELM, 40000), - VOID_MELEE_HELM(ItemID.VOID_MELEE_HELM, 40000), - VOID_KNIGHT_TOP(ItemID.VOID_KNIGHT_TOP, 45000), - VOID_KNIGHT_ROBE(ItemID.VOID_KNIGHT_ROBE, 45000), - VOID_KNIGHT_GLOVES(ItemID.VOID_KNIGHT_GLOVES, 30000), - ELITE_VOID_TOP(ItemID.ELITE_VOID_TOP, 50000), - ELITE_VOID_ROBE(ItemID.ELITE_VOID_ROBE, 50000), - - // Barb Assault - FIGHTER_HAT(ItemID.FIGHTER_HAT, 45000), - RANGER_HAT(ItemID.RANGER_HAT, 45000), - HEALER_HAT(ItemID.HEALER_HAT, 45000), - FIGHTER_TORSO(ItemID.FIGHTER_TORSO, 50000), - PENANCE_SKIRT(ItemID.PENANCE_SKIRT, 20000), - - // Castle Wars - SARADOMIN_HALO(ItemID.SARADOMIN_HALO, 25000), - ZAMORAK_HALO(ItemID.ZAMORAK_HALO, 25000), - GUTHIX_HALO(ItemID.GUTHIX_HALO, 25000), - DECORATIVE_MAGIC_HAT(ItemID.DECORATIVE_ARMOUR_11898, 5000), - DECORATIVE_MAGIC_ROBE_TOP(ItemID.DECORATIVE_ARMOUR_11896, 5000), - DECORATIVE_MAGIC_ROBE_LEGS(ItemID.DECORATIVE_ARMOUR_11897, 5000), - DECORATIVE_RANGE_TOP(ItemID.DECORATIVE_ARMOUR_11899, 5000), - DECORATIVE_RANGE_BOTTOM(ItemID.DECORATIVE_ARMOUR_11900, 5000), - DECORATIVE_RANGE_QUIVER(ItemID.DECORATIVE_ARMOUR_11901, 5000), - GOLD_DECORATIVE_HELM(ItemID.DECORATIVE_HELM_4511, 5000), - GOLD_DECORATIVE_BODY(ItemID.DECORATIVE_ARMOUR_4509, 5000), - GOLD_DECORATIVE_LEGS(ItemID.DECORATIVE_ARMOUR_4510, 5000), - GOLD_DECORATIVE_SKIRT(ItemID.DECORATIVE_ARMOUR_11895, 5000), - GOLD_DECORATIVE_SHIELD(ItemID.DECORATIVE_SHIELD_4512, 5000), - GOLD_DECORATIVE_SWORD(ItemID.DECORATIVE_SWORD_4508, 5000); - - private final int itemID; - private final int repairPrice; - - private static final ImmutableMap REPAIR_MAP; - - static - { - final ImmutableMap.Builder map = new ImmutableMap.Builder<>(); - for (final BrokenOnDeathItem p : values()) - { - map.put(p.itemID, p.repairPrice); - } - REPAIR_MAP = map.build(); - } - - @Nullable - static Integer getRepairPrice(int itemId) - { - return REPAIR_MAP.get(itemId); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java index 8d80b5cf13..6cbee4b19e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java @@ -26,7 +26,9 @@ package net.runelite.client.plugins.itemskeptondeath; import com.google.common.annotations.VisibleForTesting; +import java.awt.Color; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; @@ -44,8 +46,8 @@ import net.runelite.api.Constants; import net.runelite.api.FontID; import net.runelite.api.InventoryID; import net.runelite.api.Item; -import net.runelite.api.ItemDefinition; import net.runelite.api.ItemContainer; +import net.runelite.api.ItemDefinition; import net.runelite.api.ItemID; import net.runelite.api.ScriptID; import net.runelite.api.SkullIcon; @@ -60,8 +62,10 @@ import net.runelite.api.widgets.WidgetType; import net.runelite.client.eventbus.EventBus; import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemMapping; +import net.runelite.client.game.ItemReclaimCost; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.util.ColorUtil; import net.runelite.client.util.QuantityFormatter; @PluginDescriptor( @@ -354,7 +358,7 @@ public class ItemsKeptOnDeathPlugin extends Plugin if (!Pets.isPet(id) && !LostIfNotProtected.isLostIfNotProtected(id) && !isTradeable(itemManager.getItemDefinition(id)) && wildyLevel <= DEEP_WILDY - && (wildyLevel <= 0 || BrokenOnDeathItem.getRepairPrice(i.getId()) != null)) + && (wildyLevel <= 0 || ItemReclaimCost.of(id) != null)) { keptItems.add(new ItemStack(id, qty)); } @@ -460,10 +464,10 @@ public class ItemsKeptOnDeathPlugin extends Plugin } // Jagex uses the repair price when determining which items are kept on death. - final Integer repairPrice = BrokenOnDeathItem.getRepairPrice(canonicalizedItemId); + final ItemReclaimCost repairPrice = ItemReclaimCost.of(canonicalizedItemId); if (repairPrice != null) { - exchangePrice = repairPrice; + exchangePrice = repairPrice.getValue(); } if (exchangePrice == 0) @@ -573,20 +577,51 @@ public class ItemsKeptOnDeathPlugin extends Plugin textWidget.revalidate(); // Update Items lost total value - long total = 0; + long theyGet = 0; + long youLose = 0; + for (final Widget w : lostItems) { - int cid = itemManager.canonicalize(w.getItemId()); + final int cid = itemManager.canonicalize(w.getItemId()); + final TrueItemValue trueItemValue = TrueItemValue.map(cid); + final Collection mapping = ItemMapping.map(cid); + final int breakValue = itemManager.getRepairValue(cid); + + if (breakValue != 0) + { + youLose -= breakValue; + theyGet += breakValue; + } + + if (trueItemValue != null) + { + int truePrice = 0; + + for (int id : trueItemValue.getDeconstructedItem()) + { + if (mapping.contains(id)) + { + continue; + } + truePrice += itemManager.getItemPrice(id); + } + + youLose += truePrice; + } + int price = itemManager.getItemPrice(cid); - if (price == 0) + + if (price == 0 && breakValue == 0) { // Default to alch price price = (int) (itemManager.getItemDefinition(cid).getPrice() * Constants.HIGH_ALCHEMY_MULTIPLIER); } - total += (long) price * w.getItemQuantity(); + + theyGet += (long) price * w.getItemQuantity(); } final Widget lostValue = client.getWidget(WidgetInfo.ITEMS_LOST_VALUE); - lostValue.setText(QuantityFormatter.quantityToStackSize(total) + " gp"); + lostValue.setText("They get: " + QuantityFormatter.quantityToStackSize(theyGet) + + "
You lose: " + ColorUtil.prependColorTag("(" + QuantityFormatter.quantityToStackSize(theyGet + youLose) + ")", Color.red)); // Update Max items kept final Widget max = client.getWidget(WidgetInfo.ITEMS_KEPT_MAX); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/TrueItemValue.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/TrueItemValue.java new file mode 100644 index 0000000000..8dc5522417 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/TrueItemValue.java @@ -0,0 +1,45 @@ +package net.runelite.client.plugins.itemskeptondeath; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.util.Set; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import static net.runelite.api.ItemID.ABYSSAL_TENTACLE; +import static net.runelite.api.ItemID.ABYSSAL_WHIP; +import static net.runelite.api.ItemID.GRANITE_CLAMP; +import static net.runelite.api.ItemID.GRANITE_MAUL; +import static net.runelite.api.ItemID.GRANITE_MAUL_24225; +import static net.runelite.api.ItemID.GRANITE_MAUL_24227; +import static net.runelite.api.ItemID.KRAKEN_TENTACLE; +import static net.runelite.api.ItemID.ORNATE_MAUL_HANDLE; + +@Getter +@RequiredArgsConstructor +public enum TrueItemValue +{ + GRANITE_MAUL_HANDLE(GRANITE_MAUL_24225, ImmutableSet.of(ORNATE_MAUL_HANDLE, GRANITE_MAUL)), + GRANITE_MAUL_HANDLE_OR(GRANITE_MAUL_24227, ImmutableSet.of(ORNATE_MAUL_HANDLE, GRANITE_MAUL, GRANITE_CLAMP)), + TENTACLE_WHIP(ABYSSAL_TENTACLE, ImmutableSet.of(ABYSSAL_WHIP, KRAKEN_TENTACLE)); + + private static final ImmutableMap TRUE_ITEM_VALUE_MAP; + + private final int itemID; + private final Set deconstructedItem; + + static + { + ImmutableMap.Builder map = ImmutableMap.builder(); + for (TrueItemValue p : values()) + { + map.put(p.getItemID(), p); + } + TRUE_ITEM_VALUE_MAP = map.build(); + } + + public static TrueItemValue map(int itemId) + { + return TRUE_ITEM_VALUE_MAP.getOrDefault(itemId, null); + } +} + diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java index 0660c1c264..31ea047b43 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerscouter/PlayerScouter.java @@ -63,7 +63,7 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemMapping; -import net.runelite.client.game.PvPValueBrokenItem; +import net.runelite.client.game.ItemReclaimCost; import net.runelite.client.game.WorldLocation; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -370,10 +370,10 @@ public class PlayerScouter extends Plugin continue; } - if (PvPValueBrokenItem.breaksOnDeath(id)) + if (ItemReclaimCost.breaksOnDeath(id)) { - prices.put(id, itemManager.getBrokenValue(id)); - log.debug("Item has a broken value: Id {}, Value {}", id, itemManager.getBrokenValue(id)); + prices.put(id, itemManager.getRepairValue(id)); + log.debug("Item has a broken value: Id {}, Value {}", id, itemManager.getRepairValue(id)); continue; } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java index 2b5f812595..0a60baffaa 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java @@ -36,6 +36,7 @@ import net.runelite.api.Item; import net.runelite.api.ItemDefinition; import net.runelite.api.ItemID; import net.runelite.client.game.ItemManager; +import net.runelite.client.game.ItemReclaimCost; import static net.runelite.client.plugins.itemskeptondeath.ItemsKeptOnDeathPlugin.DeathItems; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -637,8 +638,8 @@ public class ItemsKeptOnDeathPluginTest { final Item defender = mItem(ItemID.AVERNIC_DEFENDER, 1, "Avernic defender", false, 0); final int defenderOffset = FixedPriceItem.AVERNIC_DEFENDER.getOffset(); - final Integer defenderBrokenPrice = BrokenOnDeathItem.getRepairPrice(ItemID.AVERNIC_DEFENDER); - final int defenderExpectedPrice = (defenderBrokenPrice == null ? 0 : defenderBrokenPrice) + defenderOffset; + final ItemReclaimCost defenderBrokenPrice = ItemReclaimCost.of(ItemID.AVERNIC_DEFENDER); + final int defenderExpectedPrice = (defenderBrokenPrice == null ? 0 : defenderBrokenPrice.getValue()) + defenderOffset; assertEquals(defenderExpectedPrice, plugin.getDeathPrice(defender)); final Item[] inv = new Item[] From 45c0774093ce9d105a45d46754c4beb518d208b4 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Thu, 24 Oct 2019 06:47:13 +0200 Subject: [PATCH 066/185] project: volumes support --- .../main/java/net/runelite/api/Client.java | 36 +++ .../runelite/api/events/VolumeChanged.java | 35 +++ .../client/plugins/music/MusicConfig.java | 89 ++++++ .../MusicPlugin.java} | 266 +++++++++++++++++- .../net/runelite/mixins/RSClientMixin.java | 11 +- .../java/net/runelite/rs/api/RSClient.java | 21 ++ .../net/runelite/rs/api/RSScriptEvent.java | 3 + .../java/net/runelite/rs/api/RSWidget.java | 16 ++ runescape-client/src/main/java/Client.java | 16 +- .../src/main/java/ClientPacket.java | 4 +- ...dExchangeOfferTotalQuantityComparator.java | 2 +- .../src/main/java/HealthBarUpdate.java | 6 +- .../src/main/java/InvDefinition.java | 4 +- .../src/main/java/KeyHandler.java | 2 +- .../src/main/java/MusicPatchNode2.java | 4 +- runescape-client/src/main/java/NetSocket.java | 19 +- runescape-client/src/main/java/class3.java | 4 +- runescape-client/src/main/java/class30.java | 2 +- 18 files changed, 496 insertions(+), 44 deletions(-) create mode 100644 runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java rename runelite-client/src/main/java/net/runelite/client/plugins/{musiclist/MusicListPlugin.java => music/MusicPlugin.java} (55%) 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 d7bd5efcc1..a12a2bec3f 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -952,6 +952,42 @@ public interface Client extends GameShell */ List getGraphicsObjects(); + /** + * Gets the music volume + * @return volume 0-255 inclusive + */ + int getMusicVolume(); + + /** + * Sets the music volume + * @param volume 0-255 inclusive + */ + void setMusicVolume(int volume); + + /** + * Gets the sound effect volume + * @return volume 0-127 inclusive + */ + int getSoundEffectVolume(); + + /** + * Sets the sound effect volume + * @param volume 0-127 inclusive + */ + void setSoundEffectVolume(int volume); + + /** + * Gets the area sound effect volume + * @return volume 0-127 inclusive + */ + int getAreaSoundEffectVolume(); + + /** + * Sets the area sound effect volume + * @param volume 0-127 inclusive + */ + void setAreaSoundEffectVolume(int volume); + /** * Play a sound effect at the player's current location. This is how UI, * and player-generated (e.g. mining, woodcutting) sound effects are diff --git a/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java new file mode 100644 index 0000000000..7f846cd214 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.events; + +public class VolumeChanged implements Event +{ + public static final VolumeChanged INSTANCE = new VolumeChanged(); + + private VolumeChanged() + { + // noop + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java new file mode 100644 index 0000000000..fa2ebbcbbd --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.music; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("music") +public interface MusicConfig extends Config +{ + @ConfigItem( + keyName = "musicVolume", + name = "", + description = "", + hidden = true + ) + default int getMusicVolume() + { + return 0; + } + + @ConfigItem( + keyName = "musicVolume", + name = "", + description = "", + hidden = true + ) + void setMusicVolume(int vol); + + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getSoundEffectVolume() + { + return 0; + } + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setSoundEffectVolume(int val); + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getAreaSoundEffectVolume() + { + return 0; + } + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setAreaSoundEffectVolume(int vol); +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java similarity index 55% rename from runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 63bcb717ad..5d251e19ae 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2019, Anthony Chen + * Copyright (c) 2019, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,33 +23,43 @@ * (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.musiclist; +package net.runelite.client.plugins.music; +import com.google.inject.Provides; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.function.BiConsumer; +import java.util.function.ToIntFunction; import java.util.stream.Collectors; import javax.inject.Inject; -import javax.inject.Singleton; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.ScriptID; import net.runelite.api.SoundEffectID; import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VolumeChanged; import net.runelite.api.events.WidgetLoaded; -import net.runelite.api.vars.InterfaceTab; import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetConfig; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetPositionMode; import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.game.chatbox.ChatboxTextInput; @@ -56,11 +67,11 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @PluginDescriptor( - name = "Music List", - description = "Adds search and filter for the music list" + name = "Music", + description = "Adds search and filter for the music list, and additional volume control" ) -@Singleton -public class MusicListPlugin extends Plugin +@Slf4j +public class MusicPlugin extends Plugin { @Inject private Client client; @@ -68,6 +79,9 @@ public class MusicListPlugin extends Plugin @Inject private ClientThread clientThread; + @Inject + private MusicConfig musicConfig; + @Inject private ChatboxPanelManager chatboxPanelManager; @@ -88,14 +102,17 @@ public class MusicListPlugin extends Plugin { addSubscriptions(); - clientThread.invoke(this::addMusicButtons); + clientThread.invoke(() -> + { + addMusicButtons(); + applyMusicVolumeConfig(); + updateMusicOptions(); + }); } @Override protected void shutDown() { - eventBus.unregister(this); - Widget header = client.getWidget(WidgetInfo.MUSIC_WINDOW); if (header != null) { @@ -103,13 +120,24 @@ public class MusicListPlugin extends Plugin } tracks = null; + + clientThread.invoke(this::teardownMusicOptions); + } + + @Provides + MusicConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(MusicConfig.class); } private void addSubscriptions() { + eventBus.subscribe(ConfigChanged.class, this, this::onConfigChanged); eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); eventBus.subscribe(WidgetLoaded.class, this, this::onWidgetLoaded); eventBus.subscribe(VarClientIntChanged.class, this, this::onVarClientIntChanged); + eventBus.subscribe(VolumeChanged.class, this, this::onVolumeChanged); + eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent); } private void onGameStateChanged(GameStateChanged gameStateChanged) @@ -132,6 +160,10 @@ public class MusicListPlugin extends Plugin currentMusicFilter = MusicState.ALL; addMusicButtons(); } + if (widgetLoaded.getGroupId() == WidgetID.OPTIONS_GROUP_ID) + { + updateMusicOptions(); + } } private void addMusicButtons() @@ -181,9 +213,48 @@ public class MusicListPlugin extends Plugin } } + + private void onVolumeChanged(VolumeChanged volumeChanged) + { + applyMusicVolumeConfig(); + } + + private void onConfigChanged(ConfigChanged configChanged) + { + if (configChanged.getGroup().equals("music")) + { + clientThread.invokeLater(this::applyMusicVolumeConfig); + } + } + + private void applyMusicVolumeConfig() + { + log.info("applyMusicVolumeConfig"); + + int musicVolume = musicConfig.getMusicVolume(); + if (musicVolume > 0) + { + client.setMusicVolume(musicVolume - 1); + } + + int soundEffectVolume = musicConfig.getSoundEffectVolume(); + if (soundEffectVolume > 0) + { + client.setSoundEffectVolume(soundEffectVolume - 1); + } + + int areaSoundEffectVolume = musicConfig.getAreaSoundEffectVolume(); + if (areaSoundEffectVolume > 0) + { + client.setAreaSoundEffectVolume(areaSoundEffectVolume - 1); + } + + updateMusicOptions(); + } + private boolean isOnMusicTab() { - return client.getVar(VarClientInt.INTERFACE_TAB) == InterfaceTab.MUSIC.getId(); + return client.getVar(VarClientInt.INTERFACE_TAB) == 13; } private boolean isChatboxOpen() @@ -304,4 +375,175 @@ public class MusicListPlugin extends Plugin private final String name; private final int spriteID; } -} + + @RequiredArgsConstructor + @Getter + private enum MusicSlider + { + MUSIC(WidgetInfo.OPTIONS_MUSIC_SLIDER, VarPlayer.MUSIC_VOLUME, MusicConfig::getMusicVolume, MusicConfig::setMusicVolume, 255), + AREA(WidgetInfo.OPTIONS_AREA_SOUND_SLIDER, VarPlayer.AREA_EFFECT_VOLUME, MusicConfig::getAreaSoundEffectVolume, MusicConfig::setAreaSoundEffectVolume, 127), + EFFECT(WidgetInfo.OPTIONS_SOUND_EFFECT_SLIDER, VarPlayer.SOUND_EFFECT_VOLUME, MusicConfig::getSoundEffectVolume, MusicConfig::setSoundEffectVolume, 127); + + private final WidgetInfo widgetID; + private final VarPlayer var; + private final ToIntFunction getter; + private final BiConsumer setter; + private final int max; + + @Setter + private Widget handle; + + @Setter + private Widget track; + + private static int PADDING = 8; + + private int getX() + { + return getTrack().getRelativeX() + PADDING; + } + + private int getWidth() + { + return getTrack().getWidth() - (PADDING * 2) - handle.getWidth(); + } + } + + private void teardownMusicOptions() + { + for (MusicSlider slider : MusicSlider.values()) + { + Widget icon = client.getWidget(slider.getWidgetID()); + if (icon == null) + { + return; + } + + if (slider.getHandle() != null) + { + { + Widget handle = slider.getHandle(); + Widget[] siblings = handle.getParent().getChildren(); + if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + { + continue; + } + siblings[slider.getTrack().getIndex()] = null; + siblings[handle.getIndex()] = null; + } + + Object[] init = icon.getOnLoadListener(); + init[1] = slider.getWidgetID().getId(); + + // Readd the var transmit triggers and rerun options_allsounds + client.runScript(init); + slider.setHandle(null); + slider.setTrack(null); + } + } + } + + private void updateMusicOptions() + { + for (MusicSlider slider : MusicSlider.values()) + { + Widget icon = client.getWidget(slider.getWidgetID()); + if (icon == null) + { + return; + } + + Widget handle = slider.getHandle(); + if (handle != null) + { + Widget[] siblings = handle.getParent().getChildren(); + if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + { + handle = null; + } + } + if (handle == null) + { + Object[] init = icon.getOnLoadListener(); + icon.setVarTransmitTrigger((int[]) null); + + Widget track = icon.getParent().createChild(-1, WidgetType.TEXT); + slider.setTrack(track); + handle = icon.getParent().createChild(-1, WidgetType.GRAPHIC); + slider.setHandle(handle); + + { + // First widget of the track + int wid = (Integer) init[2]; + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + + track.setOriginalX(w.getRelativeX()); + track.setOriginalY(w.getRelativeY()); + } + { + // Last widget of the track + int wid = (Integer) init[6]; + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + + track.setOriginalWidth((w.getRelativeX() + w.getWidth()) - track.getOriginalX()); + } + + track.setOriginalHeight(16); + track.setNoClickThrough(true); + track.revalidate(); + + handle.setSpriteId(SpriteID.OPTIONS_ZOOM_SLIDER_THUMB); + handle.setOriginalWidth(16); + handle.setOriginalHeight(16); + handle.setClickMask(WidgetConfig.DRAG); + + JavaScriptCallback move = ev -> + { + int newVal = ((ev.getMouseX() - MusicSlider.PADDING - (slider.getHandle().getWidth() / 2)) * slider.getMax()) + / slider.getWidth(); + if (newVal < 0) + { + newVal = 0; + } + if (newVal > slider.getMax()) + { + newVal = slider.getMax(); + } + + // We store +1 so we can tell the difference between 0 and muted + slider.getSetter().accept(musicConfig, newVal + 1); + applyMusicVolumeConfig(); + }; + + track.setOnClickListener(move); + track.setOnHoldListener(move); + track.setOnReleaseListener(move); + track.setHasListener(true); + + client.runScript(ScriptID.OPTIONS_ALLSOUNDS, -1, init[2], init[3], init[4], init[5], init[6]); + } + + int value = slider.getGetter().applyAsInt(musicConfig) - 1; + if (value <= -1) + { + // Use the vanilla value + value = ((4 - client.getVar(slider.getVar())) * slider.getMax()) / 4; + } + + int newX = ((value * slider.getWidth()) / slider.getMax()) + slider.getX(); + slider.getHandle().setOriginalX(newX); + slider.getHandle().setOriginalY(slider.getTrack().getOriginalY()); + slider.getHandle().revalidate(); + } + } + + private void onScriptCallbackEvent(ScriptCallbackEvent ev) + { + switch (ev.getEventName()) + { + case "optionsAllSounds": + // We have to override this script because it gets invoked periodically from the server + client.getIntStack()[client.getIntStackSize() - 1] = -1; + } + } +} \ No newline at end of file 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 e9e82eabaa..dd6457fe6d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -50,6 +50,7 @@ import net.runelite.api.Ignore; import net.runelite.api.IndexDataBase; import net.runelite.api.IndexedSprite; import net.runelite.api.InventoryID; +import net.runelite.api.MenuEntry; import net.runelite.api.MenuOpcode; import static net.runelite.api.MenuOpcode.PLAYER_EIGTH_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_FIFTH_OPTION; @@ -59,7 +60,6 @@ import static net.runelite.api.MenuOpcode.PLAYER_SECOND_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_SEVENTH_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_SIXTH_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_THIRD_OPTION; -import net.runelite.api.MenuEntry; import net.runelite.api.MessageNode; import net.runelite.api.NPC; import net.runelite.api.Node; @@ -98,6 +98,7 @@ import net.runelite.api.events.PlayerSpawned; import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.UsernameChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.VolumeChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.WidgetPressed; import net.runelite.api.hooks.Callbacks; @@ -1760,7 +1761,6 @@ public abstract class RSClientMixin implements RSClient return modulus; } - @Inject @Override public void setModulus(BigInteger modulus) @@ -1783,4 +1783,11 @@ public abstract class RSClientMixin implements RSClient client.promptCredentials(true); } } + + @Inject + @MethodHook("changeGameOptions") + public static void changeGameOptions(int var0) + { + client.getCallbacks().post(VolumeChanged.class, VolumeChanged.INSTANCE); + } } \ No newline at end of file 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 a0e6506b08..d068563f23 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 @@ -1038,9 +1038,30 @@ public interface RSClient extends RSGameShell, Client @Import("decimator") RSDecimator getSoundEffectResampler(); + @Import("musicVolume") + @Override + int getMusicVolume(); + + @Import("musicVolume") + @Override + void setMusicVolume(int volume); + + @Import("areaSoundEffectVolume") + @Override + int getAreaSoundEffectVolume(); + + @Import("areaSoundEffectVolume") + @Override + void setAreaSoundEffectVolume(int volume); + @Import("soundEffectVolume") + @Override int getSoundEffectVolume(); + @Import("soundEffectVolume") + @Override + void setSoundEffectVolume(int volume); + @Import("viewportWalking") void setViewportWalking(boolean viewportWalking); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java index 06a79327fa..49621b123d 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java @@ -20,4 +20,7 @@ public interface RSScriptEvent extends ScriptEvent @Import("targetName") String getOpbase(); + + @Import("mouseX") + int getMouseX(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index 8965d2e348..f292e9c117 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -496,4 +496,20 @@ public interface RSWidget extends Widget @Import("getSprite") RSSprite getSprite(boolean b); + + @Import("onRelease") + @Override + void setOnReleaseListener(Object[] o); + + @Import("varTransmitTriggers") + @Override + void setVarTransmitTrigger(int[] i); + + @Import("onHold") + @Override + void setOnHoldListener(Object[] o); + + @Import("onClick") + @Override + void setOnClickListener(Object[] o); } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index f4f8b09f7c..5abeff1ee4 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -213,7 +213,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 892519291 ) - static int field868; + @Export("areaSoundEffectVolume") + static int areaSoundEffectVolume; @ObfuscatedName("no") static int[] field820; @ObfuscatedName("nb") @@ -363,7 +364,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -114703177 ) - static int field761; + @Export("musicVolume") + static int musicVolume; @ObfuscatedName("pu") @Export("mapIconYs") static int[] mapIconYs; @@ -1508,11 +1510,11 @@ public final class Client extends GameShell implements Usernamed { destinationX = 0; destinationY = 0; minimapState = 0; - field761 = 255; + musicVolume = 255; field666 = -1; field759 = false; soundEffectVolume = 127; - field868 = 127; + areaSoundEffectVolume = 127; soundEffectCount = 0; soundEffectIds = new int[50]; queuedSoundEffectLoops = new int[50]; @@ -4282,7 +4284,7 @@ public final class Client extends GameShell implements Usernamed { Varps.Varps_main[var5] = var16; } - NetSocket.method3472(var5); + NetSocket.changeGameOptions(var5); field782[++field823 - 1 & 31] = var5; var1.serverPacket = null; return true; @@ -4738,7 +4740,7 @@ public final class Client extends GameShell implements Usernamed { Varps.Varps_main[var16] = var40; } - NetSocket.method3472(var16); + NetSocket.changeGameOptions(var16); field782[++field823 - 1 & 31] = var16; var1.serverPacket = null; return true; @@ -4795,7 +4797,7 @@ public final class Client extends GameShell implements Usernamed { for (var16 = 0; var16 < Varps.Varps_main.length; ++var16) { if (Varps.Varps_temp[var16] != Varps.Varps_main[var16]) { Varps.Varps_main[var16] = Varps.Varps_temp[var16]; - NetSocket.method3472(var16); + NetSocket.changeGameOptions(var16); field782[++field823 - 1 & 31] = var16; } } diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index 4ff2dfbd93..1aa118148e 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -704,8 +704,8 @@ public class ClientPacket implements class181 { ) @Export("playSoundJingle") static void playSoundJingle(int var0, int var1) { - if (Client.field761 != 0 && var0 != -1) { - class83.method2068(ClanMate.archive11, var0, 0, Client.field761, false); + if (Client.musicVolume != 0 && var0 != -1) { + class83.method2068(ClanMate.archive11, var0, 0, Client.musicVolume, false); Client.field759 = true; } diff --git a/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java b/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java index d72e0548e2..e43f97006f 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java @@ -308,7 +308,7 @@ final class GrandExchangeOfferTotalQuantityComparator implements Comparator { var9 = var1.method5511(); if (var38 >= 0 && var4 >= 0 && var38 < 104 && var4 < 104) { var10 = var6 + 1; - if (class223.localPlayer.pathX[0] >= var38 - var10 && class223.localPlayer.pathX[0] <= var10 + var38 && class223.localPlayer.pathY[0] >= var4 - var10 && class223.localPlayer.pathY[0] <= var10 + var4 && Client.field868 != 0 && var7 > 0 && Client.soundEffectCount < 50) { + if (class223.localPlayer.pathX[0] >= var38 - var10 && class223.localPlayer.pathX[0] <= var10 + var38 && class223.localPlayer.pathY[0] >= var4 - var10 && class223.localPlayer.pathY[0] <= var10 + var4 && Client.areaSoundEffectVolume != 0 && var7 > 0 && Client.soundEffectCount < 50) { Client.soundEffectIds[Client.soundEffectCount] = var8; Client.queuedSoundEffectLoops[Client.soundEffectCount] = var7; Client.queuedSoundEffectDelays[Client.soundEffectCount] = var9; diff --git a/runescape-client/src/main/java/HealthBarUpdate.java b/runescape-client/src/main/java/HealthBarUpdate.java index 4808e17910..f708052a85 100644 --- a/runescape-client/src/main/java/HealthBarUpdate.java +++ b/runescape-client/src/main/java/HealthBarUpdate.java @@ -113,7 +113,7 @@ public class HealthBarUpdate extends Node { var8 = 0; } - var2 = (var3 - var8) * Client.field868 / var3; + var2 = (var3 - var8) * Client.areaSoundEffectVolume / var3; } else { var2 = Client.soundEffectVolume; } @@ -151,8 +151,8 @@ public class HealthBarUpdate extends Node { } if (!var12) { - if (Client.field761 != 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, Client.field761, false); + if (Client.musicVolume != 0 && Client.field666 != -1) { + class83.method2068(class225.archive6, Client.field666, 0, Client.musicVolume, false); } Client.field759 = false; diff --git a/runescape-client/src/main/java/InvDefinition.java b/runescape-client/src/main/java/InvDefinition.java index 79415563b7..1417e54281 100644 --- a/runescape-client/src/main/java/InvDefinition.java +++ b/runescape-client/src/main/java/InvDefinition.java @@ -437,7 +437,7 @@ public class InvDefinition extends DualNode { if (var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { int var12 = var14.cs1Instructions[0][1]; Varps.Varps_main[var12] = 1 - Varps.Varps_main[var12]; - NetSocket.method3472(var12); + NetSocket.changeGameOptions(var12); } } else if (opcode == 29) { PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2261, Client.packetWriter.isaacCipher); @@ -448,7 +448,7 @@ public class InvDefinition extends DualNode { int var12 = var14.cs1Instructions[0][1]; if (Varps.Varps_main[var12] != var14.cs1ComparisonValues[0]) { Varps.Varps_main[var12] = var14.cs1ComparisonValues[0]; - NetSocket.method3472(var12); + NetSocket.changeGameOptions(var12); } } } else if (opcode == 30) { diff --git a/runescape-client/src/main/java/KeyHandler.java b/runescape-client/src/main/java/KeyHandler.java index 515a356c44..27f2ff0577 100644 --- a/runescape-client/src/main/java/KeyHandler.java +++ b/runescape-client/src/main/java/KeyHandler.java @@ -320,7 +320,7 @@ public final class KeyHandler implements KeyListener, FocusListener { } else if (var29 == ScriptOpcodes.SET_VARP) { var11 = var6[var17]; Varps.Varps_main[var11] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - NetSocket.method3472(var11); + NetSocket.changeGameOptions(var11); } else if (var29 == ScriptOpcodes.SCONST) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.stringOperands[var17]; } else if (var29 == ScriptOpcodes.JUMP) { diff --git a/runescape-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java index fa0eca9746..a5e9bec39c 100644 --- a/runescape-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -64,9 +64,9 @@ public class MusicPatchNode2 { static void playSong(int var0) { if (var0 == -1 && !Client.field759) { VertexNormal.method2960(); - } else if (var0 != -1 && var0 != Client.field666 && Client.field761 != 0 && !Client.field759) { + } else if (var0 != -1 && var0 != Client.field666 && Client.musicVolume != 0 && !Client.field759) { Archive var1 = class225.archive6; - int var2 = Client.field761; + int var2 = Client.musicVolume; class197.field2386 = 1; class197.musicTrackArchive = var1; class188.musicTrackGroupId = var0; diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index be0b0995ae..42a66bbe21 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -378,7 +378,8 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(II)V", garbageValue = "-1514465632" ) - static final void method3472(int var0) { + @Export("changeGameOptions") + static final void changeGameOptions(int var0) { class325.method6190(); for (ObjectSound var1 = (ObjectSound)ObjectSound.objectSounds.last(); var1 != null; var1 = (ObjectSound)ObjectSound.objectSounds.previous()) { @@ -436,8 +437,8 @@ public final class NetSocket extends AbstractSocket implements Runnable { var3 = 0; } - if (var3 != Client.field761) { - if (Client.field761 == 0 && Client.field666 != -1) { + if (var3 != Client.musicVolume) { + if (Client.musicVolume == 0 && Client.field666 != -1) { class83.method2068(class225.archive6, Client.field666, 0, var3, false); Client.field759 = false; } else if (var3 == 0) { @@ -449,7 +450,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { class49.midiPcmStream.method3760(var3); } - Client.field761 = var3; + Client.musicVolume = var3; } } @@ -489,23 +490,23 @@ public final class NetSocket extends AbstractSocket implements Runnable { if (var4 == 10) { if (var2 == 0) { - Client.field868 = 127; + Client.areaSoundEffectVolume = 127; } if (var2 == 1) { - Client.field868 = 96; + Client.areaSoundEffectVolume = 96; } if (var2 == 2) { - Client.field868 = 64; + Client.areaSoundEffectVolume = 64; } if (var2 == 3) { - Client.field868 = 32; + Client.areaSoundEffectVolume = 32; } if (var2 == 4) { - Client.field868 = 0; + Client.areaSoundEffectVolume = 0; } } diff --git a/runescape-client/src/main/java/class3.java b/runescape-client/src/main/java/class3.java index 0b53609bd4..af233e8cc4 100644 --- a/runescape-client/src/main/java/class3.java +++ b/runescape-client/src/main/java/class3.java @@ -167,13 +167,13 @@ public class class3 implements Enumerated { var5 += var4.y * 128 - var2; } - if (var5 - 64 <= var4.field1061 && Client.field868 != 0 && var0 == var4.plane) { + if (var5 - 64 <= var4.field1061 && Client.areaSoundEffectVolume != 0 && var0 == var4.plane) { var5 -= 64; if (var5 < 0) { var5 = 0; } - int var6 = (var4.field1061 - var5) * Client.field868 / var4.field1061; + int var6 = (var4.field1061 - var5) * Client.areaSoundEffectVolume / var4.field1061; if (var4.stream1 == null) { if (var4.soundEffectId >= 0) { SoundEffect var7 = SoundEffect.readSoundEffect(GrandExchangeOfferAgeComparator.archive4, var4.soundEffectId, 0); diff --git a/runescape-client/src/main/java/class30.java b/runescape-client/src/main/java/class30.java index 32c030e4b6..6c4842bfeb 100644 --- a/runescape-client/src/main/java/class30.java +++ b/runescape-client/src/main/java/class30.java @@ -122,7 +122,7 @@ public class class30 { ) @Export("addSequenceSoundEffect") static void addSequenceSoundEffect(SequenceDefinition var0, int var1, int var2, int var3) { - if (Client.soundEffectCount < 50 && Client.field868 != 0) { + if (Client.soundEffectCount < 50 && Client.areaSoundEffectVolume != 0) { if (var0.soundEffects != null && var1 < var0.soundEffects.length) { int var4 = var0.soundEffects[var1]; if (var4 != 0) { From 6a8fbf9868e41bff3f7dc9975189520b452d613e Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 24 Oct 2019 10:10:08 +0200 Subject: [PATCH 067/185] Narrow down onVolumeChanged to only volume changed's --- .../java/net/runelite/mixins/RSClientMixin.java | 17 ++++++++++++++--- .../main/java/net/runelite/rs/api/RSClient.java | 3 +++ .../net/runelite/rs/api/RSVarpDefinition.java | 9 +++++++++ .../src/main/java/AbstractWorldMapData.java | 3 ++- runescape-client/src/main/java/Client.java | 4 ++-- runescape-client/src/main/java/NetSocket.java | 2 +- 6 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSVarpDefinition.java 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 dd6457fe6d..3886e59522 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1784,10 +1784,21 @@ public abstract class RSClientMixin implements RSClient } } - @Inject - @MethodHook("changeGameOptions") + @Copy("changeGameOptions") + public static void rs$changeGameOptions(int var0) + { + throw new RuntimeException(); + } + + @Replace("changeGameOptions") public static void changeGameOptions(int var0) { - client.getCallbacks().post(VolumeChanged.class, VolumeChanged.INSTANCE); + rs$changeGameOptions(var0); + + int type = client.getVarpDefinition(var0).getType(); + if (type == 3 || type == 4 || type == 10) + { + client.getCallbacks().post(VolumeChanged.class, VolumeChanged.INSTANCE); + } } } \ No newline at end of file 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 d068563f23..d6ea54f4df 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 @@ -1117,4 +1117,7 @@ public interface RSClient extends RSGameShell, Client */ @Import("Login_promptCredentials") void promptCredentials(boolean clearPass); + + @Import("VarpDefinition_get") + RSVarpDefinition getVarpDefinition(int id); } \ No newline at end of file diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSVarpDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSVarpDefinition.java new file mode 100644 index 0000000000..8661abed13 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSVarpDefinition.java @@ -0,0 +1,9 @@ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSVarpDefinition extends RSDualNode +{ + @Import("type") + int getType(); +} diff --git a/runescape-client/src/main/java/AbstractWorldMapData.java b/runescape-client/src/main/java/AbstractWorldMapData.java index efdefeec98..0c2c508ce5 100644 --- a/runescape-client/src/main/java/AbstractWorldMapData.java +++ b/runescape-client/src/main/java/AbstractWorldMapData.java @@ -245,7 +245,8 @@ public abstract class AbstractWorldMapData { signature = "(IB)Liq;", garbageValue = "1" ) - public static VarpDefinition method288(int var0) { + @Export("VarpDefinition_get") + public static VarpDefinition VarpDefinition_get(int var0) { VarpDefinition var1 = (VarpDefinition)VarpDefinition.VarpDefinition_cached.get((long)var0); if (var1 != null) { return var1; diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index 5abeff1ee4..ed958509cf 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -2680,7 +2680,7 @@ public final class Client extends GameShell implements Usernamed { Tiles.friendSystem.clear(); for (var33 = 0; var33 < VarpDefinition.VarpDefinition_fileCount; ++var33) { - VarpDefinition var28 = AbstractWorldMapData.method288(var33); + VarpDefinition var28 = AbstractWorldMapData.VarpDefinition_get(var33); if (var28 != null) { Varps.Varps_temp[var33] = 0; Varps.Varps_main[var33] = 0; @@ -4870,7 +4870,7 @@ public final class Client extends GameShell implements Usernamed { if (ServerPacket.field2099 == var1.serverPacket) { for (var16 = 0; var16 < VarpDefinition.VarpDefinition_fileCount; ++var16) { - VarpDefinition var54 = AbstractWorldMapData.method288(var16); + VarpDefinition var54 = AbstractWorldMapData.VarpDefinition_get(var16); if (var54 != null) { Varps.Varps_temp[var16] = 0; Varps.Varps_main[var16] = 0; diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index 42a66bbe21..9207e17a34 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -388,7 +388,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { } } - int var4 = AbstractWorldMapData.method288(var0).type; + int var4 = AbstractWorldMapData.VarpDefinition_get(var0).type; if (var4 != 0) { int var2 = Varps.Varps_main[var0]; if (var4 == 1) { From d56951e6d719383174904e3163a3060a1a3b90b7 Mon Sep 17 00:00:00 2001 From: Nathaniel Pather <12907920+NathanielPather@users.noreply.github.com> Date: Thu, 24 Oct 2019 19:04:33 +1000 Subject: [PATCH 068/185] npc health: add lvl 44 zombie health (#10121) --- runelite-client/src/main/resources/npc_health.json | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/resources/npc_health.json b/runelite-client/src/main/resources/npc_health.json index 6f39e21f79..a6b92c36a3 100644 --- a/runelite-client/src/main/resources/npc_health.json +++ b/runelite-client/src/main/resources/npc_health.json @@ -6,6 +6,7 @@ "Zombie_13": 22, "Zombie_18": 24, "Zombie_24": 30, + "Zombie_44": 40, "Summoned Zombie_13": 22, "Skeleton_22": 29, "Skeleton_21": 24, From 2e6138b6f615c5d32060ca33e3c9beaafe94bf87 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Sat, 19 Oct 2019 03:23:20 +0100 Subject: [PATCH 069/185] loot tracker: add HA prices Co-authored-by: Erik Rahka --- .../plugins/loottracker/LootTrackerBox.java | 22 ++++++++++--- .../loottracker/LootTrackerConfig.java | 10 ++++++ .../plugins/loottracker/LootTrackerItem.java | 2 ++ .../plugins/loottracker/LootTrackerPanel.java | 13 +++++--- .../loottracker/LootTrackerPlugin.java | 3 ++ .../loottracker/LootTrackerPriceType.java | 31 +++++++++++++++++++ 6 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPriceType.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index 55892d8e34..6438e82c60 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -69,6 +69,7 @@ class LootTrackerBox extends JPanel private final ItemManager itemManager; @Getter(AccessLevel.PACKAGE) private final String id; + private final LootTrackerPriceType priceType; @Getter private final List records = new ArrayList<>(); @@ -82,12 +83,14 @@ class LootTrackerBox extends JPanel final String id, @Nullable final String subtitle, final boolean hideIgnoredItems, + final LootTrackerPriceType priceType, final BiConsumer onItemToggle) { this.id = id; this.itemManager = itemManager; this.onItemToggle = onItemToggle; this.hideIgnoredItems = hideIgnoredItems; + this.priceType = priceType; setLayout(new BorderLayout(0, 1)); setBorder(new EmptyBorder(5, 0, 0, 0)); @@ -261,7 +264,7 @@ class LootTrackerBox extends JPanel continue; } - totalPrice += entry.getGePrice(); + totalPrice += priceType == LootTrackerPriceType.HIGH_ALCHEMY ? entry.getHaPrice() : entry.getGePrice(); int quantity = 0; for (final LootTrackerItem i : items) @@ -278,8 +281,9 @@ class LootTrackerBox extends JPanel { int newQuantity = entry.getQuantity() + quantity; long gePricePerItem = entry.getGePrice() == 0 ? 0 : (entry.getGePrice() / entry.getQuantity()); + long haPricePerItem = entry.getHaPrice() == 0 ? 0 : (entry.getHaPrice() / entry.getQuantity()); - items.add(new LootTrackerItem(entry.getId(), entry.getName(), newQuantity, gePricePerItem * newQuantity, entry.isIgnored())); + items.add(new LootTrackerItem(entry.getId(), entry.getName(), newQuantity, gePricePerItem * newQuantity, haPricePerItem * newQuantity, entry.isIgnored())); } else { @@ -287,7 +291,14 @@ class LootTrackerBox extends JPanel } } - items.sort((i1, i2) -> Long.compare(i2.getGePrice(), i1.getGePrice())); + if (priceType == LootTrackerPriceType.HIGH_ALCHEMY) + { + items.sort((i1, i2) -> Long.compare(i2.getHaPrice(), i1.getHaPrice())); + } + else + { + items.sort((i1, i2) -> Long.compare(i2.getGePrice(), i1.getGePrice())); + } // Calculates how many rows need to be display to fit all items final int rowSize = ((items.size() % ITEMS_PER_ROW == 0) ? 0 : 1) + items.size() / ITEMS_PER_ROW; @@ -353,7 +364,10 @@ class LootTrackerBox extends JPanel final String name = item.getName(); final int quantity = item.getQuantity(); final long gePrice = item.getGePrice(); + final long haPrice = item.getHaPrice(); final String ignoredLabel = item.isIgnored() ? " - Ignored" : ""; - return name + " x " + quantity + " (" + QuantityFormatter.quantityToStackSize(gePrice) + ") " + ignoredLabel; + return "" + name + " x " + quantity + ignoredLabel + + "
GE: " + QuantityFormatter.quantityToStackSize(gePrice) + + "
HA: " + QuantityFormatter.quantityToStackSize(haPrice) + ""; } } 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 bba5994d89..1b212ae81b 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 @@ -49,6 +49,16 @@ public interface LootTrackerConfig extends Config ) void setIgnoredItems(String key); + @ConfigItem( + keyName = "priceType", + name = "Price Type", + description = "What type of price to use for calculating value." + ) + default LootTrackerPriceType priceType() + { + return LootTrackerPriceType.GRAND_EXCHANGE; + } + @ConfigItem( keyName = "saveLoot", name = "Submit loot tracker data", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java index 1ecf28a229..81aedb3a4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java @@ -40,6 +40,8 @@ class LootTrackerItem @Getter private final long gePrice; @Getter + private final long haPrice; + @Getter @Setter private boolean ignored; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index a4f21447f5..59e23dbd96 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -518,7 +518,8 @@ class LootTrackerPanel extends PluginPanel overallPanel.setVisible(true); // Create box - final LootTrackerBox box = new LootTrackerBox(itemManager, record.getTitle(), record.getSubTitle(), hideIgnoredItems, plugin::toggleItem); + final LootTrackerBox box = new LootTrackerBox(itemManager, record.getTitle(), record.getSubTitle(), + hideIgnoredItems, config.priceType(), plugin::toggleItem); box.combine(record); // Create popup menu @@ -594,7 +595,8 @@ class LootTrackerPanel extends PluginPanel private void updateOverall() { long overallKills = 0; - long overallGp = 0; + long overallGe = 0; + long overallHa = 0; for (LootTrackerRecord record : records) { @@ -613,7 +615,8 @@ class LootTrackerPanel extends PluginPanel continue; } - overallGp += item.getGePrice(); + overallGe += item.getGePrice(); + overallHa += item.getHaPrice(); } if (present > 0) @@ -623,7 +626,9 @@ class LootTrackerPanel extends PluginPanel } overallKillsLabel.setText(htmlLabel("Total count: ", overallKills)); - overallGpLabel.setText(htmlLabel("Total value: ", overallGp)); + overallGpLabel.setText(htmlLabel("Total value: ", config.priceType() == LootTrackerPriceType.HIGH_ALCHEMY ? overallHa : overallGe)); + overallGpLabel.setToolTipText("Total GE price: " + QuantityFormatter.formatNumber(overallGe) + + "
Total HA price: " + QuantityFormatter.formatNumber(overallHa) + ""); updateCollapseText(); } 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 cc021c3650..e1fbfb307c 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 @@ -54,6 +54,7 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; +import net.runelite.api.Constants; import net.runelite.api.GameState; import net.runelite.api.InventoryID; import net.runelite.api.ItemComposition; @@ -637,6 +638,7 @@ public class LootTrackerPlugin extends Plugin final ItemComposition itemComposition = itemManager.getItemComposition(itemId); final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemId; final long gePrice = (long) itemManager.getItemPrice(realItemId) * (long) quantity; + final long haPrice = (long) Math.round(itemComposition.getPrice() * Constants.HIGH_ALCHEMY_MULTIPLIER) * (long) quantity; final boolean ignored = ignoredItems.contains(itemComposition.getName()); return new LootTrackerItem( @@ -644,6 +646,7 @@ public class LootTrackerPlugin extends Plugin itemComposition.getName(), quantity, gePrice, + haPrice, ignored); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPriceType.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPriceType.java new file mode 100644 index 0000000000..e23ad8c2f2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPriceType.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2019 Hydrox6 + * 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.loottracker; + +public enum LootTrackerPriceType +{ + GRAND_EXCHANGE, + HIGH_ALCHEMY +} From 5b236b920ee3330d72dc1da25e64a973dcf27b3e Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Sat, 19 Oct 2019 03:25:42 +0100 Subject: [PATCH 070/185] loot tracker: add price type display --- .../client/plugins/loottracker/LootTrackerBox.java | 11 ++++++++++- .../client/plugins/loottracker/LootTrackerConfig.java | 10 ++++++++++ .../client/plugins/loottracker/LootTrackerPanel.java | 10 ++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index 6438e82c60..24e521d3be 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -70,6 +70,7 @@ class LootTrackerBox extends JPanel @Getter(AccessLevel.PACKAGE) private final String id; private final LootTrackerPriceType priceType; + private final boolean showPriceType; @Getter private final List records = new ArrayList<>(); @@ -84,6 +85,7 @@ class LootTrackerBox extends JPanel @Nullable final String subtitle, final boolean hideIgnoredItems, final LootTrackerPriceType priceType, + final boolean showPriceType, final BiConsumer onItemToggle) { this.id = id; @@ -91,6 +93,7 @@ class LootTrackerBox extends JPanel this.onItemToggle = onItemToggle; this.hideIgnoredItems = hideIgnoredItems; this.priceType = priceType; + this.showPriceType = showPriceType; setLayout(new BorderLayout(0, 1)); setBorder(new EmptyBorder(5, 0, 0, 0)); @@ -184,7 +187,13 @@ class LootTrackerBox extends JPanel { buildItems(); - priceLabel.setText(QuantityFormatter.quantityToStackSize(totalPrice) + " gp"); + String priceTypeString = " "; + if (showPriceType) + { + priceTypeString = priceType == LootTrackerPriceType.HIGH_ALCHEMY ? "HA: " : "GE: "; + } + + priceLabel.setText(priceTypeString + QuantityFormatter.quantityToStackSize(totalPrice) + " gp"); priceLabel.setToolTipText(QuantityFormatter.formatNumber(totalPrice) + " gp"); final long kills = getTotalKills(); 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 1b212ae81b..55fee8a6c4 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 @@ -59,6 +59,16 @@ public interface LootTrackerConfig extends Config return LootTrackerPriceType.GRAND_EXCHANGE; } + @ConfigItem( + keyName = "showPriceType", + name = "Show Price Type", + description = "Whether to show a GE: or HA: next to the total values in the tracker" + ) + default boolean showPriceType() + { + return false; + } + @ConfigItem( keyName = "saveLoot", name = "Submit loot tracker data", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 59e23dbd96..6001df2923 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -519,7 +519,7 @@ class LootTrackerPanel extends PluginPanel // Create box final LootTrackerBox box = new LootTrackerBox(itemManager, record.getTitle(), record.getSubTitle(), - hideIgnoredItems, config.priceType(), plugin::toggleItem); + hideIgnoredItems, config.priceType(), config.showPriceType(), plugin::toggleItem); box.combine(record); // Create popup menu @@ -625,8 +625,14 @@ class LootTrackerPanel extends PluginPanel } } + String priceType = ""; + if (config.showPriceType()) + { + priceType = config.priceType() == LootTrackerPriceType.HIGH_ALCHEMY ? "HA " : "GE "; + } + overallKillsLabel.setText(htmlLabel("Total count: ", overallKills)); - overallGpLabel.setText(htmlLabel("Total value: ", config.priceType() == LootTrackerPriceType.HIGH_ALCHEMY ? overallHa : overallGe)); + overallGpLabel.setText(htmlLabel("Total " + priceType + "value: ", config.priceType() == LootTrackerPriceType.HIGH_ALCHEMY ? overallHa : overallGe)); overallGpLabel.setToolTipText("Total GE price: " + QuantityFormatter.formatNumber(overallGe) + "
Total HA price: " + QuantityFormatter.formatNumber(overallHa) + ""); updateCollapseText(); From d4e40b63421f150e536543f651fb279e020284a4 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 18 Oct 2019 02:54:38 +0100 Subject: [PATCH 071/185] clues: make Anagram and Cipher clues check all clue text --- .../plugins/cluescrolls/ClueScrollPlugin.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 47c64a5488..0bbd3b661e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -504,17 +504,6 @@ public class ClueScrollPlugin extends Plugin } } - // (This|The) anagram reveals who to speak to next: - if (text.contains("anagram reveals who to speak to next:")) - { - return AnagramClue.forText(text); - } - - if (text.startsWith("the cipher reveals who to speak to next:")) - { - return CipherClue.forText(text); - } - if (text.startsWith("i'd like to hear some music.")) { return MusicClue.forText(clueScrollText.getText()); @@ -525,6 +514,18 @@ public class ClueScrollPlugin extends Plugin return coordinatesToWorldPoint(text); } + final AnagramClue anagramClue = AnagramClue.forText(text); + if (anagramClue != null) + { + return anagramClue; + } + + final CipherClue cipherClue = CipherClue.forText(text); + if (cipherClue != null) + { + return cipherClue; + } + final CrypticClue crypticClue = CrypticClue.forText(text); if (crypticClue != null) From e2f8f0af32c0b9fac3bb302de75055717961d634 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 24 Oct 2019 12:01:46 +0200 Subject: [PATCH 072/185] Show opponents hp in menu, your target colored, targeting you * --- .../src/main/java/net/runelite/api/Actor.java | 3 + .../main/java/net/runelite/api/Client.java | 3 + .../runelite/client/menus/MenuManager.java | 43 ++- .../opponentinfo/OpponentInfoConfig.java | 46 ++- .../opponentinfo/OpponentInfoOverlay.java | 106 +++--- .../opponentinfo/OpponentInfoPlugin.java | 318 +++++++++++++++++- .../java/net/runelite/rs/api/RSActor.java | 1 + .../java/net/runelite/rs/api/RSClient.java | 4 + 8 files changed, 441 insertions(+), 83 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Actor.java b/runelite-api/src/main/java/net/runelite/api/Actor.java index 9723fc9605..79ca20df88 100644 --- a/runelite-api/src/main/java/net/runelite/api/Actor.java +++ b/runelite-api/src/main/java/net/runelite/api/Actor.java @@ -64,8 +64,11 @@ public interface Actor extends Entity, Locatable * * * @return the actor, null if no interaction is occurring + * + * (getRSInteracting returns the npc/player index, useful for menus) */ Actor getInteracting(); + int getRSInteracting(); /** * Gets the health ratio of the actor. 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 d7bd5efcc1..78e0f58eb1 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -341,9 +341,12 @@ public interface Client extends GameShell * Gets the logged in player instance. * * @return the logged in player + * + * (getLocalPlayerIndex returns the local index, useful for menus/interacting) */ @Nullable Player getLocalPlayer(); + int getLocalPlayerIndex(); /** * Gets the item composition corresponding to an items ID. 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 b7a96caa27..0d0e405229 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 @@ -91,6 +91,8 @@ public class MenuManager private MenuEntry leftClickEntry = null; private MenuEntry firstEntry = null; + private int playerAttackIdx = -1; + @Inject private MenuManager(Client client, EventBus eventBus) { @@ -500,6 +502,29 @@ public class MenuManager return index; } + public int getPlayerAttackOpcode() + { + final String[] playerMenuOptions = client.getPlayerOptions(); + + if (playerAttackIdx != -1 && playerMenuOptions[playerAttackIdx].equals("Attack")) + { + return client.getPlayerMenuTypes()[playerAttackIdx]; + } + + playerAttackIdx = -1; + + for (int i = IDX_LOWER; i < IDX_UPPER; i++) + { + if ("Attack".equals(playerMenuOptions[i])) + { + playerAttackIdx = i; + break; + } + } + + return playerAttackIdx >= 0 ? client.getPlayerMenuTypes()[playerAttackIdx] : -1; + } + /** * Adds to the set of menu entries which when present, will remove all entries except for this one */ @@ -522,7 +547,7 @@ public class MenuManager AbstractComparableEntry entry = newBaseComparableEntry(option, target); - priorityEntries.removeIf(entry::equals); + priorityEntries.remove(entry); } @@ -562,7 +587,7 @@ public class MenuManager public void removePriorityEntry(AbstractComparableEntry entry) { - priorityEntries.removeIf(entry::equals); + priorityEntries.remove(entry); } public void removePriorityEntry(String option) @@ -571,7 +596,7 @@ public class MenuManager AbstractComparableEntry entry = newBaseComparableEntry(option, "", false); - priorityEntries.removeIf(entry::equals); + priorityEntries.remove(entry); } public void removePriorityEntry(String option, boolean strictOption) @@ -581,7 +606,17 @@ public class MenuManager AbstractComparableEntry entry = newBaseComparableEntry(option, "", -1, -1, false, strictOption); - priorityEntries.removeIf(entry::equals); + priorityEntries.remove(entry); + } + + public void addPriorityEntries(Collection entries) + { + priorityEntries.addAll(entries); + } + + public void removePriorityEntries(Collection entries) + { + priorityEntries.removeAll(entries); } /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java index 9f08e128af..af11a32c28 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.opponentinfo; +import java.awt.Color; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; @@ -65,12 +66,47 @@ public interface OpponentInfoConfig extends Config } @ConfigItem( - keyName = "showOpponentsInMenu", - name = "Show opponents in menu", - description = "Marks opponents names in the menu which you are attacking or are attacking you (NPC only)", - position = 3 + keyName = "showAttackersMenu", + name = "Show attackers in menu", + description = "Marks attackers' names in menus with a *
", + position = 3, + warning = "NOTE: This'll also mark people who are following you/interacting with you in any other way. Don't blindly trust this in pvp!" ) - default boolean showOpponentsInMenu() + default boolean showAttackersMenu() + { + return false; + } + + @ConfigItem( + keyName = "showAttackingMenu", + name = "Green main target", + description = "Display main target's name colored in menus (Players and NPCs)", + position = 4, + warning = "NOTE: This'll also show green when following/interacting in any other way. Don't blindly trust this in pvp!" + ) + default boolean showAttackingMenu() + { + return false; + } + + @ConfigItem( + keyName = "attackingColor", + name = "Target color", + description = "The color your target will be highlighted with", + position = 5 + ) + default Color attackingColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "showHitpointsMenu", + name = "Show NPC hp in menu", + description = "Show NPC hp in menu. Useful when barraging", + position = 6 + ) + default boolean showHitpointsMenu() { return false; } 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 e304a2cded..8fb33c8164 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 @@ -36,11 +36,7 @@ import javax.inject.Singleton; import net.runelite.api.Actor; import net.runelite.api.Client; import static net.runelite.api.MenuOpcode.RUNELITE_OVERLAY_CONFIG; -import net.runelite.api.NPC; -import net.runelite.api.Player; import net.runelite.api.Varbits; -import net.runelite.client.game.HiscoreManager; -import net.runelite.client.game.NPCManager; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; @@ -51,7 +47,6 @@ import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.ProgressBarComponent; import net.runelite.client.ui.overlay.components.TitleComponent; import net.runelite.api.util.Text; -import net.runelite.http.api.hiscore.HiscoreResult; @Singleton class OpponentInfoOverlay extends Overlay @@ -61,8 +56,6 @@ class OpponentInfoOverlay extends Overlay private final Client client; private final OpponentInfoPlugin opponentInfoPlugin; - private final HiscoreManager hiscoreManager; - private final NPCManager npcManager; private final PanelComponent panelComponent = new PanelComponent(); @@ -75,15 +68,11 @@ class OpponentInfoOverlay extends Overlay @Inject private OpponentInfoOverlay( final Client client, - final OpponentInfoPlugin opponentInfoPlugin, - final HiscoreManager hiscoreManager, - final NPCManager npcManager) + final OpponentInfoPlugin opponentInfoPlugin) { super(opponentInfoPlugin); this.client = client; this.opponentInfoPlugin = opponentInfoPlugin; - this.hiscoreManager = hiscoreManager; - this.npcManager = npcManager; setPosition(OverlayPosition.TOP_LEFT); setPriority(OverlayPriority.HIGH); @@ -110,23 +99,7 @@ class OpponentInfoOverlay extends Overlay lastHealthScale = opponent.getHealth(); opponentName = Text.removeTags(opponent.getName()); - lastMaxHealth = -1; - if (opponent instanceof NPC) - { - lastMaxHealth = npcManager.getHealth(((NPC) opponent).getId()); - } - else if (opponent instanceof Player) - { - final HiscoreResult hiscoreResult = hiscoreManager.lookupAsync(opponentName, opponentInfoPlugin.getHiscoreEndpoint()); - if (hiscoreResult != null) - { - final int hp = hiscoreResult.getHitpoints().getLevel(); - if (hp > 0) - { - lastMaxHealth = hp; - } - } - } + lastMaxHealth = opponentInfoPlugin.getMaxHp(opponent); final Actor opponentsOpponent = opponent.getInteracting(); if (opponentsOpponent != null @@ -168,37 +141,7 @@ class OpponentInfoOverlay extends Overlay if ((displayStyle == HitpointsDisplayStyle.HITPOINTS || displayStyle == HitpointsDisplayStyle.BOTH) && 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) - // It's able to recover the exact health if maxHealth <= healthScale. - int health = 0; - if (lastRatio > 0) - { - int minHealth = 1; - int maxHealth; - if (lastHealthScale > 1) - { - if (lastRatio > 1) - { - // This doesn't apply if healthRatio = 1, because of the special case in the server calculation that - // health = 0 forces healthRatio = 0 instead of the expected healthRatio = 1 - minHealth = (lastMaxHealth * (lastRatio - 1) + lastHealthScale - 2) / (lastHealthScale - 1); - } - maxHealth = (lastMaxHealth * lastRatio - 1) / (lastHealthScale - 1); - if (maxHealth > lastMaxHealth) - { - maxHealth = lastMaxHealth; - } - } - else - { - // If healthScale is 1, healthRatio will always be 1 unless health = 0 - // so we know nothing about the upper limit except that it can't be higher than maxHealth - maxHealth = lastMaxHealth; - } - // Take the average of min and max possible healths - health = (minHealth + maxHealth + 1) / 2; - } + int health = getExactHp(lastRatio, lastHealthScale, lastMaxHealth); // Show both the hitpoint and percentage values if enabled in the config final ProgressBarComponent.LabelDisplayMode progressBarDisplayMode = displayStyle == HitpointsDisplayStyle.BOTH ? @@ -229,4 +172,47 @@ class OpponentInfoOverlay extends Overlay return panelComponent.render(graphics); } + + static int getExactHp(int ratio, int health, int maxHp) + { + if (ratio < 0 || health <= 0 || maxHp == -1) + { + return -1; + } + + int exactHealth = 0; + + // 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) + // It's able to recover the exact health if maxHealth <= healthScale. + if (ratio > 0) + { + int minHealth = 1; + int maxHealth; + if (health > 1) + { + if (ratio > 1) + { + // This doesn't apply if healthRatio = 1, because of the special case in the server calculation that + // health = 0 forces healthRatio = 0 instead of the expected healthRatio = 1 + minHealth = (maxHp * (ratio - 1) + health - 2) / (health - 1); + } + maxHealth = (maxHp * ratio - 1) / (health - 1); + if (maxHealth > maxHp) + { + maxHealth = maxHp; + } + } + else + { + // If healthScale is 1, healthRatio will always be 1 unless health = 0 + // so we know nothing about the upper limit except that it can't be higher than maxHealth + maxHealth = maxHp; + } + // Take the average of min and max possible healths + exactHealth = (minHealth + maxHealth + 1) / 2; + } + + return exactHealth; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java index f6f63b08d3..26ac5ba219 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java @@ -33,24 +33,33 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.AccessLevel; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.MenuEntry; import net.runelite.api.MenuOpcode; import net.runelite.api.NPC; +import net.runelite.api.Player; import net.runelite.api.WorldType; +import net.runelite.api.events.BeforeRender; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.InteractingChanged; -import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOpened; +import net.runelite.api.util.Text; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; +import net.runelite.client.game.HiscoreManager; +import net.runelite.client.game.NPCManager; +import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ColorUtil; import net.runelite.http.api.hiscore.HiscoreEndpoint; +import net.runelite.http.api.hiscore.HiscoreResult; @PluginDescriptor( name = "Opponent Information", @@ -58,9 +67,12 @@ import net.runelite.http.api.hiscore.HiscoreEndpoint; tags = {"combat", "health", "hitpoints", "npcs", "overlay"} ) @Singleton +@Slf4j public class OpponentInfoPlugin extends Plugin { private static final Duration WAIT = Duration.ofSeconds(5); + private static final Object MENU = new Object(); + private static final int COLOR_TAG_LENGTH = 12; @Inject private Client client; @@ -80,6 +92,15 @@ public class OpponentInfoPlugin extends Plugin @Inject private EventBus eventBus; + @Inject + private HiscoreManager hiscoreManager; + + @Inject + private MenuManager menuManager; + + @Inject + private NPCManager npcManager; + @Getter(AccessLevel.PACKAGE) private HiscoreEndpoint hiscoreEndpoint = HiscoreEndpoint.NORMAL; @@ -95,6 +116,11 @@ public class OpponentInfoPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private boolean showOpponentsOpponent; + private String attackingColTag; + private boolean showAttackers; + private boolean showAttacking; + private boolean showHitpoints; + @Provides OpponentInfoConfig provideConfig(ConfigManager configManager) { @@ -104,6 +130,11 @@ public class OpponentInfoPlugin extends Plugin @Override protected void startUp() throws Exception { + this.attackingColTag = ColorUtil.colorTag(config.attackingColor()); + this.showAttackers = config.showAttackersMenu(); + this.showAttacking = config.showAttackingMenu(); + this.showHitpoints = config.showHitpointsMenu(); + updateConfig(); addSubscriptions(); @@ -115,6 +146,7 @@ public class OpponentInfoPlugin extends Plugin protected void shutDown() throws Exception { eventBus.unregister(this); + eventBus.unregister(MENU); lastOpponent = null; lastTime = null; @@ -128,7 +160,20 @@ public class OpponentInfoPlugin extends Plugin eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); eventBus.subscribe(InteractingChanged.class, this, this::onInteractingChanged); eventBus.subscribe(GameTick.class, this, this::onGameTick); - eventBus.subscribe(MenuEntryAdded.class, this, this::onMenuEntryAdded); + updateMenuSubs(); + } + + private void updateMenuSubs() + { + if (showAttackers || showAttacking || showHitpoints) + { + eventBus.subscribe(BeforeRender.class, MENU, this::onBeforeRender); + eventBus.subscribe(MenuOpened.class, MENU, this::onMenuOpened); + } + else + { + eventBus.unregister(MENU); + } } private void onGameStateChanged(GameStateChanged gameStateChanged) @@ -194,6 +239,25 @@ public class OpponentInfoPlugin extends Plugin return; } + switch (event.getKey()) + { + case "showAttackersMenu": + this.showAttackers = config.showAttackersMenu(); + updateMenuSubs(); + break; + case "showAttackingMenu": + this.showAttacking = config.showAttackingMenu(); + updateMenuSubs(); + break; + case "showHitpointsMenu": + this.showHitpoints = config.showHitpointsMenu(); + updateMenuSubs(); + break; + case "attackingColor": + attackingColTag = ColorUtil.colorTag(config.attackingColor()); + break; + } + updateConfig(); } @@ -204,27 +268,253 @@ public class OpponentInfoPlugin extends Plugin this.showOpponentsOpponent = config.showOpponentsOpponent(); } - private void onMenuEntryAdded(MenuEntryAdded menuEntryAdded) + private void onBeforeRender(BeforeRender event) { - if (menuEntryAdded.getOpcode() != MenuOpcode.NPC_SECOND_OPTION.getId() - || !menuEntryAdded.getOption().equals("Attack") - || !config.showOpponentsInMenu()) + if (client.getMenuOptionCount() <= 0) { return; } - - int npcIndex = menuEntryAdded.getIdentifier(); - NPC npc = client.getCachedNPCs()[npcIndex]; - if (npc == null) + if (client.isMenuOpen()) { + boolean changed = false; + final MenuEntry[] entries = client.getMenuEntries(); + for (final MenuEntry entry : entries) + { + changed |= fixup(entry); + } + + if (changed) + { + client.setMenuEntries(entries); + } return; } - if (npc.getInteracting() == client.getLocalPlayer() || lastOpponent == npc) + final MenuEntry entry = client.getLeftClickMenuEntry(); + if (modify(entry)) { - MenuEntry[] menuEntries = client.getMenuEntries(); - menuEntries[menuEntries.length - 1].setTarget("*" + menuEntryAdded.getTarget()); - client.setMenuEntries(menuEntries); + client.setLeftClickMenuEntry(entry); + } + } + + private void onMenuOpened(MenuOpened event) + { + boolean changed = false; + for (MenuEntry entry : event.getMenuEntries()) + { + changed |= modify(entry); + } + + if (changed) + { + event.setModified(); + } + } + + private boolean modify(MenuEntry entry) + { + if (isNotAttackEntry(entry)) + { + return false; + } + + boolean changed = false; + + int index = entry.getIdentifier(); + Actor actor = getActorFromIndex(index); + + if (actor == null) + { + return false; + } + + if (actor instanceof Player) + { + index -= 32768; + } + + String target = entry.getTarget(); + + if (showAttacking && + client.getLocalPlayer().getRSInteracting() == index) + { + target = attackingColTag + target.substring(COLOR_TAG_LENGTH); + changed = true; + } + + if (showAttackers && + actor.getRSInteracting() - 32768 == client.getLocalPlayerIndex()) + { + target = '*' + target; + changed = true; + } + + if (showHitpoints && + actor.getHealth() > 0) + { + int lvlIndex = target.lastIndexOf("(level-"); + if (lvlIndex != -1) + { + String levelReplacement = getHpString(actor, true); + + target = target.substring(0, lvlIndex) + levelReplacement; + changed = true; + } + } + + if (changed) + { + entry.setTarget(target); + return true; + } + + return false; + } + + private boolean fixup(MenuEntry entry) + { + if (isNotAttackEntry(entry)) + { + return false; + } + + int index = entry.getIdentifier(); + + Actor actor = getActorFromIndex(index); + + if (actor == null) + { + return false; + } + + if (actor instanceof Player) + { + index -= 32768; + } + + String target = entry.getTarget(); + + boolean hasAggro = actor.getRSInteracting() - 32768 == client.getLocalPlayerIndex(); + boolean hadAggro = target.charAt(0) == '*'; + boolean isTarget = client.getLocalPlayer().getRSInteracting() == index; + boolean hasHp = showHitpoints && actor instanceof NPC && actor.getHealth() > 0; + + boolean aggroChanged = showAttackers && hasAggro != hadAggro; + boolean targetChanged = showAttacking && isTarget != target.startsWith(attackingColTag, aggroChanged ? 1 : 0); + boolean hpChanged = showHitpoints && hasHp == target.contains("(level-"); + + if (!aggroChanged && + !targetChanged && + !hasHp && + !hpChanged) + { + return false; + } + + if (targetChanged) + { + boolean player = actor instanceof Player; + final int start = hadAggro ? 1 + COLOR_TAG_LENGTH : COLOR_TAG_LENGTH; + target = + (hasAggro ? '*' : "") + + (isTarget ? attackingColTag : + player ? ColorUtil.colorStartTag(0xffffff) : ColorUtil.colorStartTag(0xffff00)) + + target.substring(start); + } + else if (aggroChanged) + { + if (hasAggro) + { + target = '*' + target; + } + else + { + target = target.substring(1); + } + } + + if (hpChanged || hasHp) + { + final int braceIdx; + + if (!hasHp) + { + braceIdx = target.lastIndexOf("("); + if (braceIdx != -1) + { + target = target.substring(0, braceIdx - 1) + "(level-" + actor.getCombatLevel() + ")"; + } + } + else if ((braceIdx = target.lastIndexOf('(')) != -1) + { + final String hpString = getHpString(actor, hpChanged); + + target = target.substring(0, braceIdx) + hpString; + } + } + + entry.setTarget(target); + return true; + } + + private boolean isNotAttackEntry(MenuEntry entry) + { + return entry.getOpcode() != MenuOpcode.NPC_SECOND_OPTION.getId() && + entry.getOpcode() != menuManager.getPlayerAttackOpcode() + || !entry.getOption().equals("Attack"); + } + + private String getHpString(Actor actor, boolean withColorTag) + { + int maxHp = getMaxHp(actor); + int health = actor.getHealth(); + int ratio = actor.getHealthRatio(); + + final String result; + if (maxHp != -1) + { + final int exactHealth = OpponentInfoOverlay.getExactHp(ratio, health, maxHp); + result = "(" + exactHealth + "/" + maxHp + ")"; + } + else + { + result = "(" + (100 * ratio) / health + "%)"; + } + + return withColorTag ? ColorUtil.colorStartTag(0xff0000) + result : result; + } + + int getMaxHp(Actor actor) + { + if (actor instanceof NPC) + { + return npcManager.getHealth(((NPC) actor).getId()); + } + else + { + final HiscoreResult hiscoreResult = hiscoreManager.lookupAsync(Text.removeTags(actor.getName()), getHiscoreEndpoint()); + if (hiscoreResult != null) + { + final int hp = hiscoreResult.getHitpoints().getLevel(); + if (hp > 0) + { + return hp; + } + } + + return -1; + } + } + + private Actor getActorFromIndex(int index) + { + if (index < 32768) + { + return client.getCachedNPCs()[index]; + } + else + { + return client.getCachedPlayers()[index - 32768]; } } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java b/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java index 8a5ffc4b6e..00dae893e9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSActor.java @@ -30,6 +30,7 @@ import net.runelite.mapping.Import; public interface RSActor extends RSEntity, Actor { @Import("targetIndex") + @Override int getRSInteracting(); // Overhead text 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 a0e6506b08..5ecdfc616b 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 @@ -208,6 +208,10 @@ public interface RSClient extends RSGameShell, Client @Override RSPlayer getLocalPlayer(); + @Import("localPlayerIndex") + @Override + int getLocalPlayerIndex(); + @Import("npcCount") int getNpcIndexesCount(); From 6a3264e68b0ba4e9ef5096d19065b2bf68beebc9 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 24 Oct 2019 13:51:42 -0400 Subject: [PATCH 073/185] client: remove Cerberus plugin Removed at Jagex's request --- .../plugins/cerberus/CerberusGhost.java | 70 ----------- .../plugins/cerberus/CerberusOverlay.java | 77 ------------ .../plugins/cerberus/CerberusPlugin.java | 115 ------------------ .../plugins/cerberus/CerberusPluginTest.java | 92 -------------- 4 files changed, 354 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java delete mode 100644 runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java deleted file mode 100644 index 744085c9a4..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusGhost.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2018, Tomas Slusny - * 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.cerberus; - -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import java.util.Optional; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import net.runelite.api.NPC; -import net.runelite.api.NpcID; -import net.runelite.api.Skill; - -@Getter -@RequiredArgsConstructor -public enum CerberusGhost -{ - RANGE(NpcID.SUMMONED_SOUL, Skill.RANGED), - MAGE(NpcID.SUMMONED_SOUL_5868, Skill.MAGIC), - MELEE(NpcID.SUMMONED_SOUL_5869, Skill.ATTACK); - - private final int npcId; - private final Skill type; - - private static final Map MAP; - - static - { - ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); - - for (final CerberusGhost ghost : values()) - { - builder.put(ghost.getNpcId(), ghost); - } - - MAP = builder.build(); - } - - /** - * Try to identify if NPC is ghost - * @param npc npc - * @return optional ghost - */ - public static Optional fromNPC(final NPC npc) - { - return npc == null ? Optional.empty() : Optional.ofNullable(MAP.get(npc.getId())); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java deleted file mode 100644 index 2f384fcd80..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2018, Tomas Slusny - * 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.cerberus; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import javax.inject.Inject; -import javax.inject.Singleton; -import net.runelite.client.game.SkillIconManager; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.ComponentOrientation; -import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; - -@Singleton -public class CerberusOverlay extends Overlay -{ - private final CerberusPlugin plugin; - private final SkillIconManager iconManager; - private final PanelComponent panelComponent = new PanelComponent(); - - @Inject - CerberusOverlay(final CerberusPlugin plugin, final SkillIconManager iconManager) - { - this.plugin = plugin; - this.iconManager = iconManager; - setPosition(OverlayPosition.BOTTOM_RIGHT); - panelComponent.setOrientation(ComponentOrientation.HORIZONTAL); - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (plugin.getGhosts().isEmpty()) - { - return null; - } - - panelComponent.getChildren().clear(); - - // Ghosts are already sorted - plugin.getGhosts().stream() - // Iterate only through the correct amount of ghosts - .limit(CerberusGhost.values().length) - .forEach(npc -> CerberusGhost - .fromNPC(npc) - .ifPresent(ghost -> panelComponent - .getChildren() - .add(new ImageComponent(iconManager.getSkillImage(ghost.getType()))))); - - - return panelComponent.render(graphics); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java deleted file mode 100644 index 47f1adbec4..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusPlugin.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2018, Tomas Slusny - * 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.cerberus; - -import com.google.common.collect.ComparisonChain; -import java.util.ArrayList; -import java.util.List; -import javax.inject.Inject; -import javax.inject.Singleton; -import lombok.Getter; -import net.runelite.api.GameState; -import net.runelite.api.NPC; -import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.GameTick; -import net.runelite.api.events.NpcDespawned; -import net.runelite.api.events.NpcSpawned; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.ui.overlay.OverlayManager; - -@PluginDescriptor( - name = "Cerberus", - description = "Show what to pray against the summoned souls", - tags = {"bosses", "combat", "ghosts", "prayer", "pve", "overlay", "souls"} -) -@Singleton -public class CerberusPlugin extends Plugin -{ - @Getter - private final List ghosts = new ArrayList<>(); - - @Inject - private OverlayManager overlayManager; - - @Inject - private CerberusOverlay overlay; - - @Override - protected void startUp() throws Exception - { - overlayManager.add(overlay); - } - - @Override - protected void shutDown() throws Exception - { - overlayManager.remove(overlay); - ghosts.clear(); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - GameState gameState = event.getGameState(); - if (gameState == GameState.LOGIN_SCREEN || gameState == GameState.HOPPING || gameState == GameState.CONNECTION_LOST) - { - ghosts.clear(); - } - } - - @Subscribe - public void onNpcSpawned(final NpcSpawned event) - { - final NPC npc = event.getNpc(); - CerberusGhost.fromNPC(npc).ifPresent(ghost -> ghosts.add(npc)); - } - - @Subscribe - public void onNpcDespawned(final NpcDespawned event) - { - ghosts.remove(event.getNpc()); - } - - @Subscribe - public void onGameTick(GameTick gameTick) - { - if (ghosts.isEmpty()) - { - return; - } - - ghosts.sort((a, b) -> ComparisonChain.start() - // First, sort by the southernmost ghost (e.g with lowest y) - .compare(a.getLocalLocation().getY(), b.getLocalLocation().getY()) - // Then, sort by the westernmost ghost (e.g with lowest x) - .compare(a.getLocalLocation().getX(), b.getLocalLocation().getX()) - // This will give use the current wave and order of the ghosts based on - // what ghost will attack first - .result()); - } -} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java deleted file mode 100644 index e4289fa2f2..0000000000 --- a/runelite-client/src/test/java/net/runelite/client/plugins/cerberus/CerberusPluginTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.cerberus; - -import com.google.inject.Guice; -import com.google.inject.testing.fieldbinder.Bind; -import com.google.inject.testing.fieldbinder.BoundFieldModule; -import java.util.Arrays; -import java.util.List; -import javax.inject.Inject; -import net.runelite.api.NPC; -import net.runelite.api.coords.LocalPoint; -import net.runelite.api.events.GameTick; -import net.runelite.client.ui.overlay.OverlayManager; -import static org.junit.Assert.assertEquals; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class CerberusPluginTest -{ - @Mock - @Bind - OverlayManager overlayManager; - - @Inject - CerberusPlugin cerberusPlugin; - - @Before - public void before() - { - Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); - } - - @Test - public void testOnGameTick() - { - List ghosts = cerberusPlugin.getGhosts(); - ghosts.addAll(Arrays.asList( - mockNpc(new LocalPoint(0, 0)), - mockNpc(new LocalPoint(1, 0)), - mockNpc(new LocalPoint(0, 5)), - mockNpc(new LocalPoint(2, 0)), - mockNpc(new LocalPoint(2, 5)), - mockNpc(new LocalPoint(1, 5)) - )); - cerberusPlugin.onGameTick(new GameTick()); - - // Expected sort is by lowest y first, then by lowest x - assertEquals(ghosts.get(0).getLocalLocation(), new LocalPoint(0, 0)); - assertEquals(ghosts.get(1).getLocalLocation(), new LocalPoint(1, 0)); - assertEquals(ghosts.get(2).getLocalLocation(), new LocalPoint(2, 0)); - - assertEquals(ghosts.get(3).getLocalLocation(), new LocalPoint(0, 5)); - assertEquals(ghosts.get(4).getLocalLocation(), new LocalPoint(1, 5)); - assertEquals(ghosts.get(5).getLocalLocation(), new LocalPoint(2, 5)); - } - - private static NPC mockNpc(LocalPoint localPoint) - { - NPC npc = mock(NPC.class); - when(npc.getLocalLocation()).thenReturn(localPoint); - return npc; - } -} \ No newline at end of file From 54bb0f803fb3133c83f090586b84445053055715 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 24 Oct 2019 13:52:29 -0400 Subject: [PATCH 074/185] client: remove reorderprayers plugin Removed at Jagex's request --- .../reorderprayers/PrayerTabState.java | 32 -- .../reorderprayers/ReorderPrayersConfig.java | 73 --- .../reorderprayers/ReorderPrayersPlugin.java | 453 ------------------ 3 files changed, 558 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java deleted file mode 100644 index 993a74f917..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/PrayerTabState.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.reorderprayers; - -public enum PrayerTabState -{ - NONE, - PRAYERS, - QUICK_PRAYERS -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java deleted file mode 100644 index 7a73dae268..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersConfig.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.reorderprayers; - -import net.runelite.api.Prayer; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup(ReorderPrayersPlugin.CONFIG_GROUP_KEY) -public interface ReorderPrayersConfig extends Config -{ - - @ConfigItem( - keyName = ReorderPrayersPlugin.CONFIG_UNLOCK_REORDERING_KEY, - name = "Unlock Prayer Reordering", - description = "Configures whether or not you can reorder the prayers", - position = 1 - ) - default boolean unlockPrayerReordering() - { - return false; - } - - @ConfigItem( - keyName = ReorderPrayersPlugin.CONFIG_UNLOCK_REORDERING_KEY, - name = "", - description = "" - ) - void unlockPrayerReordering(boolean unlock); - - @ConfigItem( - keyName = ReorderPrayersPlugin.CONFIG_PRAYER_ORDER_KEY, - name = "Prayer Order", - description = "Configures the order of the prayers", - hidden = true, - position = 2 - ) - default String prayerOrder() - { - return ReorderPrayersPlugin.prayerOrderToString(Prayer.values()); - } - - @ConfigItem( - keyName = ReorderPrayersPlugin.CONFIG_PRAYER_ORDER_KEY, - name = "", - description = "" - ) - void prayerOrder(String prayerOrder); - -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java deleted file mode 100644 index 0c85f32c8e..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/reorderprayers/ReorderPrayersPlugin.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.reorderprayers; - -import com.google.common.collect.ImmutableList; -import com.google.inject.Provides; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.HashTable; -import net.runelite.api.Prayer; -import net.runelite.api.WidgetNode; -import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.DraggingWidgetChanged; -import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.WidgetLoaded; -import net.runelite.api.events.WidgetMenuOptionClicked; -import net.runelite.api.widgets.Widget; -import static net.runelite.api.widgets.WidgetConfig.DRAG; -import static net.runelite.api.widgets.WidgetConfig.DRAG_ON; -import net.runelite.api.widgets.WidgetID; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.menus.MenuManager; -import net.runelite.client.menus.WidgetMenuOption; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; - -@PluginDescriptor( - name = "Reorder Prayers", - description = "Reorder the prayers displayed on the Prayer panel" -) -public class ReorderPrayersPlugin extends Plugin -{ - - static final String CONFIG_GROUP_KEY = "reorderprayers"; - - static final String CONFIG_UNLOCK_REORDERING_KEY = "unlockPrayerReordering"; - - static final String CONFIG_PRAYER_ORDER_KEY = "prayerOrder"; - - private static final int PRAYER_WIDTH = 34; - - private static final int PRAYER_HEIGHT = 34; - - private static final int PRAYER_X_OFFSET = 37; - - private static final int PRAYER_Y_OFFSET = 37; - - private static final int QUICK_PRAYER_SPRITE_X_OFFSET = 2; - - private static final int QUICK_PRAYER_SPRITE_Y_OFFSET = 2; - - private static final int PRAYER_COLUMN_COUNT = 5; - - private static final int PRAYER_COUNT = Prayer.values().length; - - private static final List PRAYER_WIDGET_INFO_LIST = ImmutableList.of( - WidgetInfo.PRAYER_THICK_SKIN, - WidgetInfo.PRAYER_BURST_OF_STRENGTH, - WidgetInfo.PRAYER_CLARITY_OF_THOUGHT, - WidgetInfo.PRAYER_SHARP_EYE, - WidgetInfo.PRAYER_MYSTIC_WILL, - WidgetInfo.PRAYER_ROCK_SKIN, - WidgetInfo.PRAYER_SUPERHUMAN_STRENGTH, - WidgetInfo.PRAYER_IMPROVED_REFLEXES, - WidgetInfo.PRAYER_RAPID_RESTORE, - WidgetInfo.PRAYER_RAPID_HEAL, - WidgetInfo.PRAYER_PROTECT_ITEM, - WidgetInfo.PRAYER_HAWK_EYE, - WidgetInfo.PRAYER_MYSTIC_LORE, - WidgetInfo.PRAYER_STEEL_SKIN, - WidgetInfo.PRAYER_ULTIMATE_STRENGTH, - WidgetInfo.PRAYER_INCREDIBLE_REFLEXES, - WidgetInfo.PRAYER_PROTECT_FROM_MAGIC, - WidgetInfo.PRAYER_PROTECT_FROM_MISSILES, - WidgetInfo.PRAYER_PROTECT_FROM_MELEE, - WidgetInfo.PRAYER_EAGLE_EYE, - WidgetInfo.PRAYER_MYSTIC_MIGHT, - WidgetInfo.PRAYER_RETRIBUTION, - WidgetInfo.PRAYER_REDEMPTION, - WidgetInfo.PRAYER_SMITE, - WidgetInfo.PRAYER_PRESERVE, - WidgetInfo.PRAYER_CHIVALRY, - WidgetInfo.PRAYER_PIETY, - WidgetInfo.PRAYER_RIGOUR, - WidgetInfo.PRAYER_AUGURY - ); - - private static final List QUICK_PRAYER_CHILD_IDS = ImmutableList.of( - WidgetID.QuickPrayer.THICK_SKIN_CHILD_ID, - WidgetID.QuickPrayer.BURST_OF_STRENGTH_CHILD_ID, - WidgetID.QuickPrayer.CLARITY_OF_THOUGHT_CHILD_ID, - WidgetID.QuickPrayer.SHARP_EYE_CHILD_ID, - WidgetID.QuickPrayer.MYSTIC_WILL_CHILD_ID, - WidgetID.QuickPrayer.ROCK_SKIN_CHILD_ID, - WidgetID.QuickPrayer.SUPERHUMAN_STRENGTH_CHILD_ID, - WidgetID.QuickPrayer.IMPROVED_REFLEXES_CHILD_ID, - WidgetID.QuickPrayer.RAPID_RESTORE_CHILD_ID, - WidgetID.QuickPrayer.RAPID_HEAL_CHILD_ID, - WidgetID.QuickPrayer.PROTECT_ITEM_CHILD_ID, - WidgetID.QuickPrayer.HAWK_EYE_CHILD_ID, - WidgetID.QuickPrayer.MYSTIC_LORE_CHILD_ID, - WidgetID.QuickPrayer.STEEL_SKIN_CHILD_ID, - WidgetID.QuickPrayer.ULTIMATE_STRENGTH_CHILD_ID, - WidgetID.QuickPrayer.INCREDIBLE_REFLEXES_CHILD_ID, - WidgetID.QuickPrayer.PROTECT_FROM_MAGIC_CHILD_ID, - WidgetID.QuickPrayer.PROTECT_FROM_MISSILES_CHILD_ID, - WidgetID.QuickPrayer.PROTECT_FROM_MELEE_CHILD_ID, - WidgetID.QuickPrayer.EAGLE_EYE_CHILD_ID, - WidgetID.QuickPrayer.MYSTIC_MIGHT_CHILD_ID, - WidgetID.QuickPrayer.RETRIBUTION_CHILD_ID, - WidgetID.QuickPrayer.REDEMPTION_CHILD_ID, - WidgetID.QuickPrayer.SMITE_CHILD_ID, - WidgetID.QuickPrayer.PRESERVE_CHILD_ID, - WidgetID.QuickPrayer.CHIVALRY_CHILD_ID, - WidgetID.QuickPrayer.PIETY_CHILD_ID, - WidgetID.QuickPrayer.RIGOUR_CHILD_ID, - WidgetID.QuickPrayer.AUGURY_CHILD_ID - ); - - private static final String LOCK = "Lock"; - - private static final String UNLOCK = "Unlock"; - - private static final String MENU_TARGET = "Reordering"; - - private static final WidgetMenuOption FIXED_PRAYER_TAB_LOCK = new WidgetMenuOption(LOCK, - MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB); - - private static final WidgetMenuOption FIXED_PRAYER_TAB_UNLOCK = new WidgetMenuOption(UNLOCK, - MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB); - - private static final WidgetMenuOption RESIZABLE_PRAYER_TAB_LOCK = new WidgetMenuOption(LOCK, - MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_PRAYER_TAB); - - private static final WidgetMenuOption RESIZABLE_PRAYER_TAB_UNLOCK = new WidgetMenuOption(UNLOCK, - MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_PRAYER_TAB); - - private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_PRAYER_TAB_LOCK = new WidgetMenuOption(LOCK, - MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_PRAYER_TAB); - - private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_PRAYER_TAB_UNLOCK = new WidgetMenuOption(UNLOCK, - MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_PRAYER_TAB); - - @Inject - private Client client; - - @Inject - private ReorderPrayersConfig config; - - @Inject - private MenuManager menuManager; - - private Prayer[] prayerOrder; - - static String prayerOrderToString(Prayer[] prayerOrder) - { - return Arrays.stream(prayerOrder) - .map(Prayer::name) - .collect(Collectors.joining(",")); - } - - private static Prayer[] stringToPrayerOrder(String string) - { - return Arrays.stream(string.split(",")) - .map(Prayer::valueOf) - .toArray(Prayer[]::new); - } - - private static int getPrayerIndex(Widget widget) - { - int x = widget.getOriginalX() / PRAYER_X_OFFSET; - int y = widget.getOriginalY() / PRAYER_Y_OFFSET; - return x + y * PRAYER_COLUMN_COUNT; - } - - private static void setWidgetPosition(Widget widget, int x, int y) - { - widget.setRelativeX(x); - widget.setRelativeY(y); - widget.setOriginalX(x); - widget.setOriginalY(y); - } - - @Provides - ReorderPrayersConfig provideConfig(ConfigManager configManager) - { - return configManager.getConfig(ReorderPrayersConfig.class); - } - - @Override - protected void startUp() throws Exception - { - refreshPrayerTabOption(); - prayerOrder = stringToPrayerOrder(config.prayerOrder()); - reorderPrayers(); - } - - @Override - protected void shutDown() throws Exception - { - clearPrayerTabMenus(); - prayerOrder = Prayer.values(); - reorderPrayers(false); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - if (event.getGameState() == GameState.LOGGED_IN) - { - reorderPrayers(); - } - } - - @Subscribe - public void onConfigChanged(ConfigChanged event) - { - if (event.getGroup().equals(CONFIG_GROUP_KEY)) - { - if (event.getKey().equals(CONFIG_PRAYER_ORDER_KEY)) - { - prayerOrder = stringToPrayerOrder(config.prayerOrder()); - } - else if (event.getKey().equals(CONFIG_UNLOCK_REORDERING_KEY)) - { - refreshPrayerTabOption(); - } - reorderPrayers(); - } - } - - @Subscribe - public void onWidgetLoaded(WidgetLoaded event) - { - if (event.getGroupId() == WidgetID.PRAYER_GROUP_ID || event.getGroupId() == WidgetID.QUICK_PRAYERS_GROUP_ID) - { - reorderPrayers(); - } - } - - @Subscribe - public void onDraggingWidgetChanged(DraggingWidgetChanged event) - { - // is dragging widget and mouse button released - if (event.isDraggingWidget() && client.getMouseCurrentButton() == 0) - { - Widget draggedWidget = client.getDraggedWidget(); - Widget draggedOnWidget = client.getDraggedOnWidget(); - if (draggedWidget != null && draggedOnWidget != null) - { - int draggedGroupId = WidgetInfo.TO_GROUP(draggedWidget.getId()); - int draggedOnGroupId = WidgetInfo.TO_GROUP(draggedOnWidget.getId()); - if (draggedGroupId != WidgetID.PRAYER_GROUP_ID || draggedOnGroupId != WidgetID.PRAYER_GROUP_ID - || draggedOnWidget.getWidth() != PRAYER_WIDTH || draggedOnWidget.getHeight() != PRAYER_HEIGHT) - { - return; - } - // reset dragged on widget to prevent sending a drag widget packet to the server - client.setDraggedOnWidget(null); - - int fromPrayerIndex = getPrayerIndex(draggedWidget); - int toPrayerIndex = getPrayerIndex(draggedOnWidget); - - Prayer tmp = prayerOrder[toPrayerIndex]; - prayerOrder[toPrayerIndex] = prayerOrder[fromPrayerIndex]; - prayerOrder[fromPrayerIndex] = tmp; - - save(); - } - } - } - - @Subscribe - public void onWidgetMenuOptionClicked(WidgetMenuOptionClicked event) - { - if (event.getWidget() == WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB - || event.getWidget() == WidgetInfo.RESIZABLE_VIEWPORT_PRAYER_TAB - || event.getWidget() == WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_PRAYER_TAB) - { - config.unlockPrayerReordering(event.getMenuOption().equals(UNLOCK)); - } - } - - private void clearPrayerTabMenus() - { - menuManager.removeManagedCustomMenu(FIXED_PRAYER_TAB_LOCK); - menuManager.removeManagedCustomMenu(RESIZABLE_PRAYER_TAB_LOCK); - menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_PRAYER_TAB_LOCK); - menuManager.removeManagedCustomMenu(FIXED_PRAYER_TAB_UNLOCK); - menuManager.removeManagedCustomMenu(RESIZABLE_PRAYER_TAB_UNLOCK); - menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_PRAYER_TAB_UNLOCK); - } - - private void refreshPrayerTabOption() - { - clearPrayerTabMenus(); - if (config.unlockPrayerReordering()) - { - menuManager.addManagedCustomMenu(FIXED_PRAYER_TAB_LOCK); - menuManager.addManagedCustomMenu(RESIZABLE_PRAYER_TAB_LOCK); - menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_PRAYER_TAB_LOCK); - } - else - { - menuManager.addManagedCustomMenu(FIXED_PRAYER_TAB_UNLOCK); - menuManager.addManagedCustomMenu(RESIZABLE_PRAYER_TAB_UNLOCK); - menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_PRAYER_TAB_UNLOCK); - } - } - - private PrayerTabState getPrayerTabState() - { - HashTable componentTable = client.getComponentTable(); - for (WidgetNode widgetNode : componentTable.getNodes()) - { - if (widgetNode.getId() == WidgetID.PRAYER_GROUP_ID) - { - return PrayerTabState.PRAYERS; - } - else if (widgetNode.getId() == WidgetID.QUICK_PRAYERS_GROUP_ID) - { - return PrayerTabState.QUICK_PRAYERS; - } - } - return PrayerTabState.NONE; - } - - private void save() - { - config.prayerOrder(prayerOrderToString(prayerOrder)); - } - - private void reorderPrayers() - { - reorderPrayers(config.unlockPrayerReordering()); - } - - private void reorderPrayers(boolean unlocked) - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - PrayerTabState prayerTabState = getPrayerTabState(); - - if (prayerTabState == PrayerTabState.PRAYERS) - { - List prayerWidgets = PRAYER_WIDGET_INFO_LIST.stream() - .map(client::getWidget) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - - if (prayerWidgets.size() != PRAYER_WIDGET_INFO_LIST.size()) - { - return; - } - - for (int index = 0; index < prayerOrder.length; index++) - { - Prayer prayer = prayerOrder[index]; - Widget prayerWidget = prayerWidgets.get(prayer.ordinal()); - - int widgetConfig = prayerWidget.getClickMask(); - if (unlocked) - { - // allow dragging of this widget - widgetConfig |= DRAG; - // allow this widget to be dragged on - widgetConfig |= DRAG_ON; - } - else - { - // remove drag flag - widgetConfig &= ~DRAG; - // remove drag on flag - widgetConfig &= ~DRAG_ON; - } - prayerWidget.setClickMask(widgetConfig); - - int x = index % PRAYER_COLUMN_COUNT; - int y = index / PRAYER_COLUMN_COUNT; - int widgetX = x * PRAYER_X_OFFSET; - int widgetY = y * PRAYER_Y_OFFSET; - setWidgetPosition(prayerWidget, widgetX, widgetY); - } - } - else if (prayerTabState == PrayerTabState.QUICK_PRAYERS) - { - Widget prayersContainer = client.getWidget(WidgetInfo.QUICK_PRAYER_PRAYERS); - if (prayersContainer == null) - { - return; - } - Widget[] prayerWidgets = prayersContainer.getDynamicChildren(); - if (prayerWidgets == null || prayerWidgets.length != PRAYER_COUNT * 3) - { - return; - } - - for (int index = 0; index < prayerOrder.length; index++) - { - Prayer prayer = prayerOrder[index]; - - int x = index % PRAYER_COLUMN_COUNT; - int y = index / PRAYER_COLUMN_COUNT; - - Widget prayerWidget = prayerWidgets[QUICK_PRAYER_CHILD_IDS.get(prayer.ordinal())]; - setWidgetPosition(prayerWidget, x * PRAYER_X_OFFSET, y * PRAYER_Y_OFFSET); - - int childId = PRAYER_COUNT + 2 * prayer.ordinal(); - - Widget prayerSpriteWidget = prayerWidgets[childId]; - setWidgetPosition(prayerSpriteWidget, - QUICK_PRAYER_SPRITE_X_OFFSET + x * PRAYER_X_OFFSET, - QUICK_PRAYER_SPRITE_Y_OFFSET + y * PRAYER_Y_OFFSET); - - Widget prayerToggleWidget = prayerWidgets[childId + 1]; - setWidgetPosition(prayerToggleWidget, x * PRAYER_X_OFFSET, y * PRAYER_Y_OFFSET); - } - } - } - -} From 543ce78710f1b078d3385ecdf80f49b12cde02d0 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 24 Oct 2019 13:54:21 -0400 Subject: [PATCH 075/185] opponentinfo: remove Opponent's opponent Removed at Jagex's request --- .../opponentinfo/OpponentInfoConfig.java | 11 --------- .../opponentinfo/OpponentInfoOverlay.java | 23 ------------------- 2 files changed, 34 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java index 9f08e128af..6adb3af1f2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoConfig.java @@ -53,17 +53,6 @@ public interface OpponentInfoConfig extends Config return HitpointsDisplayStyle.HITPOINTS; } - @ConfigItem( - keyName = "showOpponentsOpponent", - name = "Show opponent's opponent", - description = "Toggle showing opponent's opponent if within a multi-combat area", - position = 2 - ) - default boolean showOpponentsOpponent() - { - return true; - } - @ConfigItem( keyName = "showOpponentsInMenu", name = "Show opponents in menu", 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 f7945a5646..45c40cf939 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 @@ -37,7 +37,6 @@ import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.NPC; import net.runelite.api.Player; -import net.runelite.api.Varbits; import net.runelite.client.game.HiscoreManager; import net.runelite.client.game.NPCManager; import net.runelite.client.ui.overlay.Overlay; @@ -69,7 +68,6 @@ class OpponentInfoOverlay extends Overlay private int lastRatio = 0; private int lastHealthScale = 0; private String opponentName; - private String opponentsOpponentName; @Inject private OpponentInfoOverlay( @@ -128,17 +126,6 @@ class OpponentInfoOverlay extends Overlay } } } - - final Actor opponentsOpponent = opponent.getInteracting(); - if (opponentsOpponent != null - && (opponentsOpponent != client.getLocalPlayer() || client.getVar(Varbits.MULTICOMBAT_AREA) == 1)) - { - opponentsOpponentName = Text.removeTags(opponentsOpponent.getName()); - } - else - { - opponentsOpponentName = null; - } } if (opponentName == null) @@ -218,16 +205,6 @@ class OpponentInfoOverlay extends Overlay panelComponent.getChildren().add(progressBarComponent); } - // Opponents opponent - if (opponentsOpponentName != null && opponentInfoConfig.showOpponentsOpponent()) - { - textWidth = Math.max(textWidth, fontMetrics.stringWidth(opponentsOpponentName)); - panelComponent.setPreferredSize(new Dimension(textWidth, 0)); - panelComponent.getChildren().add(TitleComponent.builder() - .text(opponentsOpponentName) - .build()); - } - return panelComponent.render(graphics); } } From e2c72a676751f731a93b0b98a92663c08e742cfc Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 24 Oct 2019 13:55:44 -0400 Subject: [PATCH 076/185] corp plugin: remove dark core attack deprioritization Removed at Jagex's request --- .../client/plugins/corp/CorpConfig.java | 11 ------- .../client/plugins/corp/CorpPlugin.java | 32 ------------------- 2 files changed, 43 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java index 4b2fe5bb9c..13475f7c44 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpConfig.java @@ -31,17 +31,6 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("corp") public interface CorpConfig extends Config { - @ConfigItem( - keyName = "leftClickCore", - name = "Left click walk on core", - description = "Prioritizes Walk here over Attack on the Dark energy core", - position = 1 - ) - default boolean leftClickCore() - { - return true; - } - @ConfigItem( keyName = "showDamage", name = "Show damage overlay", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java index 627c9091e8..9ad661094c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpPlugin.java @@ -35,16 +35,12 @@ import net.runelite.api.Actor; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameState; -import net.runelite.api.MenuAction; -import static net.runelite.api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; -import net.runelite.api.MenuEntry; import net.runelite.api.NPC; import net.runelite.api.NpcID; import net.runelite.api.Varbits; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.HitsplatApplied; import net.runelite.api.events.InteractingChanged; -import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.client.chat.ChatColorType; @@ -65,10 +61,6 @@ import net.runelite.client.ui.overlay.OverlayManager; @Slf4j public class CorpPlugin extends Plugin { - private static final int NPC_SECTION_ACTION = MenuAction.NPC_SECOND_OPTION.getId(); - private static final String ATTACK = "Attack"; - private static final String DARK_ENERGY_CORE = "Dark energy core"; - @Getter(AccessLevel.PACKAGE) private NPC corp; @@ -224,28 +216,4 @@ public class CorpPlugin extends Plugin players.add(source); } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded menuEntryAdded) - { - if (menuEntryAdded.getType() != NPC_SECTION_ACTION - || !config.leftClickCore() || !menuEntryAdded.getOption().equals(ATTACK)) - { - return; - } - - final int npcIndex = menuEntryAdded.getIdentifier(); - final NPC npc = client.getCachedNPCs()[npcIndex]; - if (npc == null || !npc.getName().equals(DARK_ENERGY_CORE)) - { - return; - } - - // since this is the menu entry add event, this is the last menu entry - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry menuEntry = menuEntries[menuEntries.length - 1]; - - menuEntry.setType(NPC_SECTION_ACTION + MENU_ACTION_DEPRIORITIZE_OFFSET); - client.setMenuEntries(menuEntries); - } } From bc5838f0194f6ad75aa69be0743f13ef3afd564a Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 24 Oct 2019 13:58:22 -0400 Subject: [PATCH 077/185] menuentryswapper: remove pickpocket swap Removed at Jagex's request --- .../menuentryswapper/MenuEntrySwapperConfig.java | 10 ---------- .../menuentryswapper/MenuEntrySwapperPlugin.java | 10 ---------- 2 files changed, 20 deletions(-) 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 13f780a823..28229152f1 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 @@ -202,16 +202,6 @@ public interface MenuEntrySwapperConfig extends Config return HouseAdvertisementMode.VIEW; } - @ConfigItem( - keyName = "swapPickpocket", - name = "Pickpocket", - description = "Swap Talk-to with Pickpocket" - ) - default boolean swapPickpocket() - { - return true; - } - @ConfigItem( keyName = "swapPay", name = "Pay", 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 91fddefb66..eabce50cf3 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 @@ -371,11 +371,6 @@ public class MenuEntrySwapperPlugin extends Plugin if (option.equals("talk-to")) { - if (config.swapPickpocket() && shouldSwapPickpocket(target)) - { - swap("pickpocket", option, target, index); - } - if (config.swapAbyssTeleport() && target.contains("mage of zamorak")) { swap("teleport", option, target, index); @@ -638,11 +633,6 @@ public class MenuEntrySwapperPlugin extends Plugin } } - private static boolean shouldSwapPickpocket(String target) - { - return !target.startsWith("villager") && !target.startsWith("bandit") && !target.startsWith("menaphite thug"); - } - @Subscribe public void onClientTick(ClientTick clientTick) { From 25c81187df67983760559c89f96856d6157a63aa Mon Sep 17 00:00:00 2001 From: ln Date: Fri, 25 Oct 2019 04:34:28 +0300 Subject: [PATCH 078/185] GPU: Floating point screen coordinates to eliminate vertex snapping --- .../runelite/client/plugins/gpu/common.glsl | 6 ++--- .../net/runelite/client/plugins/gpu/geom.glsl | 6 ++--- .../client/plugins/gpu/to_screen.glsl | 26 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl index 207e8300a1..55c3b9e6c3 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl @@ -74,9 +74,9 @@ bool face_visible(ivec4 vA, ivec4 vB, ivec4 vC, ivec4 position, int cameraYaw, i vB += position - cameraPos; vC += position - cameraPos; - ivec3 sA = toScreen(vA.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 sB = toScreen(vB.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 sC = toScreen(vC.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sA = toScreen(vA.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sB = toScreen(vB.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sC = toScreen(vC.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); return (sA.x - sB.x) * (sC.y - sB.y) - (sC.x - sB.x) * (sA.y - sB.y) > 0; } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl index 28a339f788..0f7f1bad23 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl @@ -60,9 +60,9 @@ out float fogAmount; void main() { ivec3 cameraPos = ivec3(cameraX, cameraY, cameraZ); - ivec3 screenA = toScreen(vPosition[0] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 screenB = toScreen(vPosition[1] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 screenC = toScreen(vPosition[2] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 screenA = toScreen(vPosition[0] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 screenB = toScreen(vPosition[1] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 screenC = toScreen(vPosition[2] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); if (-screenA.z < 50 || -screenB.z < 50 || -screenC.z < 50) { // the client does not draw a triangle if any vertex distance is <50 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl index 612cf8fce8..1e9e63428d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl @@ -26,22 +26,22 @@ /* * Convert a vertex to screen space */ -ivec3 toScreen(ivec3 vertex, int cameraYaw, int cameraPitch, int centerX, int centerY, int zoom) { - int yawSin = int(65536.0f * sin(cameraYaw * UNIT)); - int yawCos = int(65536.0f * cos(cameraYaw * UNIT)); +vec3 toScreen(ivec3 vertex, int cameraYaw, int cameraPitch, int centerX, int centerY, int zoom) { + float yawSin = sin(cameraYaw * UNIT); + float yawCos = cos(cameraYaw * UNIT); - int pitchSin = int(65536.0f * sin(cameraPitch * UNIT)); - int pitchCos = int(65536.0f * cos(cameraPitch * UNIT)); + float pitchSin = sin(cameraPitch * UNIT); + float pitchCos = cos(cameraPitch * UNIT); - int rotatedX = ((vertex.z * yawSin) + (vertex.x * yawCos)) >> 16; - int rotatedZ = ((vertex.z * yawCos) - (vertex.x * yawSin)) >> 16; + float rotatedX = (vertex.z * yawSin) + (vertex.x * yawCos); + float rotatedZ = (vertex.z * yawCos) - (vertex.x * yawSin); - int var13 = ((vertex.y * pitchCos) - (rotatedZ * pitchSin)) >> 16; - int var12 = ((vertex.y * pitchSin) + (rotatedZ * pitchCos)) >> 16; + float var13 = (vertex.y * pitchCos) - (rotatedZ * pitchSin); + float var12 = (vertex.y * pitchSin) + (rotatedZ * pitchCos); - int x = rotatedX * zoom / var12 + centerX; - int y = var13 * zoom / var12 + centerY; - int z = -var12; // in OpenGL depth is negative + float x = rotatedX * zoom / var12 + centerX; + float y = var13 * zoom / var12 + centerY; + float z = -var12; // in OpenGL depth is negative - return ivec3(x, y, z); + return vec3(x, y, z); } From 7bb95ef7c7d5270ccd0ddb8e4cdef9e43b894f28 Mon Sep 17 00:00:00 2001 From: SebastiaanVanspauwen <43320258+SebastiaanVanspauwen@users.noreply.github.com> Date: Fri, 25 Oct 2019 11:02:12 +0200 Subject: [PATCH 079/185] Worldmap: Fix incorrect Zeah quest start locations (#10135) --- .../runelite/client/plugins/worldmap/QuestStartLocation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java index 459abf02e0..bce9ec50c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java @@ -58,7 +58,7 @@ enum QuestStartLocation //Members' Quests ANIMAL_MAGNETISM(Quest.ANIMAL_MAGNETISM, new WorldPoint(3094, 3360, 0)), ANOTHER_SLICE_OF_HAM(Quest.ANOTHER_SLICE_OF_HAM, new WorldPoint(2799, 5428, 0)), - THE_ASCENT_OF_ARCEUUS(Quest.THE_ASCENT_OF_ARCEUUS, new WorldPoint(1700, 3742, 0)), + THE_ASCENT_OF_ARCEUUS(Quest.THE_ASCENT_OF_ARCEUUS, new WorldPoint(1699, 3742, 0)), BETWEEN_A_ROCK(Quest.BETWEEN_A_ROCK, new WorldPoint(2823, 10168, 0)), BIG_CHOMPY_BIRD_HUNTING(Quest.BIG_CHOMPY_BIRD_HUNTING, new WorldPoint(2629, 2981, 0)), BIOHAZARD(Quest.BIOHAZARD, new WorldPoint(2591, 3335, 0)), @@ -72,7 +72,7 @@ enum QuestStartLocation DARKNESS_OF_HALLOWVALE(Quest.DARKNESS_OF_HALLOWVALE, new WorldPoint(3494, 9628, 0)), DEATH_PLATEAU_TROLL_STRONGHOLD(new Quest[]{Quest.DEATH_PLATEAU, Quest.TROLL_STRONGHOLD}, new WorldPoint(2895, 3528, 0)), DEATH_TO_THE_DORGESHUUN(Quest.DEATH_TO_THE_DORGESHUUN, new WorldPoint(3316, 9613, 0)), - THE_DEPTHS_OF_DESPAIR(Quest.THE_DEPTHS_OF_DESPAIR, new WorldPoint(1780, 3569, 0)), + THE_DEPTHS_OF_DESPAIR(Quest.THE_DEPTHS_OF_DESPAIR, new WorldPoint(1781, 3570, 0)), DESERT_TREASURE(Quest.DESERT_TREASURE, new WorldPoint(3177, 3043, 0)), DEVIOUS_MINDS(Quest.DEVIOUS_MINDS, new WorldPoint(3405, 3492, 0)), THE_DIG_SITE(Quest.THE_DIG_SITE, new WorldPoint(3363, 3337, 0)), From 0cbfb2e4dff76880e4bb62356d3261e33def42fe Mon Sep 17 00:00:00 2001 From: Ganom Date: Fri, 25 Oct 2019 08:32:03 -0400 Subject: [PATCH 080/185] project: add yourkit references to readme. (#1840) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2d93718f4c..50732bacd2 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,7 @@ OpenOSRS is licensed under the BSD 2-clause license. See the license header in t ## Contribute and Develop We've set up a separate document for our [contribution guidelines](https://github.com/open-osrs/runelite/blob/master/.github/CONTRIBUTING.md). + +## Supported By + +OpenOSRS uses profiling tools provided by [![YourKit](https://www.yourkit.com/images/yklogo.png)](https://www.yourkit.com/java/profiler/) From 256348fda96df242acfee2da6c63a46a943f61f0 Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Sat, 26 Oct 2019 00:40:04 +0000 Subject: [PATCH 081/185] Client: Update NPC stats --- runelite-client/src/main/resources/npc_stats.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/resources/npc_stats.json b/runelite-client/src/main/resources/npc_stats.json index f10f40399b..578df51be3 100644 --- a/runelite-client/src/main/resources/npc_stats.json +++ b/runelite-client/src/main/resources/npc_stats.json @@ -1 +1 @@ -{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"slayerLevel":1,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"undead":true},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"99":{"name":"Death wing","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"241":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"242":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"243":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"244":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"245":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"246":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"293":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"294":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"295":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"undead":true},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"466":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"467":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"468":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"473":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"474":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"508":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"509":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"510":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"511":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"512":{"name":"Chaos druid","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,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"518":{"name":"Rogue","hitpoints":17,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"522":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"523":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"524":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"525":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"681":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"720":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"721":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"722":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"723":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"724":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"725":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"726":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"727":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"728":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"slayerLevel":1,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":15,"magic":70},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"undead":true},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22,"undead":true},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"undead":true},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":22,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"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":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1118":{"name":"Man","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"slayerLevel":1,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"slayerLevel":1,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":4,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"slayerLevel":1,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26,"undead":true},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42,"poisonImmune":true},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"slayerLevel":1,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85,"undead":true},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"slayerLevel":1,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1402":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1403":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1404":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1407":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1408":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"slayerLevel":1},"1494":{"name":"Kebbit","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"stab":12,"crush":65,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slash":103,"crush":95,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":75,"slash":75,"crush":75,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4},"1736":{"name":"Brawler","hitpoints":97,"combatLevel":101,"attackSpeed":4},"1737":{"name":"Brawler","hitpoints":113,"combatLevel":129,"attackSpeed":4},"1738":{"name":"Brawler","hitpoints":143,"combatLevel":158,"attackSpeed":4},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":50,"combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":50,"combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1872":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":24,"combatLevel":23,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2058":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2059":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"crush":22,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2143":{"name":"Sraracha","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50,"undead":true},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"slayerLevel":1,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"slayerLevel":1,"attackSpeed":6,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"slayerLevel":1,"attackSpeed":6,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stab":11,"slash":11,"crush":11,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"crush":16,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"slayerLevel":1,"attackSpeed":6,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"slayerLevel":1,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"slayerLevel":1,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"slayerLevel":1,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2504":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2505":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2506":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2527":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2528":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2529":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2530":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2531":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2532":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2533":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2534":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2694":{"name":"Sheep","hitpoints":7,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2885":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"2886":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"2887":{"name":"Asyff","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"2892":{"name":"Brian","hitpoints":27,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stab":11,"slashDef":3,"crushDef":2,"bonusStrength":12},"2916":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"slayerLevel":1,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"undead":true},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"slayerLevel":1,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3078":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3079":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3080":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3081":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3082":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3083":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3084":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3085":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3086":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3087":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3088":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3092":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3093":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3094":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3096":{"name":"Barbarian","combatLevel":7},"3097":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":3,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3098":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3100":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3101":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3102":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3103":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":10,"slash":10,"crush":10,"range":10,"magic":10,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3104":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3105":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3106":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3108":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3112":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14,"demon":true},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20,"demon":true},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"slayerLevel":1,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10,"demon":true},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"slayerLevel":1,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3200":{"name":"Arhein","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3245":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3251":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"3252":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"3255":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3256":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3259":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"3260":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3266":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3267":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","combatLevel":22,"slayerLevel":1,"attackSpeed":4,"undead":true},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true,"undead":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20},"4044":{"name":"Pirate","hitpoints":20},"4045":{"name":"Pirate","hitpoints":20},"4046":{"name":"Pirate","hitpoints":20},"4047":{"name":"Pirate","hitpoints":20},"4048":{"name":"Pirate","hitpoints":20},"4049":{"name":"Pirate","hitpoints":20},"4050":{"name":"Pirate","hitpoints":20},"4051":{"name":"Pirate","hitpoints":20},"4052":{"name":"Pirate","hitpoints":20},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4088":{"name":"Soldier","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"magicLevel":1,"stabDef":15,"slashDef":23,"crushDef":21,"rangeDef":14,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4163":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","combatLevel":81,"attackSpeed":4},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","combatLevel":75,"attackSpeed":4},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15,"undead":true},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4958":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":7,"combatLevel":27,"demon":true},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50,"undead":true},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"slayerLevel":1,"attackSpeed":6},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35,"undead":true},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35,"undead":true},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15,"undead":true},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":64,"combatLevel":31,"slayerLevel":1,"attackSpeed":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270,"poisonImmune":true,"venomImmune":true},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30,"undead":true},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30,"undead":true},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30,"undead":true},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"slayerLevel":1,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5648":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5649":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5650":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5651":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5652":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5653":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5654":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5655":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5873":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5947":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5961":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5963":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":3,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":157,"combatLevel":292,"slayerLevel":1,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":10,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"stab":100,"slash":100,"crush":100,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":198,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320,"demon":true},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220,"demon":true},"6328":{"name":"King Roald (hard)","hitpoints":150,"combatLevel":188,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"slayerLevel":1,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"6389":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":3,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"slayerLevel":1,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"slayerLevel":1,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"slayerLevel":1,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40,"undead":true},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"slayerLevel":1,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"slayerLevel":1,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"slayerLevel":1,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"slayerLevel":1,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"slayerLevel":1,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stab":57,"slashDef":23,"crushDef":22,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":137,"combatLevel":145,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":98,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180,"undead":true},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210,"undead":true},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"slayerLevel":1,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"slayerLevel":1,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"slayerLevel":1,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"magicDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"slayerLevel":1,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6816":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6817":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6818":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6819":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6820":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6821":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6822":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4},"7027":{"name":"Reanimated giant","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":5},"7029":{"name":"Reanimated elf","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7030":{"name":"Reanimated troll","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7031":{"name":"Reanimated horror","hitpoints":35,"slayerLevel":58,"attackSpeed":4},"7032":{"name":"Reanimated kalphite","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4},"7037":{"name":"Reanimated aviansie","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"dragon":true},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"slayerLevel":1,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1,"demon":true},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1,"demon":true},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"demon":true},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"demon":true},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"slayerLevel":1,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"slayerLevel":1,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"slayerLevel":1,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"undead":true},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":109,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"undead":true},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"slayerLevel":1,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"demon":true},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85,"undead":true},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"slayerLevel":1,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true,"demon":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7288":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7290":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7292":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7294":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"undead":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true,"undead":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true,"undead":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true,"undead":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true,"undead":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true,"demon":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"demon":true},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"stabDef":65,"slashDef":80,"crushDef":100,"rangeDef":400,"magicDef":80,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7573":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7604":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7658":{"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":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"slayerLevel":1,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"slayerLevel":1,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"stab":45,"slash":45,"crush":45,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stab":25,"slash":25,"crush":25,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stab":40,"slash":40,"crush":40,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"crush":300,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170,"dragon":true},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stab":50,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":30},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"slayerLevel":1,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5,"undead":true},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"7921":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7922":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"slayerLevel":1,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12,"undead":true},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15,"undead":true},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24,"undead":true},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64,"undead":true},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40,"undead":true},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24,"undead":true},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"slayerLevel":1,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55,"undead":true},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"slayerLevel":1,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60,"undead":true},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50,"undead":true},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"slayerLevel":1,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35,"undead":true},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4,"undead":true},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8428":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8429":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8430":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160,"dragon":true},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9026":{"name":"Crystalline Rat","combatLevel":24,"attackSpeed":4},"9028":{"name":"Crystalline Bat","combatLevel":33,"attackSpeed":4},"9029":{"name":"Crystalline Unicorn","combatLevel":48,"attackSpeed":4},"9030":{"name":"Crystalline Scorpion","combatLevel":64,"attackSpeed":4},"9031":{"name":"Crystalline Wolf","combatLevel":74,"attackSpeed":4},"9032":{"name":"Crystalline Bear","combatLevel":172,"attackSpeed":4},"9033":{"name":"Crystalline Dragon","combatLevel":172,"attackSpeed":4},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9040":{"name":"Corrupted Rat","combatLevel":34,"attackSpeed":4},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4},"9043":{"name":"Corrupted Unicorn","combatLevel":64,"attackSpeed":4},"9044":{"name":"Corrupted Scorpion","combatLevel":89,"attackSpeed":4},"9045":{"name":"Corrupted Wolf","combatLevel":102,"attackSpeed":4},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9047":{"name":"Corrupted Dragon","combatLevel":258,"attackSpeed":4},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9246":{"name":"Arianwyn (hard)","hitpoints":300,"combatLevel":368,"attackSpeed":5,"defenceLevel":102,"rangeLevel":552,"magicLevel":153,"range":126,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":260},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":520,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"9282":{"name":"Basilisk Youngling","hitpoints":60,"combatLevel":57,"slayerLevel":40,"attackSpeed":4,"attackLevel":25,"strengthLevel":40,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"9287":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9288":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9289":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true}} \ No newline at end of file +{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15,"undead":true},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"undead":true},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"slayerLevel":1,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"undead":true},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"99":{"name":"Death wing","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"241":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"242":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"243":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"244":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"245":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"246":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"293":{"name":"Snailneck","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"294":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"295":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"undead":true},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"undead":true},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"466":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"467":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"468":{"name":"Skeletal Wyvern","hitpoints":210,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80,"dragon":true},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"473":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"474":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"508":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"509":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"510":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"511":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"512":{"name":"Chaos druid","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,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"518":{"name":"Rogue","hitpoints":17,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"522":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"523":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"524":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"525":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"slayerLevel":1,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"undead":true},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"681":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"720":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"721":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"722":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"723":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"724":{"name":"Mummy","hitpoints":86,"attackSpeed":4,"undead":true},"725":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"726":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"727":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"728":{"name":"Mummy","hitpoints":91,"combatLevel":103,"attackSpeed":4,"undead":true},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":106,"combatLevel":111,"slayerLevel":1,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"slayerLevel":1,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":15,"magic":70},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"slayerLevel":1,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"undead":true},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22,"undead":true},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"undead":true},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":22,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"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":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":171,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1118":{"name":"Man","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"slayerLevel":1,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"slayerLevel":1,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":4,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"slayerLevel":1,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26,"undead":true},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42,"poisonImmune":true},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"slayerLevel":1,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85,"undead":true},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"slayerLevel":1,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1402":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1403":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1404":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":5,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1407":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1408":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"slayerLevel":1},"1494":{"name":"Kebbit","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"slayerLevel":1,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15,"undead":true},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"stab":12,"crush":65,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slash":103,"crush":95,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":75,"slash":75,"crush":75,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stab":68,"crush":82,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4},"1736":{"name":"Brawler","hitpoints":97,"combatLevel":101,"attackSpeed":4},"1737":{"name":"Brawler","hitpoints":113,"combatLevel":129,"attackSpeed":4},"1738":{"name":"Brawler","hitpoints":143,"combatLevel":158,"attackSpeed":4},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":5,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":50,"combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":50,"combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1872":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":24,"combatLevel":23,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2058":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2059":{"name":"Dark wizard","hitpoints":24,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"slayerLevel":1,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"crush":22,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2143":{"name":"Sraracha","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50,"undead":true},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"slayerLevel":1,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"slayerLevel":1,"attackSpeed":6,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"slayerLevel":1,"attackSpeed":6,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stab":11,"slash":11,"crush":11,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"crush":16,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"slayerLevel":1,"attackSpeed":6,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"slayerLevel":1,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"slayerLevel":1,"attackSpeed":6,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"slayerLevel":1,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"slayerLevel":1,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2504":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2505":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2506":{"name":"Zombie","hitpoints":41,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"undead":true},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35,"undead":true},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14,"undead":true},"2527":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2528":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2529":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2530":{"name":"Ghost","hitpoints":75,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45,"undead":true},"2531":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2532":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2533":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2534":{"name":"Ghost","hitpoints":27,"slayerLevel":1,"attackSpeed":4,"undead":true},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2694":{"name":"Sheep","hitpoints":7,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"slayerLevel":1,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2885":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"2886":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"2887":{"name":"Asyff","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"2892":{"name":"Brian","hitpoints":27,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stab":11,"slashDef":3,"crushDef":2,"bonusStrength":12},"2916":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":130,"combatLevel":115,"slayerLevel":1,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"slayerLevel":1,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"undead":true},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"slayerLevel":1,"attackSpeed":6,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"slayerLevel":1,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"slayerLevel":1,"attackSpeed":6,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"slayerLevel":1,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"slayerLevel":1,"attackSpeed":6,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"slayerLevel":1,"attackSpeed":6,"attackLevel":7,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3078":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3079":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3080":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3081":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3082":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3083":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3084":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3085":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3086":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3087":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3088":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3092":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3093":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3094":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3096":{"name":"Barbarian","combatLevel":7},"3097":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":3,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3098":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3100":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3101":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3102":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3103":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":10,"slash":10,"crush":10,"range":10,"magic":10,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3104":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3105":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3106":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3108":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3112":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":30,"magicLevel":60},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":15,"magicLevel":30},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"slayerLevel":1,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"slayerLevel":1,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14,"demon":true},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20,"demon":true},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"slayerLevel":1,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10,"demon":true},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"slayerLevel":1,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"slayerLevel":1,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"slayerLevel":1,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3200":{"name":"Arhein","hitpoints":6,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3245":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3251":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"3252":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"3255":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3256":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"3259":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"3260":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3266":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3267":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","combatLevel":22,"slayerLevel":1,"attackSpeed":4,"undead":true},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"slayerLevel":1,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true,"undead":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14,"undead":true},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"slayerLevel":1,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7,"undead":true},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20},"4044":{"name":"Pirate","hitpoints":20},"4045":{"name":"Pirate","hitpoints":20},"4046":{"name":"Pirate","hitpoints":20},"4047":{"name":"Pirate","hitpoints":20},"4048":{"name":"Pirate","hitpoints":20},"4049":{"name":"Pirate","hitpoints":20},"4050":{"name":"Pirate","hitpoints":20},"4051":{"name":"Pirate","hitpoints":20},"4052":{"name":"Pirate","hitpoints":20},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4088":{"name":"Soldier","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"magicLevel":1,"stabDef":15,"slashDef":23,"crushDef":21,"rangeDef":14,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"slayerLevel":1,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"slayerLevel":1,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4163":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"slayerLevel":1,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","combatLevel":81,"attackSpeed":4},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","combatLevel":75,"attackSpeed":4},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15,"undead":true},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"undead":true},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"slayerLevel":1,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"slayerLevel":1,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9,"slayerLevel":1},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4958":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":7,"combatLevel":27,"demon":true},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50,"undead":true},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"slayerLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"slayerLevel":1,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"slayerLevel":1,"attackSpeed":6},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35,"undead":true},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35,"undead":true},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15,"undead":true},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"slayerLevel":1,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"slayerLevel":1,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5,"undead":true},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63,"undead":true},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5,"undead":true},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"slayerLevel":1,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"slayerLevel":1,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":64,"combatLevel":31,"slayerLevel":1,"attackSpeed":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","combatLevel":127,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270,"poisonImmune":true,"venomImmune":true},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30,"undead":true},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30,"undead":true},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30,"undead":true},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"slayerLevel":1,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"undead":true},"5648":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5649":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5650":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5651":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5652":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5653":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5654":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5655":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":30,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"undead":true},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"undead":true},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"undead":true},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"undead":true},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magicLevel":1,"undead":true},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"slash":50,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5873":{"name":"Baby dragon","hitpoints":50,"combatLevel":48,"slayerLevel":1,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65,"demon":true},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5947":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5961":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5963":{"name":"Spinolyp","hitpoints":100,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"slayerLevel":1,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":3,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":157,"combatLevel":292,"slayerLevel":1,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":10,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"stab":100,"slash":100,"crush":100,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":198,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320,"demon":true},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220,"demon":true},"6328":{"name":"King Roald (hard)","hitpoints":150,"combatLevel":188,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"slayerLevel":1,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"slayerLevel":1,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"slayerLevel":1,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"slayerLevel":1,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"slayerLevel":1,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":4,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1,"demon":true},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":152,"defenceLevel":148,"rangeLevel":1,"magicLevel":1,"demon":true},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"stab":50,"slash":50,"crush":50,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160,"demon":true},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50,"demon":true},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":100,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"demon":true},"6389":{"name":"King Roald","hitpoints":75,"combatLevel":47,"attackSpeed":4,"attackLevel":35,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":3,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"undead":true},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"slayerLevel":1,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"slayerLevel":1,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5,"undead":true},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"slayerLevel":1,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40,"undead":true},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"slayerLevel":1,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"slayerLevel":1,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"slayerLevel":1,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"undead":true},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"slayerLevel":1,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"slayerLevel":1,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"slayerLevel":1,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"slayerLevel":1,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"slayerLevel":1,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"slayerLevel":1,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"slayerLevel":1,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"slayerLevel":1,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15,"undead":true},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"slayerLevel":1,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"slayerLevel":1,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"slayerLevel":1,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"slayerLevel":1,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"demon":true},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"slayerLevel":1,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"slayerLevel":1,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"slayerLevel":1,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"slayerLevel":1,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80,"dragon":true},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"undead":true},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"slayerLevel":1,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"slayerLevel":1,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stab":57,"slashDef":23,"crushDef":22,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":137,"combatLevel":145,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"slayerLevel":1,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":98,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"slayerLevel":1,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"slayerLevel":1,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250,"undead":true},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180,"undead":true},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"slayerLevel":1,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210,"undead":true},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"slayerLevel":1,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"slayerLevel":1,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"slayerLevel":1,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"magicDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"slayerLevel":1,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"slayerLevel":1,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"slayerLevel":1,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"slayerLevel":1,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"undead":true},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6816":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6817":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6818":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6819":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6820":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6821":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6822":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"slayerLevel":1,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"slayerLevel":1,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stab":4},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4},"7027":{"name":"Reanimated giant","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":5},"7029":{"name":"Reanimated elf","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7030":{"name":"Reanimated troll","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7031":{"name":"Reanimated horror","hitpoints":35,"slayerLevel":58,"attackSpeed":4},"7032":{"name":"Reanimated kalphite","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4},"7037":{"name":"Reanimated aviansie","hitpoints":35,"slayerLevel":1,"attackSpeed":4},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"dragon":true},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"slayerLevel":1,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"slayerLevel":1,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29,"demon":true},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"slayerLevel":1,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"slayerLevel":1,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"demon":true},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"slayerLevel":1,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1,"demon":true},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1,"demon":true},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"slayerLevel":1,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"demon":true},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"demon":true},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"demon":true},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"slayerLevel":1,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"slayerLevel":1,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"slayerLevel":1,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"slayerLevel":1,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"undead":true},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50,"undead":true},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"slayerLevel":1,"attackSpeed":4,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"slayerLevel":1,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"slayerLevel":1,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"undead":true},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"slayerLevel":1,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5,"undead":true},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":6,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":45,"combatLevel":42,"slayerLevel":1,"attackSpeed":6,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":109,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"undead":true},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"slayerLevel":1,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"demon":true},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85,"undead":true},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"slayerLevel":1,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true,"demon":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7288":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7290":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7292":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7294":{"name":"Awakened Altar","hitpoints":100,"demon":true},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"slayerLevel":1,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"undead":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true,"undead":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true,"undead":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true,"undead":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true,"undead":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true,"demon":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"demon":true},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"slayerLevel":1,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"slayerLevel":1,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10,"undead":true},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"stabDef":65,"slashDef":80,"crushDef":100,"rangeDef":400,"magicDef":80,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":225,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":315,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7573":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"slayerLevel":1,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60,"demon":true},"7604":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"slayerLevel":1,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"slayerLevel":1,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380,"demon":true},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7658":{"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":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"slayerLevel":1,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"slayerLevel":1,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"stab":45,"slash":45,"crush":45,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stab":25,"slash":25,"crush":25,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"slayerLevel":1,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stab":40,"slash":40,"crush":40,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"slayerLevel":1,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"slayerLevel":1,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"slayerLevel":1,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"stab":80,"slash":80,"crush":80,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"slayerLevel":1,"attackSpeed":4,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"crush":300,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"slayerLevel":1,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140,"dragon":true},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170,"dragon":true},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stab":50,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":30},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"slayerLevel":1,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"slayerLevel":1,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"slayerLevel":1,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"undead":true},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"demon":true},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"slayerLevel":1,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"demon":true},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"slayerLevel":1,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1,"demon":true},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"slayerLevel":1,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"slayerLevel":1,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5,"undead":true},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"7921":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7922":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"slayerLevel":1,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12,"undead":true},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"slayerLevel":1,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15,"undead":true},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"slayerLevel":1,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24,"undead":true},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"slayerLevel":1,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64,"undead":true},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40,"undead":true},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"slayerLevel":1,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24,"undead":true},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"slayerLevel":1,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55,"undead":true},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"slayerLevel":1,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60,"undead":true},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"slayerLevel":1,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50,"undead":true},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"slayerLevel":1,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35,"undead":true},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby dragon","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40,"dragon":true},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"slayerLevel":1,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":20,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"slayerLevel":1,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14,"dragon":true,"undead":true},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"slayerLevel":1,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16,"dragon":true,"undead":true},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3,"undead":true},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30,"undead":true},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30,"undead":true},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"slayerLevel":1,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20,"undead":true},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"slayerLevel":1,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"slayerLevel":1,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"slayerLevel":1,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30,"dragon":true},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"dragon":true},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"slayerLevel":1,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30,"dragon":true},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"slayerLevel":1,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true,"dragon":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"slayerLevel":1,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"venomImmune":true,"dragon":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"slayerLevel":1,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30,"dragon":true},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"slayerLevel":1,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"dragon":true},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true,"dragon":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"slayerLevel":1,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stab":1,"slash":1,"crush":1,"range":1,"magic":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42,"poisonImmune":true,"venomImmune":true,"dragon":true},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"slayerLevel":1,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"slayerLevel":1,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"slayerLevel":1,"attackSpeed":4,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"slayerLevel":1,"attackSpeed":4,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4,"undead":true},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":49,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8428":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8429":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8430":{"name":"Mother","hitpoints":235,"combatLevel":198,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":170,"rangeLevel":105,"magicLevel":60,"magicDef":200,"bonusAttack":60,"bonusStrength":50},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"slayerLevel":1,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"slayerLevel":1,"attackSpeed":5},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"slayerLevel":1,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"slayerLevel":1,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160,"dragon":true},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30,"dragon":true},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40,"dragon":true},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20,"dragon":true},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"slayerLevel":1,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"slayerLevel":1,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"stab":236,"slash":236,"crush":236,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5},"9026":{"name":"Crystalline Rat","combatLevel":24,"attackSpeed":4},"9028":{"name":"Crystalline Bat","combatLevel":33,"attackSpeed":4},"9029":{"name":"Crystalline Unicorn","combatLevel":48,"attackSpeed":4},"9030":{"name":"Crystalline Scorpion","combatLevel":64,"attackSpeed":4},"9031":{"name":"Crystalline Wolf","combatLevel":74,"attackSpeed":4},"9032":{"name":"Crystalline Bear","combatLevel":172,"attackSpeed":4},"9033":{"name":"Crystalline Dragon","combatLevel":172,"attackSpeed":4},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5},"9040":{"name":"Corrupted Rat","combatLevel":34,"attackSpeed":4},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4},"9043":{"name":"Corrupted Unicorn","combatLevel":64,"attackSpeed":4},"9044":{"name":"Corrupted Scorpion","combatLevel":89,"attackSpeed":4},"9045":{"name":"Corrupted Wolf","combatLevel":102,"attackSpeed":4},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9047":{"name":"Corrupted Dragon","combatLevel":258,"attackSpeed":4},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"slayerLevel":1,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"slayerLevel":1,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9246":{"name":"Arianwyn (hard)","hitpoints":300,"combatLevel":368,"attackSpeed":5,"defenceLevel":102,"rangeLevel":552,"magicLevel":153,"range":126,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":260},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":520,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"9282":{"name":"Basilisk Youngling","hitpoints":60,"combatLevel":57,"slayerLevel":40,"attackSpeed":4,"attackLevel":25,"strengthLevel":40,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"9287":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9288":{"name":"Monstrous Basilisk","hitpoints":170,"combatLevel":135,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"9289":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":180,"strengthLevel":180,"defenceLevel":180,"rangeLevel":180,"magicLevel":180,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50,"bonusStrength":12,"bonusRangeStrength":12,"bonusMagicDamage":12},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":280,"combatLevel":194,"slayerLevel":40,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"stabDef":25,"slashDef":25,"magicDef":25,"poisonImmune":true,"venomImmune":true}} \ No newline at end of file From 4a3a6a1de4d018085f254d1d9d7144c75ecab4f2 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 26 Oct 2019 08:45:39 +0200 Subject: [PATCH 082/185] inferno: attack timers, piano tiles, safespots, indicators, etc (#1783) * update to new RS version, fix safespot bug on 2nd run * fix wave mapping 64-66, add npc name display mode, cleanup * fix duplicate config key * refactor * refactor #2 * remove unused import * refactor 3 * fix descending box bug, optimize prayer indicator * remove unused import * refactor 4 * Delete dependencies.txt --- .../java/net/runelite/api/AnimationID.java | 1 + .../client/plugins/inferno/InfernoConfig.java | 927 ++++++++++++-- ...verlay.java => InfernoInfoBoxOverlay.java} | 82 +- .../client/plugins/inferno/InfernoJad.java | 86 -- .../client/plugins/inferno/InfernoNPC.java | 472 +++++-- .../inferno/InfernoNibblerOverlay.java | 72 -- .../plugins/inferno/InfernoOverlay.java | 489 +++++++- .../client/plugins/inferno/InfernoPlugin.java | 1106 +++++++++++++---- .../plugins/inferno/InfernoPrayerOverlay.java | 138 -- .../inferno/InfernoPrayerOverlayMode.java | 19 - .../plugins/inferno/InfernoWaveMappings.java | 70 +- .../plugins/inferno/InfernoWaveOverlay.java | 3 + .../InfernoNamingDisplayMode.java | 7 + .../InfernoPrayerDisplayMode.java | 8 + .../InfernoSafespotDisplayMode.java | 25 + .../InfernoWaveDisplayMode.java | 2 +- .../InfernoZukShieldDisplayMode.java | 25 + .../client/ui/overlay/OverlayUtil.java | 43 + 18 files changed, 2667 insertions(+), 908 deletions(-) rename runelite-client/src/main/java/net/runelite/client/plugins/inferno/{InfernoJadOverlay.java => InfernoInfoBoxOverlay.java} (62%) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJad.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlay.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlayMode.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoNamingDisplayMode.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoPrayerDisplayMode.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoSafespotDisplayMode.java rename runelite-client/src/main/java/net/runelite/client/plugins/inferno/{ => displaymodes}/InfernoWaveDisplayMode.java (96%) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoZukShieldDisplayMode.java 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 84233ef310..58f9a56ac3 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -273,6 +273,7 @@ public final class AnimationID // INFERNO animations public static final int JAL_NIB = 7574; public static final int JAL_MEJRAH = 7578; + public static final int JAL_MEJRAH_STAND = 7577; public static final int JAL_AK_RANGE_ATTACK = 7581; public static final int JAL_AK_MELEE_ATTACK = 7582; public static final int JAL_AK_MAGIC_ATTACK = 7583; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java index cd3eba1852..6658a37345 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoConfig.java @@ -25,56 +25,208 @@ package net.runelite.client.plugins.inferno; import java.awt.Color; +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; -import net.runelite.client.config.ConfigTitleSection; -import net.runelite.client.config.Title; +import net.runelite.client.config.ConfigSection; +import net.runelite.client.plugins.inferno.displaymodes.InfernoNamingDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoPrayerDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoSafespotDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoWaveDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoZukShieldDisplayMode; @ConfigGroup("inferno") public interface InfernoConfig extends Config { - @ConfigTitleSection( - keyName = "prayer", - position = 0, + + @ConfigSection( name = "Prayer", - description = "" + description = "Configuration options forPprayer", + position = 0, + keyName = "PrayerSection" ) - default Title prayer() + default boolean prayerSection() { - return new Title(); + return false; + } + + @ConfigSection( + name = "Safespots", + description = "Configuration options for Safespots", + position = 1, + keyName = "SafespotsSection" + ) + default boolean safespotsSection() + { + return false; + } + + @ConfigSection( + name = "Waves", + description = "Configuration options for Waves", + position = 2, + keyName = "WavesSection" + ) + default boolean wavesSection() + { + return false; + } + + @ConfigSection( + name = "ExtraSection", + description = "Configuration options for Extras", + position = 3, + keyName = "ExtraSection" + ) + default boolean extraSection() + { + return false; + } + + @ConfigSection( + name = "Nibblers", + description = "Configuration options for Nibblers", + position = 4, + keyName = "NibblersSection" + ) + default boolean nibblersSection() + { + return false; + } + + @ConfigSection( + name = "Bats", + description = "Configuration options for Bats", + position = 5, + keyName = "BatsSection" + ) + default boolean batsSection() + { + return false; + } + + @ConfigSection( + name = "Blobs", + description = "Configuration options for Blobs", + position = 6, + keyName = "BlobsSection" + ) + default boolean blobsSection() + { + return false; + } + + @ConfigSection( + name = "Meleers", + description = "Configuration options for Meleers", + position = 7, + keyName = "MeleersSection" + ) + default boolean meleersSection() + { + return false; + } + + @ConfigSection( + name = "Rangers", + description = "Configuration options for Rangers", + position = 8, + keyName = "RangersSection" + ) + default boolean rangersSection() + { + return false; + } + + @ConfigSection( + name = "Magers", + description = "Configuration options for Magers", + position = 9, + keyName = "MagersSection" + ) + default boolean magersSection() + { + return false; + } + + @ConfigSection( + name = "Jad", + description = "Configuration options for Jad", + position = 10, + keyName = "JadSection" + ) + default boolean jadSection() + { + return false; + } + + @ConfigSection( + name = "Jad Healers", + description = "Configuration options for Jad Healers", + position = 11, + keyName = "JadHealersSection" + ) + default boolean jadHealersSection() + { + return false; + } + + @ConfigSection( + name = "Zuk", + description = "Configuration options for Zuk", + position = 12, + keyName = "ZukSection" + ) + default boolean zukSection() + { + return false; + } + + @ConfigSection( + name = "Zuk Healers", + description = "Configuration options for Zuk Healers", + position = 13, + keyName = "ZukHealersSection" + ) + default boolean zukHealersSection() + { + return false; + } + + + @ConfigItem( + position = 0, + keyName = "prayerDisplayMode", + name = "Prayer Display Mode", + description = "Display prayer indicator in the prayer tab or in the bottom right corner of the screen", + section = "PrayerSection" + ) + default InfernoPrayerDisplayMode prayerDisplayMode() + { + return InfernoPrayerDisplayMode.BOTH; } @ConfigItem( position = 1, - keyName = "Prayer Helper", - name = "Prayer Helper", - description = "Indicates the correct prayer", - titleSection = "prayer" + keyName = "indicateWhenPrayingCorrectly", + name = "Indicate When Praying Correctly", + description = "Indicate the correct prayer, even if you are already praying that prayer", + section = "PrayerSection" ) - default boolean showPrayerHelp() + default boolean indicateWhenPrayingCorrectly() { return true; } @ConfigItem( position = 2, - keyName = "prayerHelperMode", - name = "Prayer Helper Mode", - description = "Display prayer indicator in the prayer tab or in the bottom right corner of the screen", - titleSection = "prayer" - ) - default InfernoPrayerOverlayMode prayerOverlayMode() - { - return InfernoPrayerOverlayMode.PRAYER_TAB; - } - - @ConfigItem( - position = 3, keyName = "descendingBoxes", name = "Descending Boxes", description = "Draws timing boxes above the prayer icons, as if you were playing Piano Tiles", - titleSection = "prayer" + section = "PrayerSection" ) default boolean descendingBoxes() { @@ -82,69 +234,83 @@ public interface InfernoConfig extends Config } @ConfigItem( - position = 4, - keyName = "indicateWhenPrayingCorrectly", - name = "Indicate When Praying Correctly", - description = "Indicate the correct prayer, even if you are already praying that prayer", - titleSection = "prayer" + position = 3, + keyName = "indicateNonPriorityDescendingBoxes", + name = "Indicate Non-Priority Boxes", + description = "Render descending boxes for prayers that are not the priority prayer for that tick", + section = "PrayerSection" ) - default boolean indicateWhenPrayingCorrectly() + default boolean indicateNonPriorityDescendingBoxes() { - return false; + return true; } - @ConfigTitleSection( - keyName = "monsters", - position = 5, - name = "Monsters", - description = "" + @ConfigItem( + position = 4, + keyName = "safespotDisplayMode", + name = "Tile Safespots", + description = "Indicate safespots on the ground: safespot (white), pray melee (red), pray range (green), pray magic (blue) and combinations of those", + section = "SafespotsSection" ) - default Title monsters() + default InfernoSafespotDisplayMode safespotDisplayMode() { - return new Title(); + return InfernoSafespotDisplayMode.AREA; + } + + @ConfigItem( + position = 5, + keyName = "safespotsCheckSize", + name = "Tile Safespots Check Size", + description = "The size of the area around the player that should be checked for safespots (SIZE x SIZE area)", + section = "SafespotsSection" + ) + default int safespotsCheckSize() + { + return 6; } @ConfigItem( position = 6, - keyName = "Nibbler Overlay", - name = "Nibbler Overlay", - description = "Shows if there are any Nibblers left", - titleSection = "monsters" + keyName = "indicateNonSafespotted", + name = "Non-safespotted NPC's Overlay", + description = "Red overlay for NPC's that can attack you", + section = "SafespotsSection" ) - default boolean displayNibblerOverlay() + default boolean indicateNonSafespotted() { return false; } @ConfigItem( position = 7, - keyName = "indicateActiveHealers", - name = "Indicate Active Healers", - description = "Indicate healers that are still healing Jad", - titleSection = "monsters" + keyName = "indicateTemporarySafespotted", + name = "Temporary safespotted NPC's Overlay", + description = "Orange overlay for NPC's that have to move to attack you", + section = "SafespotsSection" ) - default boolean indicateActiveHealers() + default boolean indicateTemporarySafespotted() { - return true; - } - - @ConfigTitleSection( - keyName = "waves", - position = 8, - name = "Waves", - description = "" - ) - default Title waves() - { - return new Title(); + return false; } @ConfigItem( - position = 9, + position = 8, + keyName = "indicateSafespotted", + name = "Safespotted NPC's Overlay", + description = "Green overlay for NPC's that are safespotted (can't attack you)", + section = "SafespotsSection" + ) + default boolean indicateSafespotted() + { + return false; + } + + @ConfigItem( + position = 0, keyName = "waveDisplay", - name = "Wave display", + name = "Wave Display", description = "Shows monsters that will spawn on the selected wave(s).", - titleSection = "waves" + section = "WavesSection" ) default InfernoWaveDisplayMode waveDisplay() { @@ -152,11 +318,35 @@ public interface InfernoConfig extends Config } @ConfigItem( - position = 10, + position = 1, + keyName = "npcNaming", + name = "NPC Naming", + description = "Simple (ex: Bat) or Complex (ex: Jal-MejRah) NPC naming", + section = "WavesSection" + ) + default InfernoNamingDisplayMode npcNaming() + { + return InfernoNamingDisplayMode.SIMPLE; + } + + @ConfigItem( + position = 2, + keyName = "npcLevels", + name = "NPC Levels", + description = "Show the combat level of the NPC next to their name", + section = "WavesSection" + ) + default boolean npcLevels() + { + return false; + } + + @ConfigItem( + position = 3, keyName = "getWaveOverlayHeaderColor", name = "Wave Header", description = "Color for Wave Header", - titleSection = "waves" + section = "WavesSection" ) default Color getWaveOverlayHeaderColor() { @@ -164,14 +354,611 @@ public interface InfernoConfig extends Config } @ConfigItem( - position = 11, + position = 4, keyName = "getWaveTextColor", name = "Wave Text Color", description = "Color for Wave Texts", - titleSection = "waves" + section = "WavesSection" ) default Color getWaveTextColor() { return Color.WHITE; } -} \ No newline at end of file + + @ConfigItem( + position = 0, + keyName = "indicateObstacles", + name = "Obstacles", + description = "Indicate obstacles that NPC's cannot pass through", + section = "ExtraSection" + ) + default boolean indicateObstacles() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "indicateNibblers", + name = "Indicate Nibblers", + description = "Indicate's nibblers that are alive", + section = "NibblersSection" + ) + default boolean indicateNibblers() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "hideJalNibDeath", + name = "Hide On Death", + description = "Hide Nibblers on death animation", + section = "NibblersSection" + ) + default boolean hideNibblerDeath() + { + return false; + } + + @ConfigItem( + position = 2, + keyName = "indicateCentralNibbler", + name = "Indicate Central Nibbler", + description = "Indicate the most central nibbler. If multiple nibblers will freeze the same amount of other nibblers, " + + "the nibbler closest to the player's location is chosen.", + section = "NibblersSection" + ) + default boolean indicateCentralNibbler() + { + return true; + } + + @ConfigItem( + position = 0, + keyName = "prayerBat", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "BatsSection" + ) + default boolean prayerBat() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "ticksOnNpcBat", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "BatsSection" + ) + default boolean ticksOnNpcBat() + { + return true; + } + + @ConfigItem( + position = 2, + keyName = "safespotsBat", + name = "Safespots", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "BatsSection" + ) + default boolean safespotsBat() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "indicateNpcPositionBat", + name = "Indicate Main Tile", + description = "Indicate the main tile for multi-tile NPC's. This tile is used for and pathfinding.", + section = "BatsSection" + ) + default boolean indicateNpcPositionBat() + { + return false; + } + + @ConfigItem( + position = 4, + keyName = "hideJalMejRahDeath", + name = "Hide On Death", + description = "Hide Jal-MejRah on death animation", + section = "BatsSection" + ) + default boolean hideBatDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "prayerBlob", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "BlobsSection" + ) + default boolean prayerBlob() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "indicateBlobDetectionTick", + name = "Indicate Blob Dection Tick", + description = "Show a prayer indicator (default: magic) for the tick on which the blob will detect prayer", + section = "BlobsSection" + ) + default boolean indicateBlobDetectionTick() + { + return true; + } + + @ConfigItem( + position = 2, + keyName = "ticksOnNpcBlob", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "BlobsSection" + ) + default boolean ticksOnNpcBlob() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "safespotsBlob", + name = "Safespots", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "BlobsSection" + ) + default boolean safespotsBlob() + { + return true; + } + + @ConfigItem( + position = 4, + keyName = "indicateNpcPositionBlob", + name = "Indicate Main Tile", + description = "Indicate the main tile for multi-tile NPC's. This tile is used for pathfinding.", + section = "BlobsSection" + ) + default boolean indicateNpcPositionBlob() + { + return false; + } + + @ConfigItem( + position = 5, + keyName = "hideJalAkDeath", + name = "Hide Blob On Death", + description = "Hide Jal-Ak on death animation", + section = "BlobsSection" + ) + default boolean hideBlobDeath() + { + return false; + } + + + @ConfigItem( + position = 6, + keyName = "hideJalAkRekXilDeath", + name = "Hide Small Range Blob On Death", + description = "Hide Jal-AkRek-Xil on death animation", + section = "BlobsSection" + ) + default boolean hideBlobSmallRangedDeath() + { + return false; + } + + @ConfigItem( + position = 7, + keyName = "hideJalAkRekMejDeath", + name = "Hide Small Magic Blob On Death", + description = "Hide Jal-AkRek-Mej on death animation", + section = "BlobsSection" + ) + default boolean hideBlobSmallMagicDeath() + { + return false; + } + + @ConfigItem( + position = 8, + keyName = "hideJalAkRekKetDeath", + name = "Hide Small Melee Blob On Death", + description = "Hide Jal-AkRek-Ket on death animation", + section = "BlobsSection" + ) + default boolean hideBlobSmallMeleeDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "prayerMeleer", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "MeleersSection" + ) + default boolean prayerMeleer() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "ticksOnNpcMeleer", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "MeleersSection" + ) + default boolean ticksOnNpcMeleer() + { + return true; + } + + @ConfigItem( + position = 2, + keyName = "safespotsMeleer", + name = "Safespots", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "MeleersSection" + ) + default boolean safespotsMeleer() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "indicateNpcPositionMeleer", + name = "Indicate Main Tile", + description = "Indicate the main tile for multi-tile NPC's. This tile is used for pathfinding.", + section = "MeleersSection" + ) + default boolean indicateNpcPositionMeleer() + { + return false; + } + + @ConfigItem( + position = 4, + keyName = "hideJalImKotDeath", + name = "Hide On Death", + description = "Hide Jal-ImKot on death animation", + section = "MeleersSection" + ) + default boolean hideMeleerDeath() + { + return false; + } + + + @ConfigItem( + position = 0, + keyName = "prayerRanger", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "RangersSection" + ) + default boolean prayerRanger() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "ticksOnNpcRanger", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "RangersSection" + ) + default boolean ticksOnNpcRanger() + { + return true; + } + + @ConfigItem( + position = 2, + keyName = "safespotsRanger", + name = "Safespots", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "RangersSection" + ) + default boolean safespotsRanger() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "indicateNpcPositionRanger", + name = "Indicate Main Tile", + description = "Indicate the main tile for multi-tile NPC's. This tile is used for pathfinding.", + section = "RangersSection" + ) + default boolean indicateNpcPositionRanger() + { + return false; + } + + @ConfigItem( + position = 4, + keyName = "hideJalXilDeath", + name = "Hide On Death", + description = "Hide Jal-Xil on death animation", + section = "RangersSection" + ) + default boolean hideRangerDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "prayerMage", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "MagersSection" + ) + default boolean prayerMage() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "ticksOnNpcMage", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "MagersSection" + ) + default boolean ticksOnNpcMage() + { + return true; + } + + @ConfigItem( + position = 2, + keyName = "safespotsMage", + name = "Safespots", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "MagersSection" + ) + default boolean safespotsMage() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "indicateNpcPositionMage", + name = "Indicate Main Tile", + description = "Indicate the main tile for multi-tile NPC's. This tile is used for pathfinding.", + section = "MagersSection" + ) + default boolean indicateNpcPositionMage() + { + return false; + } + + @ConfigItem( + position = 4, + keyName = "hideJalZekDeath", + name = "Hide On Death", + description = "Hide Jal-Zek on death animation", + section = "MagersSection" + ) + default boolean hideMagerDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "prayerHealersJad", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "JadHealersSection" + ) + default boolean prayerHealerJad() + { + return false; + } + + @ConfigItem( + position = 1, + keyName = "ticksOnNpcHealersJad", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "JadHealersSection" + ) + default boolean ticksOnNpcHealerJad() + { + return false; + } + + @ConfigItem( + position = 2, + keyName = "safespotsHealersJad", + name = "Safespots", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "JadHealersSection" + ) + default boolean safespotsHealerJad() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "indicateActiveHealersJad", + name = "Indicate Active Healers", + description = "Indicate healers that are still healing Jad", + section = "JadHealersSection" + ) + default boolean indicateActiveHealerJad() + { + return true; + } + + @ConfigItem( + position = 4, + keyName = "hideYtHurKotDeath", + name = "Hide On Death", + description = "Hide Yt-HurKot on death animation", + section = "JadHealersSection" + ) + default boolean hideHealerJadDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "prayerJad", + name = "Prayer Helper", + description = "Indicate the correct prayer when this NPC attacks", + section = "JadSection" + ) + default boolean prayerJad() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "ticksOnNpcJad", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "JadSection" + ) + default boolean ticksOnNpcJad() + { + return true; + } + + @ConfigItem( + position = 2, + keyName = "safespotsJad", + name = "Safespots (Melee Range Only)", + description = "Enable or disable safespot calculation for this specific NPC. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "JadSection" + ) + default boolean safespotsJad() + { + return true; + } + + @ConfigItem( + position = 3, + keyName = "hideJalTokJadDeath", + name = "Hide On Death", + description = "Hide JalTok-Jad on death animation", + section = "JadSection" + ) + default boolean hideJadDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "indicateActiveHealersZuk", + name = "Indicate Active Healers (UNTESTED)", + description = "Indicate healers that are still healing Zuk", + section = "ZukHealersSection" + ) + default boolean indicateActiveHealerZuk() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "hideJalMejJakDeath", + name = "Hide On Death", + description = "Hide Jal-MejJak on death animation", + section = "ZukHealersSection" + ) + default boolean hideHealerZukDeath() + { + return false; + } + + @ConfigItem( + position = 0, + keyName = "ticksOnNpcZuk", + name = "Ticks on NPC", + description = "Draws the amount of ticks before an NPC is going to attack on the NPC", + section = "ZukSection" + ) + default boolean ticksOnNpcZuk() + { + return true; + } + + @ConfigItem( + position = 1, + keyName = "safespotsZukShieldBeforeHealers", + name = "Safespots (Before Healers)", + description = "Indicate the zuk shield safespots. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "ZukSection" + ) + default InfernoZukShieldDisplayMode safespotsZukShieldBeforeHealers() + { + return InfernoZukShieldDisplayMode.PREDICT; + } + + @ConfigItem( + position = 2, + keyName = "safespotsZukShieldAfterHealers", + name = "Safespots (After Healers)", + description = "Indicate the zuk shield safespots. 'Tile Safespots' in the 'Safespots' category needs to be turned on for this to take effect.", + section = "ZukSection" + ) + default InfernoZukShieldDisplayMode safespotsZukShieldAfterHealers() + { + return InfernoZukShieldDisplayMode.LIVE; + } + + @ConfigItem( + position = 3, + keyName = "hideTzKalZukDeath", + name = "Hide On Death", + description = "Hide TzKal-Zuk on death animation", + section = "ZukSection" + ) + default boolean hideZukDeath() + { + 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/inferno/InfernoJadOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoInfoBoxOverlay.java similarity index 62% rename from runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoInfoBoxOverlay.java index 404f128e56..41e6f2411e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJadOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoInfoBoxOverlay.java @@ -33,6 +33,7 @@ import javax.inject.Singleton; import net.runelite.api.Client; import net.runelite.api.SpriteID; import net.runelite.client.game.SpriteManager; +import net.runelite.client.plugins.inferno.displaymodes.InfernoPrayerDisplayMode; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; @@ -41,16 +42,19 @@ import net.runelite.client.ui.overlay.components.ImageComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Singleton -public class InfernoJadOverlay extends Overlay +public class InfernoInfoBoxOverlay extends Overlay { private static final Color NOT_ACTIVATED_BACKGROUND_COLOR = new Color(150, 0, 0, 150); private final Client client; private final InfernoPlugin plugin; private final SpriteManager spriteManager; private final PanelComponent imagePanelComponent = new PanelComponent(); + private BufferedImage prayMeleeSprite; + private BufferedImage prayRangedSprite; + private BufferedImage prayMagicSprite; @Inject - private InfernoJadOverlay(final Client client, final InfernoPlugin plugin, final SpriteManager spriteManager) + private InfernoInfoBoxOverlay(final Client client, final InfernoPlugin plugin, final SpriteManager spriteManager) { setPosition(OverlayPosition.BOTTOM_RIGHT); setPriority(OverlayPriority.HIGH); @@ -62,48 +66,56 @@ public class InfernoJadOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!plugin.isShowPrayerHelp() || (plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.BOTTOM_RIGHT - && plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.BOTH)) + if (plugin.getPrayerDisplayMode() != InfernoPrayerDisplayMode.BOTTOM_RIGHT + && plugin.getPrayerDisplayMode() != InfernoPrayerDisplayMode.BOTH) { return null; } - InfernoJad.Attack attack = null; - int leastTicks = 999; - - for (InfernoJad jad : plugin.getJads()) - { - if (jad.getNextAttack() == null || jad.getTicksTillNextAttack() < 1) - { - continue; - } - - if (jad.getTicksTillNextAttack() < leastTicks) - { - leastTicks = jad.getTicksTillNextAttack(); - attack = jad.getNextAttack(); - } - } - - if (attack == null) - { - return null; - } - - final BufferedImage prayerImage = getPrayerImage(attack); - imagePanelComponent.getChildren().clear(); - imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); - imagePanelComponent.setBackgroundColor(client.isPrayerActive(attack.getPrayer()) - ? ComponentConstants.STANDARD_BACKGROUND_COLOR - : NOT_ACTIVATED_BACKGROUND_COLOR); + + if (plugin.getClosestAttack() != null) + { + final BufferedImage prayerImage = getPrayerImage(plugin.getClosestAttack()); + + imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); + imagePanelComponent.setBackgroundColor(client.isPrayerActive(plugin.getClosestAttack().getPrayer()) + ? ComponentConstants.STANDARD_BACKGROUND_COLOR + : NOT_ACTIVATED_BACKGROUND_COLOR); + } + else + { + imagePanelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR); + } return imagePanelComponent.render(graphics); } - private BufferedImage getPrayerImage(InfernoJad.Attack attack) + private BufferedImage getPrayerImage(InfernoNPC.Attack attack) { - final int prayerSpriteID = attack == InfernoJad.Attack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES; - return spriteManager.getSprite(prayerSpriteID, 0); + if (prayMeleeSprite == null) + { + prayMeleeSprite = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MELEE, 0); + } + if (prayRangedSprite == null) + { + prayRangedSprite = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); + } + if (prayMagicSprite == null) + { + prayMagicSprite = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0); + } + + switch (attack) + { + case MELEE: + return prayMeleeSprite; + case RANGED: + return prayRangedSprite; + case MAGIC: + return prayMagicSprite; + } + + return prayMagicSprite; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJad.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJad.java deleted file mode 100644 index 3da29b866f..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoJad.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2017, Devin French - * 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.inferno; - -import lombok.AccessLevel; -import lombok.Getter; -import net.runelite.api.AnimationID; -import net.runelite.api.NPC; -import net.runelite.api.Prayer; - -@Getter(AccessLevel.PACKAGE) -public class InfernoJad -{ - private static final int TICKS_AFTER_ANIMATION = 4; - - private NPC npc; - private Attack nextAttack; - private int ticksTillNextAttack; - - InfernoJad(NPC npc) - { - this.npc = npc; - nextAttack = null; - ticksTillNextAttack = -1; - } - - void updateNextAttack(Attack nextAttack) - { - this.nextAttack = nextAttack; - this.ticksTillNextAttack = TICKS_AFTER_ANIMATION; - } - - void gameTick() - { - if (ticksTillNextAttack < 0) - { - return; - } - - this.ticksTillNextAttack--; - - if (ticksTillNextAttack < 0) - { - nextAttack = null; - } - } - - @Getter(AccessLevel.PACKAGE) - enum Attack - { - MAGIC(AnimationID.JALTOK_JAD_MAGE_ATTACK, Prayer.PROTECT_FROM_MAGIC), - RANGE(AnimationID.JALTOK_JAD_RANGE_ATTACK, Prayer.PROTECT_FROM_MISSILES); - - private final int animation; - private final Prayer prayer; - - Attack(final int animation, final Prayer prayer) - { - this.animation = animation; - this.prayer = prayer; - } - } -} - diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java index 1bcd8702f9..6e6e122785 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNPC.java @@ -1,15 +1,15 @@ /* - * Copyright (c) 2019, Jacky + * Copyright (c) 2017, Devin French * 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. + * 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 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 @@ -25,162 +25,376 @@ package net.runelite.client.plugins.inferno; import java.awt.Color; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import lombok.AccessLevel; import lombok.Getter; -import lombok.Setter; +import net.runelite.api.AnimationID; +import net.runelite.api.Client; import net.runelite.api.NPC; import net.runelite.api.NpcID; +import net.runelite.api.Prayer; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; +import org.apache.commons.lang3.ArrayUtils; public class InfernoNPC { - public enum Attackstyle - { - MAGE("Mage", Color.CYAN), - RANGE("Range", Color.GREEN), - MELEE("Melee", Color.WHITE), - RANDOM("Random", Color.ORANGE); - - @Getter(AccessLevel.PACKAGE) - private String name; - - @Getter(AccessLevel.PACKAGE) - private Color color; - - Attackstyle(String s, Color c) - { - this.name = s; - this.color = c; - } - } - @Getter(AccessLevel.PACKAGE) private NPC npc; - @Getter(AccessLevel.PACKAGE) - private String name; - + private Type type; @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private Attackstyle attackstyle; - + private Attack nextAttack; @Getter(AccessLevel.PACKAGE) - private int attackTicks; - - @Getter(AccessLevel.PACKAGE) - private int priority; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private int ticksTillAttack = -1; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private boolean attacking = false; - - @Getter(AccessLevel.PACKAGE) - private int attackAnimation; - - @Getter(AccessLevel.PACKAGE) - private boolean isMidAttack = false; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private int distanceToPlayer = 0; - - @Getter(AccessLevel.PACKAGE) - int textLocHeight; + private int ticksTillNextAttack; + private int lastAnimation; + private boolean lastCanAttack; + //0 = not in LOS, 1 = in LOS after move, 2 = in LOS + private final Map safeSpotCache; InfernoNPC(NPC npc) { this.npc = npc; - textLocHeight = npc.getLogicalHeight() + 40; - switch (npc.getId()) + this.type = Type.typeFromId(npc.getId()); + this.nextAttack = type.getDefaultAttack(); + this.ticksTillNextAttack = 0; + this.lastAnimation = -1; + this.lastCanAttack = false; + this.safeSpotCache = new HashMap(); + } + + void updateNextAttack(Attack nextAttack, int ticksTillNextAttack) + { + this.nextAttack = nextAttack; + this.ticksTillNextAttack = ticksTillNextAttack; + } + + private void updateNextAttack(Attack nextAttack) + { + this.nextAttack = nextAttack; + } + + boolean canAttack(Client client, WorldPoint target) + { + if (safeSpotCache.containsKey(target)) { - case NpcID.JALAKREKKET: - attackTicks = 4; - name = "lil mel"; - attackAnimation = 7582; - attackstyle = Attackstyle.MELEE; - priority = 7; - break; + return safeSpotCache.get(target) == 2; + } - case NpcID.JALAKREKXIL: - attackTicks = 4; - name = "lil range"; - attackAnimation = 7583; - attackstyle = Attackstyle.RANGE; - priority = 6; - break; + boolean hasLos = new WorldArea(target, 1, 1).hasLineOfSightTo(client, this.getNpc().getWorldArea()); + boolean hasRange = this.getType().getDefaultAttack() == Attack.MELEE ? this.getNpc().getWorldArea().isInMeleeDistance(target) + : this.getNpc().getWorldArea().distanceTo(target) <= this.getType().getRange(); - case NpcID.JALAKREKMEJ: - attackTicks = 4; - name = "lil mage"; - attackAnimation = 7581; - attackstyle = Attackstyle.MAGE; - priority = 5; - break; + if (hasLos && hasRange) + { + safeSpotCache.put(target, 2); + } - case NpcID.JALMEJRAH: - attackTicks = 3; - name = "bat"; - attackAnimation = 7578; - attackstyle = Attackstyle.RANGE; - priority = 4; - break; + return hasLos && hasRange; + } - case NpcID.JALAK: - attackTicks = 6; - name = "blob"; - attackAnimation = 7583; // also 7581 - attackstyle = Attackstyle.RANDOM; - priority = 3; - break; + boolean canMoveToAttack(Client client, WorldPoint target, List obstacles) + { + if (safeSpotCache.containsKey(target)) + { + return safeSpotCache.get(target) == 1 || safeSpotCache.get(target) == 2; + } - case NpcID.JALIMKOT: - attackTicks = 4; - name = "meleer"; - attackAnimation = 7597; - attackstyle = Attackstyle.MELEE; - priority = 2; - break; + final List realObstacles = new ArrayList<>(); + for (WorldPoint obstacle : obstacles) + { + if (this.getNpc().getWorldArea().toWorldPointList().contains(obstacle)) + { + continue; + } - case NpcID.JALXIL: - attackTicks = 4; - name = "ranger"; - attackAnimation = 7605; - attackstyle = Attackstyle.RANGE; - priority = 1; - break; + realObstacles.add(obstacle); + } - case NpcID.JALZEK: - attackTicks = 4; - name = "mager"; - attackAnimation = 7610; - attackstyle = Attackstyle.MAGE; - priority = 0; - break; + final WorldArea targetArea = new WorldArea(target, 1, 1); + WorldArea currentWorldArea = this.getNpc().getWorldArea(); - default: - attackTicks = 0; + int steps = 0; + while (true) + { + // Prevent infinite loop in case of pathfinding failure + steps++; + if (steps > 30) + { + return false; + } + + final WorldArea predictedWorldArea = currentWorldArea.calculateNextTravellingPoint(client, targetArea, true, x -> + { + for (WorldPoint obstacle : realObstacles) + { + if (new WorldArea(x, 1, 1).intersectsWith(new WorldArea(obstacle, 1, 1))) + { + return false; + } + } + return true; + }); + + // Will only happen when NPC is underneath player or moving out of scene (but this will never show on overlay) + if (predictedWorldArea == null) + { + safeSpotCache.put(target, 1); + return true; + } + + if (predictedWorldArea == currentWorldArea) + { + safeSpotCache.put(target, 0); + return false; + } + + boolean hasLos = new WorldArea(target, 1, 1).hasLineOfSightTo(client, predictedWorldArea); + boolean hasRange = this.getType().getDefaultAttack() == Attack.MELEE ? predictedWorldArea.isInMeleeDistance(target) + : predictedWorldArea.distanceTo(target) <= this.getType().getRange(); + + if (hasLos && hasRange) + { + safeSpotCache.put(target, 1); + return true; + } + + currentWorldArea = predictedWorldArea; } } - public String info() + private boolean couldAttackPrevTick(Client client, WorldPoint lastPlayerLocation) { - String info = ""; - - if (attacking) - { - info += ticksTillAttack; - } - //info += " D: " + distanceToPlayer; - - return info; + return new WorldArea(lastPlayerLocation, 1, 1).hasLineOfSightTo(client, this.getNpc().getWorldArea()); } - void attacked() + void gameTick(Client client, WorldPoint lastPlayerLocation, boolean finalPhase) { - ticksTillAttack = attackTicks; - attacking = true; + safeSpotCache.clear(); + + if (ticksTillNextAttack > 0) + { + this.ticksTillNextAttack--; + } + + //Jad animation detection + if (this.getType() == Type.JAD && this.getNpc().getAnimation() != -1 && this.getNpc().getAnimation() != this.lastAnimation) + { + final InfernoNPC.Attack currentAttack = InfernoNPC.Attack.attackFromId(this.getNpc().getAnimation()); + + if (currentAttack != null && currentAttack != Attack.UNKNOWN) + { + this.updateNextAttack(currentAttack, this.getType().getTicksAfterAnimation()); + } + } + + if (ticksTillNextAttack <= 0) + { + switch (this.getType()) + { + case ZUK: + if (this.getNpc().getAnimation() == AnimationID.TZKAL_ZUK) + { + if (finalPhase) + { + this.updateNextAttack(this.getType().getDefaultAttack(), 7); + } + else + { + this.updateNextAttack(this.getType().getDefaultAttack(), 10); + } + } + break; + case JAD: + if (this.getNextAttack() != Attack.UNKNOWN) + { + // Jad's cycle continuous after his animation + attack but there's no animation to alert it + this.updateNextAttack(this.getType().getDefaultAttack(), 8); + } + break; + case BLOB: + //RS pathfinding + LOS = hell, so if it can attack you the tick you were on previously, start attack cycle + if (!this.lastCanAttack && this.couldAttackPrevTick(client, lastPlayerLocation)) + { + this.updateNextAttack(Attack.UNKNOWN, 3); + } + //If there's no animation when coming out of the safespot, the blob is detecting prayer + else if (!this.lastCanAttack && this.canAttack(client, client.getLocalPlayer().getWorldLocation())) + { + this.updateNextAttack(Attack.UNKNOWN, 4); + } + //This will activate another attack cycle + else if (this.getNpc().getAnimation() != -1) + { + this.updateNextAttack(this.getType().getDefaultAttack(), this.getType().getTicksAfterAnimation()); + } + break; + case BAT: + // Range + LOS check for bat because it suffers from the defense animation bug, also dont activate on "stand" animation + if (this.canAttack(client, client.getLocalPlayer().getWorldLocation()) + && this.getNpc().getAnimation() != AnimationID.JAL_MEJRAH_STAND && this.getNpc().getAnimation() != -1) + { + this.updateNextAttack(this.getType().getDefaultAttack(), this.getType().getTicksAfterAnimation()); + } + break; + case MELEE: + case RANGER: + case MAGE: + // For the meleer, ranger and mage the attack animation is always prioritized so only check for those + // Normal attack animation, doesnt suffer from defense animation bug. Activate usual attack cycle + if (this.getNpc().getAnimation() == AnimationID.JAL_IMKOT + || this.getNpc().getAnimation() == AnimationID.JAL_XIL_RANGE_ATTACK || this.getNpc().getAnimation() == AnimationID.JAL_XIL_MELEE_ATTACK + || this.getNpc().getAnimation() == AnimationID.JAL_ZEK_MAGE_ATTACK || this.getNpc().getAnimation() == AnimationID.JAL_ZEK_MELEE_ATTACK) + { + this.updateNextAttack(this.getType().getDefaultAttack(), this.getType().getTicksAfterAnimation()); + } + // Burrow into ground animation for meleer + else if (this.getNpc().getAnimation() == 7600) + { + this.updateNextAttack(this.getType().getDefaultAttack(), 12); + } + // Respawn enemy animation for mage + else if (this.getNpc().getAnimation() == 7611) + { + this.updateNextAttack(this.getType().getDefaultAttack(), 8); + } + break; + default: + if (this.getNpc().getAnimation() != -1) + { + // This will activate another attack cycle + this.updateNextAttack(this.getType().getDefaultAttack(), this.getType().getTicksAfterAnimation()); + } + break; + } + } + + //Blob prayer detection + if (this.getType() == Type.BLOB && this.getTicksTillNextAttack() == 3 + && client.getLocalPlayer().getWorldLocation().distanceTo(this.getNpc().getWorldArea()) <= Type.BLOB.getRange()) + { + InfernoNPC.Attack nextBlobAttack = InfernoNPC.Attack.UNKNOWN; + if (client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES)) + { + nextBlobAttack = InfernoNPC.Attack.MAGIC; + } + else if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC)) + { + nextBlobAttack = InfernoNPC.Attack.RANGED; + } + + this.updateNextAttack(nextBlobAttack); + } + + // This is for jad (jad's animation lasts till after the attack is launched, which fucks up the attack cycle) + lastAnimation = this.getNpc().getAnimation(); + // This is for blob (to check if player just came out of safespot) + lastCanAttack = this.canAttack(client, client.getLocalPlayer().getWorldLocation()); + } + + @Getter(AccessLevel.PACKAGE) + enum Attack + { + MELEE(Prayer.PROTECT_FROM_MELEE, + Color.ORANGE, + Color.RED, + new int[]{ + AnimationID.JAL_NIB, + AnimationID.JAL_AK_MELEE_ATTACK, + AnimationID.JAL_IMKOT, + AnimationID.JAL_XIL_MELEE_ATTACK, + AnimationID.JAL_ZEK_MELEE_ATTACK, //TODO: Yt-HurKot attack animation + }), + RANGED(Prayer.PROTECT_FROM_MISSILES, + Color.GREEN, + new Color(0, 128, 0), + new int[]{ + AnimationID.JAL_MEJRAH, + AnimationID.JAL_AK_RANGE_ATTACK, + AnimationID.JAL_XIL_RANGE_ATTACK, + AnimationID.JALTOK_JAD_RANGE_ATTACK, + }), + MAGIC(Prayer.PROTECT_FROM_MAGIC, + Color.CYAN, + Color.BLUE, + new int[]{ + AnimationID.JAL_AK_MAGIC_ATTACK, + AnimationID.JAL_ZEK_MAGE_ATTACK, + AnimationID.JALTOK_JAD_MAGE_ATTACK + }), + UNKNOWN(null, Color.WHITE, Color.GRAY, new int[]{}); + + private final Prayer prayer; + private final Color normalColor; + private final Color criticalColor; + private final int[] animationIds; + + Attack(Prayer prayer, Color normalColor, Color criticalColor, int[] animationIds) + { + this.prayer = prayer; + this.normalColor = normalColor; + this.criticalColor = criticalColor; + this.animationIds = animationIds; + } + + static Attack attackFromId(int animationId) + { + for (Attack attack : Attack.values()) + { + if (ArrayUtils.contains(attack.getAnimationIds(), animationId)) + { + return attack; + } + } + + return null; + } + } + + @Getter(AccessLevel.PACKAGE) + enum Type + { + NIBBLER(new int[]{NpcID.JALNIB}, Attack.MELEE, 4, 99, 100), + BAT(new int[]{NpcID.JALMEJRAH}, Attack.RANGED, 3, 4, 7), + BLOB(new int[]{NpcID.JALAK}, Attack.UNKNOWN, 6, 15, 4), + MELEE(new int[]{NpcID.JALIMKOT}, Attack.MELEE, 4, 1, 3), + RANGER(new int[]{NpcID.JALXIL, NpcID.JALXIL_7702}, Attack.RANGED, 4, 98, 2), + MAGE(new int[]{NpcID.JALZEK, NpcID.JALZEK_7703}, Attack.MAGIC, 4, 98, 1), + JAD(new int[]{NpcID.JALTOKJAD, NpcID.JALTOKJAD_7704}, Attack.UNKNOWN, 3, 99, 0), + HEALER_JAD(new int[]{NpcID.YTHURKOT, NpcID.YTHURKOT_7701, NpcID.YTHURKOT_7705}, Attack.MELEE, 4, 1, 6), + ZUK(new int[]{NpcID.TZKALZUK}, Attack.UNKNOWN, 10, 99, 99), + HEALER_ZUK(new int[]{NpcID.JALMEJJAK}, Attack.UNKNOWN, -1, 99, 100); + + private final int[] npcIds; + private final Attack defaultAttack; + private final int ticksAfterAnimation; + private final int range; + private final int priority; + + Type(int[] npcIds, Attack defaultAttack, int ticksAfterAnimation, int range, int priority) + { + this.npcIds = npcIds; + this.defaultAttack = defaultAttack; + this.ticksAfterAnimation = ticksAfterAnimation; + this.range = range; + this.priority = priority; + } + + static Type typeFromId(int npcId) + { + for (Type type : Type.values()) + { + if (ArrayUtils.contains(type.getNpcIds(), npcId)) + { + return type; + } + } + + return null; + } } } + diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java deleted file mode 100644 index a55b0f9f2e..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoNibblerOverlay.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2019, Jacky - * 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.inferno; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import javax.inject.Inject; -import javax.inject.Singleton; -import net.runelite.api.Client; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayPosition; -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; - -@Singleton -public class InfernoNibblerOverlay extends Overlay -{ - private final Client client; - private final InfernoPlugin plugin; - - private final PanelComponent panelComponent = new PanelComponent(); - - @Inject - public InfernoNibblerOverlay(final Client client, final InfernoPlugin plugin) - { - this.client = client; - this.plugin = plugin; - setPosition(OverlayPosition.TOP_LEFT); - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (!plugin.isDisplayNibblerOverlay() || plugin.getNibblers().size() == 0 || client.getMapRegions()[0] != 9043) - { - return null; - } - - panelComponent.getChildren().clear(); - TableComponent tableComponent = new TableComponent(); - tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - - tableComponent.addRow("Nibblers Left: ", Integer.toString(plugin.getNibblers().size())); - - panelComponent.getChildren().add(tableComponent); - - return panelComponent.render(graphics); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java index 75f6587bc5..c710e00eb2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoOverlay.java @@ -1,56 +1,46 @@ -/* - * Copyright (c) 2019, Jacky - * 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.inferno; -import com.google.common.base.Strings; 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.ArrayList; +import java.util.List; +import java.util.Map; import javax.inject.Inject; -import javax.inject.Singleton; import net.runelite.api.Client; -import net.runelite.api.NPC; import net.runelite.api.Perspective; import net.runelite.api.Point; +import net.runelite.api.Prayer; 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.client.plugins.inferno.displaymodes.InfernoPrayerDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoSafespotDisplayMode; 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; -@Singleton public class InfernoOverlay extends Overlay { - private final Client client; + private static final int TICK_PIXEL_SIZE = 60; + private static final int BOX_WIDTH = 10; + private static final int BOX_HEIGHT = 5; + private final InfernoPlugin plugin; + private final Client client; @Inject - public InfernoOverlay(final Client client, final InfernoPlugin plugin) + private InfernoOverlay(final Client client, final InfernoPlugin plugin) { setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_SCENE); + setLayer(OverlayLayer.ABOVE_WIDGETS); + setPriority(OverlayPriority.HIGHEST); + this.client = client; this.plugin = plugin; } @@ -58,55 +48,426 @@ public class InfernoOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!client.isInInstancedRegion() || client.getMapRegions()[0] != 9043) + final Widget meleePrayerWidget = client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MELEE); + final Widget rangePrayerWidget = client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES); + final Widget magicPrayerWidget = client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC); + + if (plugin.isIndicateObstacles()) { - return null; + renderObstacles(graphics); } - for (InfernoNPC monster : plugin.getMonsters().values()) + if (plugin.getSafespotDisplayMode() == InfernoSafespotDisplayMode.AREA) { - NPC npc = monster.getNpc(); - //if (npc == null || !config.showPrayer()) return; - LocalPoint lp = npc.getLocalLocation(); - if (lp != null) + renderAreaSafepots(graphics); + } + else if (plugin.getSafespotDisplayMode() == InfernoSafespotDisplayMode.INDIVIDUAL_TILES) + { + renderIndividualTilesSafespots(graphics); + } + + for (InfernoNPC infernoNPC : plugin.getInfernoNpcs()) + { + if (infernoNPC.getNpc().getConvexHull() != null) { - Point point = Perspective.localToCanvas(client, lp, client.getPlane(), npc.getLogicalHeight()); - if (point != null) + if (plugin.isIndicateNonSafespotted() && plugin.isNormalSafespots(infernoNPC) + && infernoNPC.canAttack(client, client.getLocalPlayer().getWorldLocation())) { - if (monster.getTicksTillAttack() == 1 || (monster.getName().equals("blob") && monster.getTicksTillAttack() <= 3)) - { - renderTextLocation(graphics, monster, monster.info(), Color.GREEN); - } - else - { - renderTextLocation(graphics, monster, monster.info(), Color.RED); - } + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.RED); + } + if (plugin.isIndicateTemporarySafespotted() && plugin.isNormalSafespots(infernoNPC) + && infernoNPC.canMoveToAttack(client, client.getLocalPlayer().getWorldLocation(), plugin.getObstacles())) + { + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.YELLOW); + } + if (plugin.isIndicateSafespotted() && plugin.isNormalSafespots(infernoNPC)) + { + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.GREEN); + } + if (plugin.isIndicateNibblers() && infernoNPC.getType() == InfernoNPC.Type.NIBBLER + && (!plugin.isIndicateCentralNibbler() || plugin.getCentralNibbler() != infernoNPC)) + { + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.CYAN); + } + if (plugin.isIndicateCentralNibbler() && infernoNPC.getType() == InfernoNPC.Type.NIBBLER + && plugin.getCentralNibbler() == infernoNPC) + { + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.BLUE); + } + if (plugin.isIndicateActiveHealersJad() && infernoNPC.getType() == InfernoNPC.Type.HEALER_JAD + && infernoNPC.getNpc().getInteracting() != client.getLocalPlayer()) + { + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.CYAN); + } + if (plugin.isIndicateActiveHealersZuk() && infernoNPC.getType() == InfernoNPC.Type.HEALER_ZUK + && infernoNPC.getNpc().getInteracting() != client.getLocalPlayer()) + { + OverlayUtil.renderPolygon(graphics, infernoNPC.getNpc().getConvexHull(), Color.CYAN); } } + + if (plugin.isIndicateNpcPosition(infernoNPC)) + { + renderNpcLocation(graphics, infernoNPC); + } + + if (plugin.isTicksOnNpc(infernoNPC) && infernoNPC.getTicksTillNextAttack() > 0) + { + renderTicksOnNpc(graphics, infernoNPC); + } } + + if ((plugin.getPrayerDisplayMode() == InfernoPrayerDisplayMode.PRAYER_TAB + || plugin.getPrayerDisplayMode() == InfernoPrayerDisplayMode.BOTH) + && (meleePrayerWidget != null && !meleePrayerWidget.isHidden() + && rangePrayerWidget != null && !rangePrayerWidget.isHidden() + && magicPrayerWidget != null && !magicPrayerWidget.isHidden())) + { + renderPrayerIconOverlay(graphics); + + if (plugin.isDescendingBoxes()) + { + renderDescendingBoxes(graphics); + } + } + return null; } - // renders text location - private static void renderTextLocation(Graphics2D graphics, InfernoNPC actor, String text, Color color) + private void renderObstacles(Graphics2D graphics) { - graphics.setFont(new Font("Arial", Font.BOLD, 15)); - Point textLocation = actor.getNpc().getCanvasTextLocation(graphics, text, actor.textLocHeight + 40); - if (Strings.isNullOrEmpty(text)) + for (WorldPoint worldPoint : plugin.getObstacles()) { - return; - } + final LocalPoint localPoint = LocalPoint.fromWorld(client, worldPoint); - if (textLocation != null) - { - int x = textLocation.getX(); - int y = textLocation.getY(); + if (localPoint == null) + { + continue; + } - graphics.setColor(Color.BLACK); - graphics.drawString(text, x + 1, y + 1); + final Polygon tilePoly = Perspective.getCanvasTilePoly(client, localPoint); - graphics.setColor(color); - graphics.drawString(text, x, y); + if (tilePoly == null) + { + continue; + } + + OverlayUtil.renderPolygon(graphics, tilePoly, Color.BLUE); } } + + private void renderAreaSafepots(Graphics2D graphics) + { + for (int safeSpotId : plugin.getSafeSpotAreas().keySet()) + { + if (safeSpotId > 6) + { + continue; + } + + Color colorEdge1 = null; + Color colorEdge2 = null; + Color colorFill = null; + + switch (safeSpotId) + { + case 0: + colorEdge1 = Color.WHITE; + colorFill = Color.WHITE; + break; + case 1: + colorEdge1 = Color.RED; + colorFill = Color.RED; + break; + case 2: + colorEdge1 = Color.GREEN; + colorFill = Color.GREEN; + break; + case 3: + colorEdge1 = Color.BLUE; + colorFill = Color.BLUE; + break; + case 4: + colorEdge1 = Color.RED; + colorEdge2 = Color.GREEN; + colorFill = Color.YELLOW; + break; + case 5: + colorEdge1 = Color.RED; + colorEdge2 = Color.BLUE; + colorFill = new Color(255, 0, 255); + break; + case 6: + colorEdge1 = Color.GREEN; + colorEdge2 = Color.BLUE; + colorFill = new Color(0, 255, 255); + break; + default: + continue; + } + + //Add all edges, calculate average edgeSize and indicate tiles + final List allEdges = new ArrayList<>(); + int edgeSizeSquared = 0; + + for (WorldPoint worldPoint : plugin.getSafeSpotAreas().get(safeSpotId)) + { + final LocalPoint localPoint = LocalPoint.fromWorld(client, worldPoint); + + if (localPoint == null) + { + continue; + } + + final Polygon tilePoly = Perspective.getCanvasTilePoly(client, localPoint); + + if (tilePoly == null) + { + continue; + } + + OverlayUtil.renderAreaTilePolygon(graphics, tilePoly, colorFill); + + final int[][] edge1 = new int[][]{{tilePoly.xpoints[0], tilePoly.ypoints[0]}, {tilePoly.xpoints[1], tilePoly.ypoints[1]}}; + edgeSizeSquared += Math.pow(tilePoly.xpoints[0] - tilePoly.xpoints[1], 2) + Math.pow(tilePoly.ypoints[0] - tilePoly.ypoints[1], 2); + allEdges.add(edge1); + final int[][] edge2 = new int[][]{{tilePoly.xpoints[1], tilePoly.ypoints[1]}, {tilePoly.xpoints[2], tilePoly.ypoints[2]}}; + edgeSizeSquared += Math.pow(tilePoly.xpoints[1] - tilePoly.xpoints[2], 2) + Math.pow(tilePoly.ypoints[1] - tilePoly.ypoints[2], 2); + allEdges.add(edge2); + final int[][] edge3 = new int[][]{{tilePoly.xpoints[2], tilePoly.ypoints[2]}, {tilePoly.xpoints[3], tilePoly.ypoints[3]}}; + edgeSizeSquared += Math.pow(tilePoly.xpoints[2] - tilePoly.xpoints[3], 2) + Math.pow(tilePoly.ypoints[2] - tilePoly.ypoints[3], 2); + allEdges.add(edge3); + final int[][] edge4 = new int[][]{{tilePoly.xpoints[3], tilePoly.ypoints[3]}, {tilePoly.xpoints[0], tilePoly.ypoints[0]}}; + edgeSizeSquared += Math.pow(tilePoly.xpoints[3] - tilePoly.xpoints[0], 2) + Math.pow(tilePoly.ypoints[3] - tilePoly.ypoints[0], 2); + allEdges.add(edge4); + } + + if (allEdges.size() <= 0) + { + continue; + } + + edgeSizeSquared /= allEdges.size(); + + //Find and indicate unique edges + final int toleranceSquared = (int) Math.ceil(edgeSizeSquared / 6); + + for (int i = 0; i < allEdges.size(); i++) + { + int[][] baseEdge = allEdges.get(i); + + boolean duplicate = false; + + for (int j = 0; j < allEdges.size(); j++) + { + if (i == j) + { + continue; + } + + int[][] checkEdge = allEdges.get(j); + + if (edgeEqualsEdge(baseEdge, checkEdge, toleranceSquared)) + { + duplicate = true; + break; + } + } + + if (!duplicate) + { + OverlayUtil.renderFullLine(graphics, baseEdge, colorEdge1); + + if (colorEdge2 != null) + { + OverlayUtil.renderDashedLine(graphics, baseEdge, colorEdge2); + } + } + } + + } + } + + private void renderIndividualTilesSafespots(Graphics2D graphics) + { + for (WorldPoint worldPoint : plugin.getSafeSpotMap().keySet()) + { + final int safeSpotId = plugin.getSafeSpotMap().get(worldPoint); + + if (safeSpotId > 6) + { + continue; + } + + final LocalPoint localPoint = LocalPoint.fromWorld(client, worldPoint); + + if (localPoint == null) + { + continue; + } + + final Polygon tilePoly = Perspective.getCanvasTilePoly(client, localPoint); + + if (tilePoly == null) + { + continue; + } + + Color color; + switch (safeSpotId) + { + case 0: + color = Color.WHITE; + break; + case 1: + color = Color.RED; + break; + case 2: + color = Color.GREEN; + break; + case 3: + color = Color.BLUE; + break; + case 4: + color = new Color(255, 255, 0); + break; + case 5: + color = new Color(255, 0, 255); + break; + case 6: + color = new Color(0, 255, 255); + break; + default: + continue; + } + + OverlayUtil.renderPolygon(graphics, tilePoly, color); + } + } + + private void renderTicksOnNpc(Graphics2D graphics, InfernoNPC infernoNPC) + { + final Color color = (infernoNPC.getTicksTillNextAttack() == 1 + || (infernoNPC.getType() == InfernoNPC.Type.BLOB && infernoNPC.getTicksTillNextAttack() == 4)) + ? infernoNPC.getNextAttack().getCriticalColor() : infernoNPC.getNextAttack().getNormalColor(); + final Point canvasPoint = infernoNPC.getNpc().getCanvasTextLocation( + graphics, String.valueOf(infernoNPC.getTicksTillNextAttack()), 0); + OverlayUtil.renderTextLocation(graphics, String.valueOf(infernoNPC.getTicksTillNextAttack()), + plugin.getTextSize(), plugin.getFontStyle().getFont(), color, canvasPoint, false, 0); + } + + private void renderNpcLocation(Graphics2D graphics, InfernoNPC infernoNPC) + { + final LocalPoint localPoint = LocalPoint.fromWorld(client, infernoNPC.getNpc().getWorldLocation()); + + if (localPoint != null) + { + final Polygon tilePolygon = Perspective.getCanvasTilePoly(client, localPoint); + + if (tilePolygon != null) + { + OverlayUtil.renderPolygon(graphics, tilePolygon, Color.BLUE); + } + } + } + + private void renderDescendingBoxes(Graphics2D graphics) + { + for (Integer tick : plugin.getUpcomingAttacks().keySet()) + { + final Map attackPriority = plugin.getUpcomingAttacks().get(tick); + int bestPriority = 999; + InfernoNPC.Attack bestAttack = null; + + for (Map.Entry attackEntry : attackPriority.entrySet()) + { + if (attackEntry.getValue() < bestPriority) + { + bestAttack = attackEntry.getKey(); + bestPriority = attackEntry.getValue(); + } + } + + for (InfernoNPC.Attack currentAttack : attackPriority.keySet()) + { + //TODO: Config values for these colors + final Color color = (tick == 1 && currentAttack == bestAttack) ? Color.RED : Color.ORANGE; + final Widget prayerWidget = client.getWidget(currentAttack.getPrayer().getWidgetInfo()); + + int baseX = (int) prayerWidget.getBounds().getX(); + baseX += prayerWidget.getBounds().getWidth() / 2; + baseX -= BOX_WIDTH / 2; + + int baseY = (int) prayerWidget.getBounds().getY() - tick * TICK_PIXEL_SIZE - BOX_HEIGHT; + baseY += TICK_PIXEL_SIZE - ((plugin.getLastTick() + 600 - System.currentTimeMillis()) / 600.0 * TICK_PIXEL_SIZE); + + final Rectangle boxRectangle = new Rectangle(BOX_WIDTH, BOX_HEIGHT); + boxRectangle.translate(baseX, baseY); + + if (currentAttack == bestAttack) + { + OverlayUtil.renderFilledPolygon(graphics, boxRectangle, color); + } + else if (plugin.isIndicateNonPriorityDescendingBoxes()) + { + OverlayUtil.renderOutlinePolygon(graphics, boxRectangle, color); + } + } + } + } + + private void renderPrayerIconOverlay(Graphics2D graphics) + { + if (plugin.getClosestAttack() != null) + { + // Prayer indicator in prayer tab + InfernoNPC.Attack prayerForAttack = null; + if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC)) + { + prayerForAttack = InfernoNPC.Attack.MAGIC; + } + else if (client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES)) + { + prayerForAttack = InfernoNPC.Attack.RANGED; + } + else if (client.isPrayerActive(Prayer.PROTECT_FROM_MELEE)) + { + prayerForAttack = InfernoNPC.Attack.MELEE; + } + + if (plugin.getClosestAttack() != prayerForAttack || plugin.isIndicateWhenPrayingCorrectly()) + { + final Widget prayerWidget = client.getWidget(plugin.getClosestAttack().getPrayer().getWidgetInfo()); + final Rectangle prayerRectangle = new Rectangle((int) prayerWidget.getBounds().getWidth(), + (int) prayerWidget.getBounds().getHeight()); + prayerRectangle.translate((int) prayerWidget.getBounds().getX(), (int) prayerWidget.getBounds().getY()); + + //TODO: Config values for these colors + Color prayerColor; + if (plugin.getClosestAttack() == prayerForAttack) + { + prayerColor = Color.GREEN; + } + else + { + prayerColor = Color.RED; + } + + OverlayUtil.renderOutlinePolygon(graphics, prayerRectangle, prayerColor); + } + } + } + + private boolean edgeEqualsEdge(int[][] edge1, int[][] edge2, int toleranceSquared) + { + return (pointEqualsPoint(edge1[0], edge2[0], toleranceSquared) && pointEqualsPoint(edge1[1], edge2[1], toleranceSquared)) + || (pointEqualsPoint(edge1[0], edge2[1], toleranceSquared) && pointEqualsPoint(edge1[1], edge2[0], toleranceSquared)); + } + + private boolean pointEqualsPoint(int[] point1, int[] point2, int toleranceSquared) + { + double distanceSquared = Math.pow(point1[0] - point2[0], 2) + Math.pow(point1[1] - point2[1], 2); + + return distanceSquared <= toleranceSquared; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java index 447eaf3b78..64b88c9cc7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPlugin.java @@ -29,20 +29,18 @@ import java.awt.Color; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.ListIterator; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; 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.HeadIcon; import net.runelite.api.NPC; import net.runelite.api.NpcID; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.AnimationChanged; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; @@ -55,6 +53,11 @@ import net.runelite.client.eventbus.EventBus; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; +import net.runelite.client.plugins.inferno.displaymodes.InfernoNamingDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoPrayerDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoSafespotDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoWaveDisplayMode; +import net.runelite.client.plugins.inferno.displaymodes.InfernoZukShieldDisplayMode; import net.runelite.client.ui.overlay.OverlayManager; import org.apache.commons.lang3.ArrayUtils; @@ -83,13 +86,10 @@ public class InfernoPlugin extends Plugin private InfernoWaveOverlay waveOverlay; @Inject - private InfernoJadOverlay jadOverlay; + private InfernoInfoBoxOverlay jadOverlay; @Inject - private InfernoPrayerOverlay prayerOverlay; - - @Inject - private InfernoNibblerOverlay nibblerOverlay; + private InfernoOverlay prayerOverlay; @Inject private InfernoConfig config; @@ -98,49 +98,140 @@ public class InfernoPlugin extends Plugin private EventBus eventBus; @Getter(AccessLevel.PACKAGE) - private int currentWave = -1; - + private InfernoConfig.FontStyle fontStyle = InfernoConfig.FontStyle.BOLD; @Getter(AccessLevel.PACKAGE) - private final Map monsters = new HashMap<>(); + private int textSize = 32; - @Getter(AccessLevel.PACKAGE) - private final Map> monsterCurrentAttackMap = new HashMap<>(6); - - @Getter(AccessLevel.PACKAGE) - private final List nibblers = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private final InfernoNPC[] priorityNPC = new InfernoNPC[4]; - - @Getter(AccessLevel.PACKAGE) - private final List jads = new ArrayList<>(); - - @Getter(AccessLevel.PACKAGE) - private final List activeHealers = new ArrayList<>(); - - @Getter - private long lastTick; + private WorldPoint lastLocation = new WorldPoint(0, 0, 0); @Getter(AccessLevel.PACKAGE) private int currentWaveNumber; - private final List waveMonsters = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private final List infernoNpcs = new ArrayList<>(); @Getter(AccessLevel.PACKAGE) - private boolean displayNibblerOverlay; + private final Map> upcomingAttacks = new HashMap<>(); @Getter(AccessLevel.PACKAGE) - private boolean showPrayerHelp; + private InfernoNPC.Attack closestAttack = null; + @Getter(AccessLevel.PACKAGE) - private InfernoPrayerOverlayMode prayerOverlayMode; - private InfernoWaveDisplayMode waveDisplay; - private Color getWaveOverlayHeaderColor; - private Color getWaveTextColor; + private final List obstacles = new ArrayList<>(); + + @Getter(AccessLevel.PACKAGE) + private boolean finalPhase = false; + private NPC zukShield = null; + private WorldPoint zukShieldLastPosition = null; + private WorldPoint zukShieldBase = null; + private int zukShieldCornerTicks = -2; + + @Getter(AccessLevel.PACKAGE) + private InfernoNPC centralNibbler = null; + + // 0 = total safespot + // 1 = pray melee + // 2 = pray range + // 3 = pray magic + // 4 = pray melee, range + // 5 = pray melee, magic + // 6 = pray range, magic + // 7 = pray all + @Getter(AccessLevel.PACKAGE) + private final Map safeSpotMap = new HashMap<>(); + @Getter(AccessLevel.PACKAGE) + private final Map> safeSpotAreas = new HashMap<>(); + + @Getter(AccessLevel.PACKAGE) + private long lastTick; + + @Getter(AccessLevel.PACKAGE) + private InfernoPrayerDisplayMode prayerDisplayMode; @Getter(AccessLevel.PACKAGE) private boolean descendingBoxes; @Getter(AccessLevel.PACKAGE) - private boolean indicateWhenPrayingCorrectly; + private boolean indicateNonPriorityDescendingBoxes; @Getter(AccessLevel.PACKAGE) - private boolean indicateActiveHealers; + private boolean indicateBlobDetectionTick; + @Getter(AccessLevel.PACKAGE) + private boolean indicateWhenPrayingCorrectly; + + private InfernoWaveDisplayMode waveDisplay; + @Getter(AccessLevel.PACKAGE) + private InfernoNamingDisplayMode npcNaming; + @Getter(AccessLevel.PACKAGE) + private boolean npcLevels; + private Color getWaveOverlayHeaderColor; + private Color getWaveTextColor; + + @Getter(AccessLevel.PACKAGE) + private InfernoSafespotDisplayMode safespotDisplayMode; + @Getter(AccessLevel.PACKAGE) + private int safespotsCheckSize; + @Getter(AccessLevel.PACKAGE) + private boolean indicateNonSafespotted; + @Getter(AccessLevel.PACKAGE) + private boolean indicateTemporarySafespotted; + @Getter(AccessLevel.PACKAGE) + private boolean indicateSafespotted; + @Getter(AccessLevel.PACKAGE) + private boolean indicateObstacles; + + @Getter(AccessLevel.PACKAGE) + private boolean indicateNibblers; + @Getter(AccessLevel.PACKAGE) + private boolean indicateCentralNibbler; + + @Getter(AccessLevel.PACKAGE) + private boolean indicateActiveHealersJad; + @Getter(AccessLevel.PACKAGE) + private boolean indicateActiveHealersZuk; + + private boolean indicateNpcPositionBat; + private boolean indicateNpcPositionBlob; + private boolean indicateNpcPositionMeleer; + private boolean indicateNpcPositionRanger; + private boolean indicateNpcPositionMage; + + private boolean ticksOnNpcBat; + private boolean ticksOnNpcBlob; + private boolean ticksOnNpcMeleer; + private boolean ticksOnNpcRanger; + private boolean ticksOnNpcMage; + private boolean ticksOnNpcHealerJad; + private boolean ticksOnNpcJad; + private boolean ticksOnNpcZuk; + + private boolean safespotsBat; + private boolean safespotsBlob; + private boolean safespotsMeleer; + private boolean safespotsRanger; + private boolean safespotsMage; + private boolean safespotsHealerJad; + private boolean safespotsJad; + private InfernoZukShieldDisplayMode safespotsZukShieldBeforeHealers; + private InfernoZukShieldDisplayMode safespotsZukShieldAfterHealers; + + private boolean prayerBat; + private boolean prayerBlob; + private boolean prayerMeleer; + private boolean prayerRanger; + private boolean prayerMage; + private boolean prayerHealerJad; + private boolean prayerJad; + + private boolean hideNibblerDeath; + private boolean hideBatDeath; + private boolean hideBlobDeath; + private boolean hideBlobSmallRangedDeath; + private boolean hideBlobSmallMagicDeath; + private boolean hideBlobSmallMeleeDeath; + private boolean hideMeleerDeath; + private boolean hideRangerDeath; + private boolean hideMagerDeath; + private boolean hideJadDeath; + private boolean hideHealerJadDeath; + private boolean hideHealerZukDeath; + private boolean hideZukDeath; @Provides InfernoConfig provideConfig(ConfigManager configManager) @@ -155,11 +246,12 @@ public class InfernoPlugin extends Plugin addSubscriptions(); waveOverlay.setDisplayMode(this.waveDisplay); + waveOverlay.setWaveHeaderColor(this.getWaveOverlayHeaderColor); + waveOverlay.setWaveTextColor(this.getWaveTextColor); if (isInInferno()) { overlayManager.add(infernoOverlay); - overlayManager.add(nibblerOverlay); if (this.waveDisplay != InfernoWaveDisplayMode.NONE) { @@ -168,14 +260,7 @@ public class InfernoPlugin extends Plugin overlayManager.add(jadOverlay); overlayManager.add(prayerOverlay); - } - - waveOverlay.setWaveHeaderColor(this.getWaveOverlayHeaderColor); - waveOverlay.setWaveTextColor(this.getWaveTextColor); - - for (int i = 1; i <= 6; i++) - { - monsterCurrentAttackMap.put(i, new ArrayList<>()); + hideNpcDeaths(); } } @@ -185,11 +270,13 @@ public class InfernoPlugin extends Plugin eventBus.unregister(this); overlayManager.remove(infernoOverlay); - overlayManager.remove(nibblerOverlay); overlayManager.remove(waveOverlay); overlayManager.remove(jadOverlay); overlayManager.remove(prayerOverlay); + currentWaveNumber = -1; + + showNpcDeaths(); } private void addSubscriptions() @@ -211,6 +298,8 @@ public class InfernoPlugin extends Plugin } updateConfig(); + hideNpcDeaths(); + showNpcDeaths(); if (event.getKey().endsWith("color")) { @@ -230,75 +319,111 @@ public class InfernoPlugin extends Plugin } } - private void onNpcSpawned(NpcSpawned event) + private void onGameTick(GameTick GameTickEvent) { - if (client.getMapRegions()[0] != 9043) + if (!isInInferno()) { return; } - NPC npc = event.getNpc(); - if (isValidInfernoMob(npc)) + lastTick = System.currentTimeMillis(); + + upcomingAttacks.clear(); + calculateUpcomingAttacks(); + + closestAttack = null; + calculateClosestAttack(); + + safeSpotMap.clear(); + calculateSafespots(); + + safeSpotAreas.clear(); + calculateSafespotAreas(); + + obstacles.clear(); + calculateObstacles(); + + centralNibbler = null; + calculateCentralNibbler(); + } + + private void onNpcSpawned(NpcSpawned event) + { + if (!isInInferno()) { - monsters.put(npc, new InfernoNPC(npc)); - log.debug(String.valueOf(monsters.size())); + return; } - if (npc.getId() == NpcID.JALNIB) + if (event.getNpc().getId() == NpcID.ANCESTRAL_GLYPH) { - nibblers.add(npc); + zukShield = event.getNpc(); } - final int id = event.getNpc().getId(); + final InfernoNPC.Type infernoNPCType = InfernoNPC.Type.typeFromId(event.getNpc().getId()); - if (id == NpcID.JALTOKJAD || id == NpcID.JALTOKJAD_7704) + if (infernoNPCType == null) { - jads.add(new InfernoJad(npc)); + return; } - final Actor actor = event.getActor(); - - if (actor != null) + if (infernoNPCType == InfernoNPC.Type.ZUK) { - waveMonsters.add(actor); + log.debug("[INFERNO] Zuk spawn detected, not in final phase"); + finalPhase = false; + zukShieldCornerTicks = -2; + zukShieldLastPosition = null; + zukShieldBase = null; + } + if (infernoNPCType == InfernoNPC.Type.HEALER_ZUK) + { + log.debug("[INFERNO] Final phase detected!"); + finalPhase = true; + } + + // Blobs need to be added to the end of the list because the prayer for their detection tick will be based + // on the upcoming attacks of other NPC's + if (infernoNPCType == InfernoNPC.Type.BLOB) + { + infernoNpcs.add(new InfernoNPC(event.getNpc())); + } + else + { + infernoNpcs.add(0, new InfernoNPC(event.getNpc())); } } private void onNpcDespawned(NpcDespawned event) { - if (client.getMapRegions()[0] != 9043) + if (!isInInferno()) { return; } - NPC npc = event.getNpc(); - if (monsters.containsKey(npc)) + if (event.getNpc().getId() == NpcID.ANCESTRAL_GLYPH) { - monsters.remove(npc); - log.debug(String.valueOf(monsters.size())); + zukShield = null; } - if (npc.getId() == NpcID.JALNIB) + infernoNpcs.removeIf(infernoNPC -> infernoNPC.getNpc() == event.getNpc()); + } + + private void onAnimationChanged(AnimationChanged event) + { + if (!isInInferno()) { - nibblers.remove(npc); + return; } - final ListIterator iter = jads.listIterator(); - while (iter.hasNext()) + if (event.getActor() instanceof NPC) { - final InfernoJad possibleJad = iter.next(); + final NPC npc = (NPC) event.getActor(); - if (possibleJad.getNpc() == npc) + if (ArrayUtils.contains(InfernoNPC.Type.NIBBLER.getNpcIds(), npc.getId()) + && npc.getAnimation() == 7576) { - iter.remove(); + infernoNpcs.removeIf(infernoNPC -> infernoNPC.getNpc() == npc); } } - - final Actor actor = event.getActor(); - if (actor != null) - { - waveMonsters.remove(actor); - } } private void onGameStateChanged(GameStateChanged event) @@ -310,26 +435,29 @@ public class InfernoPlugin extends Plugin if (!isInInferno()) { + infernoNpcs.clear(); + currentWaveNumber = -1; + overlayManager.remove(infernoOverlay); - overlayManager.remove(nibblerOverlay); overlayManager.remove(waveOverlay); overlayManager.remove(jadOverlay); overlayManager.remove(prayerOverlay); } else if (currentWaveNumber == -1) { + infernoNpcs.clear(); + currentWaveNumber = 1; + overlayManager.add(infernoOverlay); - overlayManager.add(nibblerOverlay); + overlayManager.add(jadOverlay); + overlayManager.add(prayerOverlay); if (this.waveDisplay != InfernoWaveDisplayMode.NONE) { overlayManager.add(waveOverlay); } - - overlayManager.add(jadOverlay); - overlayManager.add(prayerOverlay); } } @@ -345,211 +473,639 @@ public class InfernoPlugin extends Plugin if (event.getMessage().contains("Wave:")) { message = message.substring(message.indexOf(": ") + 2); - currentWaveNumber = Integer.parseInt(message.substring(0, message.indexOf("<"))); + currentWaveNumber = Integer.parseInt(message.substring(0, message.indexOf('<'))); } } - private void onGameTick(GameTick event) - { - if (client.getMapRegions()[0] != 9043) - { - return; - } - - clearMapAndPriority(); - - lastTick = System.currentTimeMillis(); - - for (InfernoJad jad : jads) - { - jad.gameTick(); - } - - activeHealers.clear(); - for (NPC npc : client.getNpcs()) - { - if (npc.getId() != NpcID.YTHURKOT_7701 || npc.getInteracting() == client.getLocalPlayer()) - { - continue; - } - - activeHealers.add(npc); - } - - for (InfernoNPC monster : monsters.values()) - { - calculateDistanceToPlayer(monster); - - NPC npc = monster.getNpc(); - - // if they are not attacking but are still attacking - if (monster.isAttacking()) - { - monster.setTicksTillAttack(monster.getTicksTillAttack() - 1); - - // sets the blobs attack style - if (monster.getName().equals("blob") && monster.getTicksTillAttack() == 3 && monster.getDistanceToPlayer() <= 15) - { - if (client.getLocalPlayer().getOverheadIcon() == null) - { - monster.setAttackstyle(InfernoNPC.Attackstyle.RANDOM); - } - else if (client.getLocalPlayer().getOverheadIcon().equals(HeadIcon.MAGIC)) - { - monster.setAttackstyle(InfernoNPC.Attackstyle.RANGE); - } - else if (client.getLocalPlayer().getOverheadIcon().equals(HeadIcon.RANGED)) - { - monster.setAttackstyle(InfernoNPC.Attackstyle.MAGE); - } - } - - // we know the monster is not attacking because it should have attacked and is idling - if (monster.getTicksTillAttack() == 0) - { - if (npc.getAnimation() == -1) - { - monster.setAttacking(false); - } - else - { - // want to reset the monsters attack back to attacking - monster.attacked(); - } - } - } - else - { - // they've just attacked - if (npc.getAnimation() == monster.getAttackAnimation() || npc.getAnimation() == 7581) // special case for blob - { - monster.attacked(); - } - } - - if (monster.getTicksTillAttack() >= 1) - { - monsterCurrentAttackMap.get(monster.getTicksTillAttack()).add(monster); - } - } - - calculatePriorityNPC(); - } - - private void onAnimationChanged(final AnimationChanged event) - { - InfernoJad jad = null; - - for (InfernoJad possibleJad : jads) - { - if (possibleJad.getNpc() == event.getActor()) - { - jad = possibleJad; - } - } - - if (jad != null) - { - if (event.getActor().getAnimation() == InfernoJad.Attack.MAGIC.getAnimation()) - { - jad.updateNextAttack(InfernoJad.Attack.MAGIC); - } - else if (event.getActor().getAnimation() == InfernoJad.Attack.RANGE.getAnimation()) - { - jad.updateNextAttack(InfernoJad.Attack.RANGE); - } - } - } - - private void calculatePriorityNPC() - { - for (int i = 0; i < priorityNPC.length; i++) - { - ArrayList monsters = monsterCurrentAttackMap.get(i + 1); - - if (monsters.size() == 0) - { - continue; - } - - int priority = monsters.get(0).getPriority(); - - InfernoNPC infernoNPC = monsters.get(0); - - for (InfernoNPC npc : monsters) - { - if (npc.getPriority() < priority) - { - priority = npc.getPriority(); - infernoNPC = npc; - } - } - - priorityNPC[i] = infernoNPC; - - log.debug("i: " + i + " " + infernoNPC.getName()); - } - } - - // TODO: blob calculator - private void calculateDistanceToPlayer(InfernoNPC monster) - { - monster.setDistanceToPlayer(client.getLocalPlayer().getWorldLocation().distanceTo(monster.getNpc().getWorldArea())); - } - - private void clearMapAndPriority() - { - for (List l : monsterCurrentAttackMap.values()) - { - l.clear(); - } - - for (int i = 0; i < priorityNPC.length; i++) - { - priorityNPC[i] = null; - } - } - - private boolean isValidInfernoMob(NPC npc) - { - // we only want the bat, blob, melee, ranger and mager - return npc.getId() == NpcID.JALMEJRAH || - npc.getId() == NpcID.JALAK || - npc.getId() == NpcID.JALIMKOT || - npc.getId() == NpcID.JALXIL || - npc.getId() == NpcID.JALZEK; - } - private boolean isInInferno() { return ArrayUtils.contains(client.getMapRegions(), INFERNO_REGION); } - boolean isNotFinalWave() - { - return currentWaveNumber <= 68; - } - - List getWaveMonsters() - { - return waveMonsters; - } - int getNextWaveNumber() { return currentWaveNumber == -1 || currentWaveNumber == 69 ? -1 : currentWaveNumber + 1; } + private void calculateUpcomingAttacks() + { + for (InfernoNPC infernoNPC : infernoNpcs) + { + infernoNPC.gameTick(client, lastLocation, finalPhase); + + if (infernoNPC.getType() == InfernoNPC.Type.ZUK && zukShieldCornerTicks == -1) + { + infernoNPC.updateNextAttack(InfernoNPC.Attack.UNKNOWN, 12); // TODO: Could be 10 or 11. Test! + zukShieldCornerTicks = 0; + } + + // Map all upcoming attacks and their priority + determine which NPC is about to attack next + if (infernoNPC.getTicksTillNextAttack() > 0 && isPrayerHelper(infernoNPC) + && (infernoNPC.getNextAttack() != InfernoNPC.Attack.UNKNOWN + || (indicateBlobDetectionTick && infernoNPC.getType() == InfernoNPC.Type.BLOB + && infernoNPC.getTicksTillNextAttack() >= 4))) + { + upcomingAttacks.computeIfAbsent(infernoNPC.getTicksTillNextAttack(), k -> new HashMap<>()); + + if (indicateBlobDetectionTick && infernoNPC.getType() == InfernoNPC.Type.BLOB + && infernoNPC.getTicksTillNextAttack() >= 4) + { + upcomingAttacks.computeIfAbsent(infernoNPC.getTicksTillNextAttack() - 3, k -> new HashMap<>()); + upcomingAttacks.computeIfAbsent(infernoNPC.getTicksTillNextAttack() - 4, k -> new HashMap<>()); + + // If there's already a magic attack on the detection tick, group them + if (upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).containsKey(InfernoNPC.Attack.MAGIC)) + { + if (upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).get(InfernoNPC.Attack.MAGIC) > InfernoNPC.Type.BLOB.getPriority()) + { + upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).put(InfernoNPC.Attack.MAGIC, InfernoNPC.Type.BLOB.getPriority()); + } + } + // If there's already a ranged attack on the detection tick, group them + else if (upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).containsKey(InfernoNPC.Attack.RANGED)) + { + if (upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).get(InfernoNPC.Attack.RANGED) > InfernoNPC.Type.BLOB.getPriority()) + { + upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).put(InfernoNPC.Attack.RANGED, InfernoNPC.Type.BLOB.getPriority()); + } + } + // If there's going to be a magic attack on the blob attack tick, pray range on the detect tick so magic is prayed on the attack tick + else if (upcomingAttacks.get(infernoNPC.getTicksTillNextAttack()).containsKey(InfernoNPC.Attack.MAGIC) + || upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 4).containsKey(InfernoNPC.Attack.MAGIC)) + { + if (!upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).containsKey(InfernoNPC.Attack.RANGED) + || upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).get(InfernoNPC.Attack.RANGED) > InfernoNPC.Type.BLOB.getPriority()) + { + upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).put(InfernoNPC.Attack.RANGED, InfernoNPC.Type.BLOB.getPriority()); + } + } + // If there's going to be a ranged attack on the blob attack tick, pray magic on the detect tick so range is prayed on the attack tick + else if (upcomingAttacks.get(infernoNPC.getTicksTillNextAttack()).containsKey(InfernoNPC.Attack.RANGED) + || upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 4).containsKey(InfernoNPC.Attack.RANGED)) + { + if (!upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).containsKey(InfernoNPC.Attack.MAGIC) + || upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).get(InfernoNPC.Attack.MAGIC) > InfernoNPC.Type.BLOB.getPriority()) + { + upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).put(InfernoNPC.Attack.MAGIC, InfernoNPC.Type.BLOB.getPriority()); + } + } + // If there's no magic or ranged attack on the detection tick, create a magic pray blob + else + { + upcomingAttacks.get(infernoNPC.getTicksTillNextAttack() - 3).put(InfernoNPC.Attack.MAGIC, InfernoNPC.Type.BLOB.getPriority()); + } + } + else + { + final InfernoNPC.Attack attack = infernoNPC.getNextAttack(); + final int priority = infernoNPC.getType().getPriority(); + + if (!upcomingAttacks.get(infernoNPC.getTicksTillNextAttack()).containsKey(attack) + || upcomingAttacks.get(infernoNPC.getTicksTillNextAttack()).get(attack) > priority) + { + upcomingAttacks.get(infernoNPC.getTicksTillNextAttack()).put(attack, priority); + } + } + } + } + } + + private void calculateClosestAttack() + { + if (prayerDisplayMode == InfernoPrayerDisplayMode.PRAYER_TAB + || prayerDisplayMode == InfernoPrayerDisplayMode.BOTH) + { + int closestTick = 999; + int closestPriority = 999; + + for (Integer tick : upcomingAttacks.keySet()) + { + final Map attackPriority = upcomingAttacks.get(tick); + + for (InfernoNPC.Attack currentAttack : attackPriority.keySet()) + { + final int currentPriority = attackPriority.get(currentAttack); + if (tick < closestTick || (tick == closestTick && currentPriority < closestPriority)) + { + closestAttack = currentAttack; + closestPriority = currentPriority; + closestTick = tick; + } + } + } + } + } + + private void calculateSafespots() + { + if (currentWaveNumber < 69) + { + if (safespotDisplayMode != InfernoSafespotDisplayMode.OFF) + { + int checkSize = (int) Math.floor(safespotsCheckSize / 2.0); + + for (int x = -checkSize; x <= checkSize; x++) + { + for (int y = -checkSize; y <= checkSize; y++) + { + final WorldPoint checkLoc = client.getLocalPlayer().getWorldLocation().dx(x).dy(y); + + if (obstacles.contains(checkLoc)) + { + continue; + } + + for (InfernoNPC infernoNPC : infernoNpcs) + { + if (!isNormalSafespots(infernoNPC)) + { + continue; + } + + if (!safeSpotMap.containsKey(checkLoc)) + { + safeSpotMap.put(checkLoc, 0); + } + + if (infernoNPC.canAttack(client, checkLoc) + || infernoNPC.canMoveToAttack(client, checkLoc, obstacles)) + { + if (infernoNPC.getType().getDefaultAttack() == InfernoNPC.Attack.MELEE) + { + if (safeSpotMap.get(checkLoc) == 0) + { + safeSpotMap.put(checkLoc, 1); + } + else if (safeSpotMap.get(checkLoc) == 2) + { + safeSpotMap.put(checkLoc, 4); + } + else if (safeSpotMap.get(checkLoc) == 3) + { + safeSpotMap.put(checkLoc, 5); + } + else if (safeSpotMap.get(checkLoc) == 6) + { + safeSpotMap.put(checkLoc, 7); + } + } + + if (infernoNPC.getType().getDefaultAttack() == InfernoNPC.Attack.MAGIC + || (infernoNPC.getType() == InfernoNPC.Type.BLOB + && safeSpotMap.get(checkLoc) != 2 && safeSpotMap.get(checkLoc) != 4)) + { + if (safeSpotMap.get(checkLoc) == 0) + { + safeSpotMap.put(checkLoc, 3); + } + else if (safeSpotMap.get(checkLoc) == 1) + { + safeSpotMap.put(checkLoc, 5); + } + else if (safeSpotMap.get(checkLoc) == 2) + { + safeSpotMap.put(checkLoc, 6); + } + else if (safeSpotMap.get(checkLoc) == 5) + { + safeSpotMap.put(checkLoc, 7); + } + } + + if (infernoNPC.getType().getDefaultAttack() == InfernoNPC.Attack.RANGED + || (infernoNPC.getType() == InfernoNPC.Type.BLOB + && safeSpotMap.get(checkLoc) != 3 && safeSpotMap.get(checkLoc) != 5)) + { + if (safeSpotMap.get(checkLoc) == 0) + { + safeSpotMap.put(checkLoc, 2); + } + else if (safeSpotMap.get(checkLoc) == 1) + { + safeSpotMap.put(checkLoc, 4); + } + else if (safeSpotMap.get(checkLoc) == 3) + { + safeSpotMap.put(checkLoc, 6); + } + else if (safeSpotMap.get(checkLoc) == 4) + { + safeSpotMap.put(checkLoc, 7); + } + } + + if (infernoNPC.getType() == InfernoNPC.Type.JAD + && infernoNPC.getNpc().getWorldArea().isInMeleeDistance(checkLoc)) + { + if (safeSpotMap.get(checkLoc) == 0) + { + safeSpotMap.put(checkLoc, 1); + } + else if (safeSpotMap.get(checkLoc) == 2) + { + safeSpotMap.put(checkLoc, 4); + } + else if (safeSpotMap.get(checkLoc) == 3) + { + safeSpotMap.put(checkLoc, 5); + } + else if (safeSpotMap.get(checkLoc) == 6) + { + safeSpotMap.put(checkLoc, 7); + } + } + } + } + } + } + } + } + else if (currentWaveNumber == 69 && zukShield != null) + { + final WorldPoint zukShieldCurrentPosition = zukShield.getWorldLocation(); + + if (zukShieldLastPosition != null && zukShieldLastPosition.getX() != zukShieldCurrentPosition.getX() + && zukShieldCornerTicks == -2) + { + zukShieldBase = zukShieldLastPosition; + zukShieldCornerTicks = -1; + } + + zukShieldLastPosition = zukShield.getWorldLocation(); + + if (safespotDisplayMode != InfernoSafespotDisplayMode.OFF) + { + if ((finalPhase && safespotsZukShieldAfterHealers == InfernoZukShieldDisplayMode.LIVE) + || (!finalPhase && safespotsZukShieldBeforeHealers == InfernoZukShieldDisplayMode.LIVE)) + { + for (int x = zukShield.getWorldLocation().getX() - 1; x <= zukShield.getWorldLocation().getX() + 3; x++) + { + for (int y = zukShield.getWorldLocation().getY() - 4; y <= zukShield.getWorldLocation().getY() - 2; y++) + { + safeSpotMap.put(new WorldPoint(x, y, client.getPlane()), 0); + } + } + } + else if ((finalPhase && safespotsZukShieldAfterHealers == InfernoZukShieldDisplayMode.PREDICT) + || (!finalPhase && safespotsZukShieldBeforeHealers == InfernoZukShieldDisplayMode.PREDICT)) + { + if (zukShieldCornerTicks >= 0) + { + // TODO: Predict zuk shield safespots + // Calculate distance from zukShieldCurrentPosition to zukShieldBase. + // - If shield is not in corner: calculate next position in current direction (use + // difference between current and last position to get direction) + // - If shield is in corner: increment zukShieldCornerTicks and predict next shield + // position based on how many ticks the shield has been in the corner. + } + } + } + } + } + + private void calculateSafespotAreas() + { + if (safespotDisplayMode == InfernoSafespotDisplayMode.AREA) + { + for (WorldPoint worldPoint : safeSpotMap.keySet()) + { + if (!safeSpotAreas.containsKey(safeSpotMap.get(worldPoint))) + { + safeSpotAreas.put(safeSpotMap.get(worldPoint), new ArrayList<>()); + } + + safeSpotAreas.get(safeSpotMap.get(worldPoint)).add(worldPoint); + } + } + + lastLocation = client.getLocalPlayer().getWorldLocation(); + } + + private void calculateObstacles() + { + for (NPC npc : client.getNpcs()) + { + obstacles.addAll(npc.getWorldArea().toWorldPointList()); + } + } + + private void calculateCentralNibbler() + { + InfernoNPC bestNibbler = null; + int bestAmountInArea = 0; + int bestDistanceToPlayer = 999; + + for (InfernoNPC infernoNPC : infernoNpcs) + { + if (infernoNPC.getType() != InfernoNPC.Type.NIBBLER) + { + continue; + } + + int amountInArea = 0; + final int distanceToPlayer = infernoNPC.getNpc().getWorldLocation().distanceTo(client.getLocalPlayer().getWorldLocation()); + + for (InfernoNPC checkNpc : infernoNpcs) + { + if (checkNpc.getType() != InfernoNPC.Type.NIBBLER + || checkNpc.getNpc().getWorldArea().distanceTo(infernoNPC.getNpc().getWorldArea()) > 1) + { + continue; + } + + amountInArea++; + } + + if (amountInArea > bestAmountInArea + || (amountInArea == bestAmountInArea && distanceToPlayer < bestDistanceToPlayer)) + { + bestNibbler = infernoNPC; + } + } + + if (bestNibbler != null) + { + centralNibbler = bestNibbler; + } + } + + private boolean isPrayerHelper(InfernoNPC infernoNPC) + { + switch (infernoNPC.getType()) + { + case BAT: + return prayerBat; + case BLOB: + return prayerBlob; + case MELEE: + return prayerMeleer; + case RANGER: + return prayerRanger; + case MAGE: + return prayerMage; + case HEALER_JAD: + return prayerHealerJad; + case JAD: + return prayerJad; + default: + return false; + } + } + + boolean isTicksOnNpc(InfernoNPC infernoNPC) + { + switch (infernoNPC.getType()) + { + case BAT: + return ticksOnNpcBat; + case BLOB: + return ticksOnNpcBlob; + case MELEE: + return ticksOnNpcMeleer; + case RANGER: + return ticksOnNpcRanger; + case MAGE: + return ticksOnNpcMage; + case HEALER_JAD: + return ticksOnNpcHealerJad; + case JAD: + return ticksOnNpcJad; + case ZUK: + return ticksOnNpcZuk; + default: + return false; + } + } + + boolean isNormalSafespots(InfernoNPC infernoNPC) + { + switch (infernoNPC.getType()) + { + case BAT: + return safespotsBat; + case BLOB: + return safespotsBlob; + case MELEE: + return safespotsMeleer; + case RANGER: + return safespotsRanger; + case MAGE: + return safespotsMage; + case HEALER_JAD: + return safespotsHealerJad; + case JAD: + return safespotsJad; + default: + return false; + } + } + + boolean isIndicateNpcPosition(InfernoNPC infernoNPC) + { + switch (infernoNPC.getType()) + { + case BAT: + return indicateNpcPositionBat; + case BLOB: + return indicateNpcPositionBlob; + case MELEE: + return indicateNpcPositionMeleer; + case RANGER: + return indicateNpcPositionRanger; + case MAGE: + return indicateNpcPositionMage; + default: + return false; + } + } + + private void hideNpcDeaths() + { + + if (this.hideNibblerDeath) + { + client.addHiddenNpcDeath("Jal-Nib"); + } + if (this.hideBatDeath) + { + client.addHiddenNpcDeath("Jal-MejRah"); + } + if (this.hideBlobDeath) + { + client.addHiddenNpcDeath("Jal-Ak"); + } + if (this.hideBlobSmallMeleeDeath) + { + client.addHiddenNpcDeath("Jal-AkRek-Ket"); + } + if (this.hideBlobSmallMagicDeath) + { + client.addHiddenNpcDeath("Jal-AkRek-Mej"); + } + if (this.hideBlobSmallRangedDeath) + { + client.addHiddenNpcDeath("Jal-AkRek-Xil"); + } + if (this.hideMeleerDeath) + { + client.addHiddenNpcDeath("Jal-ImKot"); + } + if (this.hideRangerDeath) + { + client.addHiddenNpcDeath("Jal-Xil"); + } + if (this.hideMagerDeath) + { + client.addHiddenNpcDeath("Jal-Zek"); + } + if (this.hideHealerJadDeath && isInInferno()) + { + client.addHiddenNpcDeath("Yt-HurKot"); + } + if (this.hideJadDeath) + { + client.addHiddenNpcDeath("JalTok-Jad"); + } + if (this.hideHealerZukDeath) + { + client.addHiddenNpcDeath("Jal-MejJak"); + } + if (this.hideZukDeath) + { + client.addHiddenNpcDeath("TzKal-Zuk"); + } + } + + private void showNpcDeaths() + { + + if (!this.hideNibblerDeath) + { + client.removeHiddenNpcDeath("Jal-Nib"); + } + if (!this.hideBatDeath) + { + client.removeHiddenNpcDeath("Jal-MejRah"); + } + if (!this.hideBlobDeath) + { + client.removeHiddenNpcDeath("Jal-Ak"); + } + if (!this.hideBlobSmallMeleeDeath) + { + client.removeHiddenNpcDeath("Jal-AkRek-Ket"); + } + if (!this.hideBlobSmallMagicDeath) + { + client.removeHiddenNpcDeath("Jal-AkRek-Mej"); + } + if (!this.hideBlobSmallRangedDeath) + { + client.removeHiddenNpcDeath("Jal-AkRek-Xil"); + } + if (!this.hideMeleerDeath) + { + client.removeHiddenNpcDeath("Jal-ImKot"); + } + if (!this.hideRangerDeath) + { + client.removeHiddenNpcDeath("Jal-Xil"); + } + if (!this.hideMagerDeath) + { + client.removeHiddenNpcDeath("Jal-Zek"); + } + if (!this.hideHealerJadDeath) + { + client.removeHiddenNpcDeath("Yt-HurKot"); + } + if (!this.hideJadDeath) + { + client.removeHiddenNpcDeath("JalTok-Jad"); + } + if (!this.hideHealerZukDeath) + { + client.removeHiddenNpcDeath("Jal-MejJak"); + } + if (!this.hideZukDeath) + { + client.removeHiddenNpcDeath("TzKal-Zuk"); + } + } + private void updateConfig() { - this.displayNibblerOverlay = config.displayNibblerOverlay(); - this.showPrayerHelp = config.showPrayerHelp(); - this.prayerOverlayMode = config.prayerOverlayMode(); - this.waveDisplay = config.waveDisplay(); - this.getWaveOverlayHeaderColor = config.getWaveOverlayHeaderColor(); - this.getWaveTextColor = config.getWaveTextColor(); + this.prayerDisplayMode = config.prayerDisplayMode(); this.descendingBoxes = config.descendingBoxes(); this.indicateWhenPrayingCorrectly = config.indicateWhenPrayingCorrectly(); - this.indicateActiveHealers = config.indicateActiveHealers(); + this.indicateNonPriorityDescendingBoxes = config.indicateNonPriorityDescendingBoxes(); + this.indicateBlobDetectionTick = config.indicateBlobDetectionTick(); + + this.waveDisplay = config.waveDisplay(); + this.npcNaming = config.npcNaming(); + this.npcLevels = config.npcLevels(); + this.getWaveOverlayHeaderColor = config.getWaveOverlayHeaderColor(); + this.getWaveTextColor = config.getWaveTextColor(); + + this.safespotDisplayMode = config.safespotDisplayMode(); + this.safespotsCheckSize = config.safespotsCheckSize(); + this.indicateNonSafespotted = config.indicateNonSafespotted(); + this.indicateTemporarySafespotted = config.indicateTemporarySafespotted(); + this.indicateSafespotted = config.indicateSafespotted(); + this.indicateObstacles = config.indicateObstacles(); + this.safespotsZukShieldBeforeHealers = config.safespotsZukShieldBeforeHealers(); + + this.indicateNibblers = config.indicateNibblers(); + this.indicateCentralNibbler = config.indicateCentralNibbler(); + + this.indicateActiveHealersJad = config.indicateActiveHealerJad(); + this.indicateActiveHealersZuk = config.indicateActiveHealerZuk(); + + this.indicateNpcPositionBat = config.indicateNpcPositionBat(); + this.indicateNpcPositionBlob = config.indicateNpcPositionBlob(); + this.indicateNpcPositionMeleer = config.indicateNpcPositionMeleer(); + this.indicateNpcPositionRanger = config.indicateNpcPositionRanger(); + this.indicateNpcPositionMage = config.indicateNpcPositionMage(); + + this.ticksOnNpcBat = config.ticksOnNpcBat(); + this.ticksOnNpcBlob = config.ticksOnNpcBlob(); + this.ticksOnNpcMeleer = config.ticksOnNpcMeleer(); + this.ticksOnNpcRanger = config.ticksOnNpcRanger(); + this.ticksOnNpcMage = config.ticksOnNpcMage(); + this.ticksOnNpcHealerJad = config.ticksOnNpcHealerJad(); + this.ticksOnNpcJad = config.ticksOnNpcJad(); + this.ticksOnNpcZuk = config.ticksOnNpcZuk(); + + this.safespotsBat = config.safespotsBat(); + this.safespotsBlob = config.safespotsBlob(); + this.safespotsMeleer = config.safespotsMeleer(); + this.safespotsRanger = config.safespotsRanger(); + this.safespotsMage = config.safespotsMage(); + this.safespotsHealerJad = config.safespotsHealerJad(); + this.safespotsJad = config.safespotsJad(); + this.safespotsZukShieldBeforeHealers = config.safespotsZukShieldBeforeHealers(); + this.safespotsZukShieldAfterHealers = config.safespotsZukShieldAfterHealers(); + + this.prayerBat = config.prayerBat(); + this.prayerBlob = config.prayerBlob(); + this.prayerMeleer = config.prayerMeleer(); + this.prayerRanger = config.prayerRanger(); + this.prayerMage = config.prayerMage(); + this.prayerHealerJad = config.prayerHealerJad(); + this.prayerJad = config.prayerJad(); + + this.hideNibblerDeath = config.hideNibblerDeath(); + this.hideBatDeath = config.hideBatDeath(); + this.hideBlobDeath = config.hideBlobDeath(); + this.hideBlobSmallRangedDeath = config.hideBlobSmallRangedDeath(); + this.hideBlobSmallMagicDeath = config.hideBlobSmallMagicDeath(); + this.hideBlobSmallMeleeDeath = config.hideBlobSmallMeleeDeath(); + this.hideMeleerDeath = config.hideMeleerDeath(); + this.hideRangerDeath = config.hideRangerDeath(); + this.hideMagerDeath = config.hideMagerDeath(); + this.hideHealerJadDeath = config.hideHealerJadDeath(); + this.hideJadDeath = config.hideJadDeath(); + this.hideHealerZukDeath = config.hideHealerZukDeath(); + this.hideZukDeath = config.hideZukDeath(); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlay.java deleted file mode 100644 index be91b61495..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlay.java +++ /dev/null @@ -1,138 +0,0 @@ -package net.runelite.client.plugins.inferno; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Polygon; -import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.NPC; -import net.runelite.api.Prayer; -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.OverlayPriority; -import net.runelite.client.ui.overlay.OverlayUtil; - -public class InfernoPrayerOverlay extends Overlay -{ - private static final int TICK_PIXEL_SIZE = 60; - private static final int BLOB_WIDTH = 10; - private static final int BLOB_HEIGHT = 5; - - private final InfernoPlugin plugin; - private final Client client; - - @Inject - private InfernoPrayerOverlay(final Client client, final InfernoPlugin plugin) - { - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_WIDGETS); - setPriority(OverlayPriority.HIGHEST); - - this.client = client; - this.plugin = plugin; - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC).isHidden() - || client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES).isHidden()) - { - return null; - } - - InfernoJad.Attack prayerForAttack = null; - - if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC)) - { - prayerForAttack = InfernoJad.Attack.MAGIC; - } - else if (client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES)) - { - prayerForAttack = InfernoJad.Attack.RANGE; - } - - InfernoJad.Attack closestAttack = null; - int leastTicks = 999; - - for (InfernoJad jad : plugin.getJads()) - { - if (jad.getNextAttack() == null || jad.getTicksTillNextAttack() < 1) - { - continue; - } - - if (jad.getTicksTillNextAttack() < leastTicks) - { - leastTicks = jad.getTicksTillNextAttack(); - closestAttack = jad.getNextAttack(); - } - - if (!plugin.isDescendingBoxes() || !plugin.isShowPrayerHelp() - || (plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.PRAYER_TAB - && plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.BOTH)) - { - continue; - } - - final Widget prayerWidget = jad.getNextAttack() == InfernoJad.Attack.MAGIC - ? client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC) : client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES); - int baseX = (int) prayerWidget.getBounds().getX(); - baseX += prayerWidget.getBounds().getWidth() / 2; - baseX -= BLOB_WIDTH / 2; - - int baseY = (int) prayerWidget.getBounds().getY() - jad.getTicksTillNextAttack() * TICK_PIXEL_SIZE - BLOB_HEIGHT; - baseY += TICK_PIXEL_SIZE - ((plugin.getLastTick() + 600 - System.currentTimeMillis()) / 600.0 * TICK_PIXEL_SIZE); - - final Polygon blob = new Polygon(new int[]{0, BLOB_WIDTH, BLOB_WIDTH, 0}, new int[]{0, 0, BLOB_HEIGHT, BLOB_HEIGHT}, 4); - blob.translate(baseX, baseY); - - OverlayUtil.renderPolygon(graphics, blob, Color.ORANGE); - } - - if (plugin.isShowPrayerHelp() && closestAttack != null - && (closestAttack != prayerForAttack || plugin.isIndicateWhenPrayingCorrectly()) - && (plugin.getPrayerOverlayMode() == InfernoPrayerOverlayMode.PRAYER_TAB - || plugin.getPrayerOverlayMode() == InfernoPrayerOverlayMode.BOTH)) - { - final Widget prayerWidget = closestAttack == InfernoJad.Attack.MAGIC - ? client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC) : client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES); - final Polygon prayer = new Polygon( - new int[]{0, (int) prayerWidget.getBounds().getWidth(), (int) prayerWidget.getBounds().getWidth(), 0}, - new int[]{0, 0, (int) prayerWidget.getBounds().getHeight(), (int) prayerWidget.getBounds().getHeight()}, - 4); - prayer.translate((int) prayerWidget.getBounds().getX(), (int) prayerWidget.getBounds().getY()); - - Color prayerColor; - if (closestAttack == prayerForAttack) - { - prayerColor = Color.GREEN; - } - else - { - prayerColor = Color.RED; - } - - OverlayUtil.renderPolygon(graphics, prayer, prayerColor); - } - - if (plugin.isIndicateActiveHealers()) - { - for (NPC healer : plugin.getActiveHealers()) - { - if (healer.getConvexHull() == null) - { - continue; - } - - OverlayUtil.renderPolygon(graphics, healer.getConvexHull(), Color.CYAN); - } - } - - return null; - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlayMode.java deleted file mode 100644 index 65cadb1789..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoPrayerOverlayMode.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.runelite.client.plugins.inferno; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public enum InfernoPrayerOverlayMode -{ - PRAYER_TAB("Prayer Tab"), - BOTTOM_RIGHT("Bottom Right"), - BOTH("Both"); - - private final String name; - - @Override - public String toString() - { - return name; - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java index d8fea0ca5d..4ee86a2823 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveMappings.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2019, Kyleeld - * Copyright (c) 2019, openosrs + * Copyright (c) 2019, RuneLitePlus * * All rights reserved. * @@ -28,18 +28,21 @@ package net.runelite.client.plugins.inferno; import com.google.common.collect.ImmutableMap; import java.awt.Color; +import java.util.Map; import lombok.AccessLevel; import lombok.Getter; +import net.runelite.client.plugins.inferno.displaymodes.InfernoNamingDisplayMode; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; class InfernoWaveMappings { @Getter(AccessLevel.PACKAGE) - private static final ImmutableMap waveMapping; - + private static final Map waveMapping; @Getter(AccessLevel.PACKAGE) - private static final ImmutableMap npcNameMapping; + private static final Map npcNameMappingComplex; + @Getter(AccessLevel.PACKAGE) + private static final Map npcNameMappingSimple; static { @@ -108,30 +111,43 @@ class InfernoWaveMappings waveMapBuilder.put(61, new int[]{32, 32, 32, 85, 165, 240, 370, 490}); waveMapBuilder.put(62, new int[]{32, 32, 32, 85, 85, 165, 240, 370, 490}); waveMapBuilder.put(63, new int[]{32, 32, 32, 165, 165, 240, 370, 490}); - waveMapBuilder.put(64, new int[]{32, 32, 32, 85, 240, 240, 370, 490}); - waveMapBuilder.put(65, new int[]{32, 32, 32, 85, 370, 370, 490}); - waveMapBuilder.put(66, new int[]{32, 32, 32, 85, 490, 490}); + waveMapBuilder.put(64, new int[]{32, 32, 32, 240, 240, 370, 490}); + waveMapBuilder.put(65, new int[]{32, 32, 32, 370, 370, 490}); + waveMapBuilder.put(66, new int[]{32, 32, 32, 490, 490}); waveMapBuilder.put(67, new int[]{900}); waveMapBuilder.put(68, new int[]{900, 900, 900}); waveMapBuilder.put(69, new int[]{1400}); waveMapping = waveMapBuilder.build(); - ImmutableMap.Builder nameMapBuilder = new ImmutableMap.Builder<>(); + ImmutableMap.Builder nameMapBuilderSimple = new ImmutableMap.Builder<>(); - nameMapBuilder.put(32, "Jal-Nib - Level 32"); - nameMapBuilder.put(85, "Jal-MejRah - Level 85"); - nameMapBuilder.put(165, "Jal-Ak - Level 165"); - nameMapBuilder.put(240, "Jal-ImKot - Level 240"); - nameMapBuilder.put(370, "Jal-Xil - Level 370"); - nameMapBuilder.put(490, "Jal-Zek - Level 490"); - nameMapBuilder.put(900, "JalTok-Jad - Level 900"); - nameMapBuilder.put(1400, "TzKal-Zuk - Level 1400"); + nameMapBuilderSimple.put(32, "Nibbler"); + nameMapBuilderSimple.put(85, "Bat"); + nameMapBuilderSimple.put(165, "Blob"); + nameMapBuilderSimple.put(240, "Meleer"); + nameMapBuilderSimple.put(370, "Ranger"); + nameMapBuilderSimple.put(490, "Mage"); + nameMapBuilderSimple.put(900, "Jad"); + nameMapBuilderSimple.put(1400, "Zuk"); - npcNameMapping = nameMapBuilder.build(); + npcNameMappingSimple = nameMapBuilderSimple.build(); + + ImmutableMap.Builder nameMapBuilderComplex = new ImmutableMap.Builder<>(); + + nameMapBuilderComplex.put(32, "Jal-Nib"); + nameMapBuilderComplex.put(85, "Jal-MejRah"); + nameMapBuilderComplex.put(165, "Jal-Ak"); + nameMapBuilderComplex.put(240, "Jal-ImKot"); + nameMapBuilderComplex.put(370, "Jal-Xil"); + nameMapBuilderComplex.put(490, "Jal-Zek"); + nameMapBuilderComplex.put(900, "JalTok-Jad"); + nameMapBuilderComplex.put(1400, "TzKal-Zuk"); + + npcNameMappingComplex = nameMapBuilderComplex.build(); } - static void addWaveComponent(PanelComponent panelComponent, String header, int wave, Color titleColor, Color color) + static void addWaveComponent(InfernoPlugin plugin, PanelComponent panelComponent, String header, int wave, Color titleColor, Color color) { int[] monsters = waveMapping.get(wave); @@ -160,7 +176,23 @@ class InfernoWaveMappings TitleComponent.TitleComponentBuilder builder = TitleComponent.builder(); - builder.text(count + "x " + npcNameMapping.get(monsterType)); + String npcNameText = ""; + + if (plugin.getNpcNaming() == InfernoNamingDisplayMode.SIMPLE) + { + npcNameText += npcNameMappingSimple.get(monsterType); + } + else + { + npcNameText += npcNameMappingComplex.get(monsterType); + } + + if (plugin.isNpcLevels()) + { + npcNameText += " (" + monsterType + ")"; + } + + builder.text(count + "x " + npcNameText); builder.color(color); panelComponent.getChildren().add(builder.build()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java index 03d86509c0..1e09ca3f6e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveOverlay.java @@ -8,6 +8,7 @@ import java.awt.Graphics2D; import lombok.AccessLevel; import lombok.Setter; import static net.runelite.client.plugins.inferno.InfernoWaveMappings.addWaveComponent; +import net.runelite.client.plugins.inferno.displaymodes.InfernoWaveDisplayMode; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; @@ -47,6 +48,7 @@ public class InfernoWaveOverlay extends Overlay displayMode == InfernoWaveDisplayMode.BOTH) { addWaveComponent( + plugin, panelComponent, "Current Wave (Wave " + plugin.getCurrentWaveNumber() + ")", plugin.getCurrentWaveNumber(), @@ -59,6 +61,7 @@ public class InfernoWaveOverlay extends Overlay displayMode == InfernoWaveDisplayMode.BOTH) { addWaveComponent( + plugin, panelComponent, "Next Wave (Wave " + plugin.getNextWaveNumber() + ")", plugin.getNextWaveNumber(), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoNamingDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoNamingDisplayMode.java new file mode 100644 index 0000000000..8818ef210a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoNamingDisplayMode.java @@ -0,0 +1,7 @@ +package net.runelite.client.plugins.inferno.displaymodes; + +public enum InfernoNamingDisplayMode +{ + SIMPLE, + COMPLEX +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoPrayerDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoPrayerDisplayMode.java new file mode 100644 index 0000000000..2d2b489e49 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoPrayerDisplayMode.java @@ -0,0 +1,8 @@ +package net.runelite.client.plugins.inferno.displaymodes; + +public enum InfernoPrayerDisplayMode +{ + PRAYER_TAB, + BOTTOM_RIGHT, + BOTH +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoSafespotDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoSafespotDisplayMode.java new file mode 100644 index 0000000000..fe3a35adde --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoSafespotDisplayMode.java @@ -0,0 +1,25 @@ +package net.runelite.client.plugins.inferno.displaymodes; + +import lombok.AccessLevel; +import lombok.Getter; + +@Getter(AccessLevel.PACKAGE) +public enum InfernoSafespotDisplayMode +{ + OFF("Off"), + INDIVIDUAL_TILES("Individual tiles"), + AREA("Area (lower fps)"); + + final private String name; + + InfernoSafespotDisplayMode(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return this.name; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoWaveDisplayMode.java similarity index 96% rename from runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveDisplayMode.java rename to runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoWaveDisplayMode.java index 96c7d12001..dcb1ccb5fb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/InfernoWaveDisplayMode.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoWaveDisplayMode.java @@ -22,7 +22,7 @@ * (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.inferno; +package net.runelite.client.plugins.inferno.displaymodes; import lombok.RequiredArgsConstructor; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoZukShieldDisplayMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoZukShieldDisplayMode.java new file mode 100644 index 0000000000..081fff8f56 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inferno/displaymodes/InfernoZukShieldDisplayMode.java @@ -0,0 +1,25 @@ +package net.runelite.client.plugins.inferno.displaymodes; + +import lombok.AccessLevel; +import lombok.Getter; + +@Getter(AccessLevel.PACKAGE) +public enum InfernoZukShieldDisplayMode +{ + OFF("Off"), + LIVE("Live (follow shield)"), + PREDICT("Predict (NOT WORKING YET)"); + + final private String name; + + InfernoZukShieldDisplayMode(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return this.name; + } +} 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 4ea4c471ee..895f394503 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 @@ -72,6 +72,49 @@ public class OverlayUtil graphics.setStroke(originalStroke); } + public static void renderOutlinePolygon(Graphics2D graphics, Shape poly, Color color) + { + graphics.setColor(color); + final Stroke originalStroke = graphics.getStroke(); + graphics.setStroke(new BasicStroke(2)); + graphics.draw(poly); + graphics.setStroke(originalStroke); + } + + public static void renderFilledPolygon(Graphics2D graphics, Shape poly, Color color) + { + graphics.setColor(color); + final Stroke originalStroke = graphics.getStroke(); + graphics.setStroke(new BasicStroke(2)); + graphics.draw(poly); + graphics.fill(poly); + graphics.setStroke(originalStroke); + } + + public static void renderAreaTilePolygon(Graphics2D graphics, Shape poly, Color color) + { + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 10)); + graphics.fill(poly); + } + + public static void renderFullLine(Graphics2D graphics, int[][] line, Color color) + { + graphics.setColor(color); + final Stroke originalStroke = graphics.getStroke(); + graphics.setStroke(new BasicStroke(2)); + graphics.drawLine(line[0][0], line[0][1], line[1][0], line[1][1]); + graphics.setStroke(originalStroke); + } + + public static void renderDashedLine(Graphics2D graphics, int[][] line, Color color) + { + graphics.setColor(color); + final Stroke originalStroke = graphics.getStroke(); + graphics.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0)); + graphics.drawLine(line[0][0], line[0][1], line[1][0], line[1][1]); + graphics.setStroke(originalStroke); + } + public static void renderPolygonThin(Graphics2D graphics, Polygon poly, Color color) { graphics.setColor(color); From f715c9f48dbc7c79a7c79e9eacf517b2063dc5ff Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Sat, 26 Oct 2019 08:48:05 +0100 Subject: [PATCH 083/185] clues: fix MultipleOfItemRequirement not working with non-stacking items --- .../clues/item/MultipleOfItemRequirement.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/item/MultipleOfItemRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/item/MultipleOfItemRequirement.java index 975d38c1d2..064d92eddc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/item/MultipleOfItemRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/item/MultipleOfItemRequirement.java @@ -48,11 +48,16 @@ public class MultipleOfItemRequirement implements ItemRequirement @Override public boolean fulfilledBy(Item[] items) { + int quantityFound = 0; for (Item item : items) { - if (item.getId() == itemId && item.getQuantity() >= quantity) + if (item.getId() == itemId) { - return true; + quantityFound += item.getQuantity(); + if (quantityFound >= quantity) + { + return true; + } } } From c2e7b61a685ae3e86841cce904e081f35ad6e481 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 25 Oct 2019 19:07:52 -0400 Subject: [PATCH 084/185] cache: update npc definition and loader --- .../cache/definitions/NpcDefinition.java | 53 +++++++++--------- .../cache/definitions/loaders/NpcLoader.java | 56 +++++++++---------- .../cache/definitions/savers/NpcSaver.java | 48 ++++++++-------- 3 files changed, 77 insertions(+), 80 deletions(-) diff --git a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java index 8ba160c97a..ddfabfe367 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java +++ b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java @@ -31,38 +31,37 @@ import lombok.Data; @Data public class NpcDefinition { - public final int id; - public short[] recolorToFind; - public int rotation = 32; public String name = "null"; - public short[] recolorToReplace; + public int size = 1; public int[] models; - public int[] models_2; - public int stanceAnimation = -1; - public int anInt2165 = -1; - public int tileSpacesOccupied = 1; - public int walkAnimation = -1; - public short[] retextureToReplace; - public int rotate90RightAnimation = -1; - public boolean aBool2170 = true; - public int resizeX = 128; - public int contrast = 0; + public int[] chatheadModels; + public int standingAnimation = -1; + public int rotateLeftAnimation = -1; + public int rotateRightAnimation = -1; + public int walkingAnimation = -1; public int rotate180Animation = -1; - public int varbitIndex = -1; - public String[] options = new String[5]; - public boolean renderOnMinimap = true; - public int combatLevel = -1; + public int rotate90RightAnimation = -1; public int rotate90LeftAnimation = -1; - public int resizeY = 128; - public boolean hasRenderPriority = false; - public int ambient = 0; - public int headIcon = -1; - public int[] configs; + public short[] recolorToFind; + public short[] recolorToReplace; public short[] retextureToFind; + public short[] retextureToReplace; + public String[] actions = new String[5]; + public boolean isMinimapVisible = true; + public int combatLevel = -1; + public int widthScale = 128; + public int heightScale = 128; + public boolean hasRenderPriority; + public int ambient; + public int contrast; + public int headIcon = -1; + public int rotationSpeed = 32; + public int[] configs; + public int varbitId = -1; public int varpIndex = -1; - public boolean isClickable = true; - public int anInt2189 = -1; - public boolean aBool2190 = false; - public Map params = null; + public boolean isInteractable = true; + public boolean rotationFlag = true; + public boolean isPet; + public Map params; } diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java index 478ef2660a..0ce81f864b 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java @@ -24,13 +24,12 @@ */ package net.runelite.cache.definitions.loaders; +import java.util.HashMap; import net.runelite.cache.definitions.NpcDefinition; import net.runelite.cache.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; - public class NpcLoader { private static final Logger logger = LoggerFactory.getLogger(NpcLoader.class); @@ -67,7 +66,6 @@ public class NpcLoader { def.models[index] = stream.readUnsignedShort(); } - } else if (opcode == 2) { @@ -75,37 +73,37 @@ public class NpcLoader } else if (opcode == 12) { - def.tileSpacesOccupied = stream.readUnsignedByte(); + def.size = stream.readUnsignedByte(); } else if (opcode == 13) { - def.stanceAnimation = stream.readUnsignedShort(); + def.standingAnimation = stream.readUnsignedShort(); } else if (opcode == 14) { - def.walkAnimation = stream.readUnsignedShort(); + def.walkingAnimation = stream.readUnsignedShort(); } else if (opcode == 15) { - def.anInt2165 = stream.readUnsignedShort(); + def.rotateLeftAnimation = stream.readUnsignedShort(); } else if (opcode == 16) { - def.anInt2189 = stream.readUnsignedShort(); + def.rotateRightAnimation = stream.readUnsignedShort(); } else if (opcode == 17) { - def.walkAnimation = stream.readUnsignedShort(); + def.walkingAnimation = stream.readUnsignedShort(); def.rotate180Animation = stream.readUnsignedShort(); def.rotate90RightAnimation = stream.readUnsignedShort(); def.rotate90LeftAnimation = stream.readUnsignedShort(); } else if (opcode >= 30 && opcode < 35) { - def.options[opcode - 30] = stream.readString(); - if (def.options[opcode - 30].equalsIgnoreCase("Hidden")) + def.actions[opcode - 30] = stream.readString(); + if (def.actions[opcode - 30].equalsIgnoreCase("Hidden")) { - def.options[opcode - 30] = null; + def.actions[opcode - 30] = null; } } else if (opcode == 40) @@ -137,17 +135,17 @@ public class NpcLoader else if (opcode == 60) { length = stream.readUnsignedByte(); - def.models_2 = new int[length]; + def.chatheadModels = new int[length]; for (index = 0; index < length; ++index) { - def.models_2[index] = stream.readUnsignedShort(); + def.chatheadModels[index] = stream.readUnsignedShort(); } } else if (opcode == 93) { - def.renderOnMinimap = false; + def.isMinimapVisible = false; } else if (opcode == 95) { @@ -155,11 +153,11 @@ public class NpcLoader } else if (opcode == 97) { - def.resizeX = stream.readUnsignedShort(); + def.widthScale = stream.readUnsignedShort(); } else if (opcode == 98) { - def.resizeY = stream.readUnsignedShort(); + def.heightScale = stream.readUnsignedShort(); } else if (opcode == 99) { @@ -179,18 +177,18 @@ public class NpcLoader } else if (opcode == 103) { - def.rotation = stream.readUnsignedShort(); + def.rotationSpeed = stream.readUnsignedShort(); } else if (opcode == 106) { - def.varbitIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varbitIndex) + def.varbitId = stream.readUnsignedShort(); + if (def.varbitId == 65535) { - def.varbitIndex = -1; + def.varbitId = -1; } def.varpIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varpIndex) + if (def.varpIndex == 65535) { def.varpIndex = -1; } @@ -212,26 +210,26 @@ public class NpcLoader } else if (opcode == 107) { - def.isClickable = false; + def.isInteractable = false; } else if (opcode == 109) { - def.aBool2170 = false; + def.rotationFlag = false; } else if (opcode == 111) { - def.aBool2190 = true; + def.isPet = true; } else if (opcode == 118) { - def.varbitIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varbitIndex) + def.varbitId = stream.readUnsignedShort(); + if (def.varbitId == 65535) { - def.varbitIndex = -1; + def.varbitId = -1; } def.varpIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varpIndex) + if (def.varpIndex == 65535) { def.varpIndex = -1; } diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java index 55d4b966e9..577681cf80 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java @@ -47,45 +47,45 @@ public class NpcSaver out.writeByte(2); out.writeString(npc.name); } - if (npc.tileSpacesOccupied != 1) + if (npc.size != 1) { out.writeByte(12); - out.writeByte(npc.tileSpacesOccupied); + out.writeByte(npc.size); } - if (npc.stanceAnimation != -1) + if (npc.standingAnimation != -1) { out.writeByte(13); - out.writeShort(npc.stanceAnimation); + out.writeShort(npc.standingAnimation); } - if (npc.walkAnimation != -1) + if (npc.walkingAnimation != -1) { out.writeByte(14); - out.writeShort(npc.walkAnimation); + out.writeShort(npc.walkingAnimation); } - if (npc.anInt2165 != -1) + if (npc.rotateLeftAnimation != -1) { out.writeByte(15); - out.writeShort(npc.anInt2165); + out.writeShort(npc.rotateLeftAnimation); } - if (npc.anInt2189 != -1) + if (npc.rotateRightAnimation != -1) { out.writeByte(16); - out.writeShort(npc.anInt2189); + out.writeShort(npc.rotateRightAnimation); } if (npc.rotate180Animation != -1 || npc.rotate90LeftAnimation != -1 || npc.rotate90RightAnimation != -1) { out.writeByte(17); - out.writeShort(npc.walkAnimation); + out.writeShort(npc.walkingAnimation); out.writeShort(npc.rotate180Animation); out.writeShort(npc.rotate90RightAnimation); out.writeShort(npc.rotate90LeftAnimation); } for (int i = 0; i < 5; ++i) { - if (npc.options[i] != null) + if (npc.actions[i] != null) { out.writeByte(30 + i); - out.writeString(npc.options[i]); + out.writeString(npc.actions[i]); } } if (npc.recolorToFind != null && npc.recolorToReplace != null) @@ -108,16 +108,16 @@ public class NpcSaver out.writeShort(npc.retextureToReplace[i]); } } - if (npc.models_2 != null) + if (npc.chatheadModels != null) { out.writeByte(60); - out.writeByte(npc.models_2.length); - for (int modelId : npc.models_2) + out.writeByte(npc.chatheadModels.length); + for (int modelId : npc.chatheadModels) { out.writeShort(modelId); } } - if (!npc.renderOnMinimap) + if (!npc.isMinimapVisible) { out.writeByte(93); } @@ -127,9 +127,9 @@ public class NpcSaver out.writeShort(npc.combatLevel); } out.writeByte(97); - out.writeShort(npc.resizeX); + out.writeShort(npc.widthScale); out.writeByte(98); - out.writeShort(npc.resizeY); + out.writeShort(npc.heightScale); if (npc.hasRenderPriority) { out.writeByte(99); @@ -144,23 +144,23 @@ public class NpcSaver out.writeShort(npc.headIcon); } out.writeByte(103); - out.writeShort(npc.rotation); - if (!npc.isClickable) + out.writeShort(npc.rotationSpeed); + if (!npc.isInteractable) { out.writeByte(107); } - if (!npc.aBool2170) + if (!npc.rotationFlag) { out.writeByte(109); } - if (npc.aBool2190) + if (npc.isPet) { out.writeByte(111); } if (npc.configs != null) { out.writeByte(118); - out.writeShort(npc.varbitIndex); + out.writeShort(npc.varbitId); out.writeShort(npc.varpIndex); int[] c = npc.configs; From 7eda41452ba2985a479607eddc04cbb0e9ede9aa Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 26 Oct 2019 12:18:24 -0400 Subject: [PATCH 085/185] api: add source to sound effect events --- .../runelite/api/events/AreaSoundEffectPlayed.java | 11 +++++++++++ .../net/runelite/api/events/SoundEffectPlayed.java | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java index 488bff8264..e0f4c1fe28 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java +++ b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java @@ -24,14 +24,25 @@ */ package net.runelite.api.events; +import javax.annotation.Nullable; import lombok.Data; +import net.runelite.api.Actor; @Data public class AreaSoundEffectPlayed { + @Nullable + private final Actor source; private int soundId; private int sceneX; private int sceneY; private int range; private int delay; + + private boolean consumed; + + public void consume() + { + consumed = true; + } } 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 index 127a9a2646..06002f717a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java +++ b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java @@ -24,11 +24,22 @@ */ package net.runelite.api.events; +import javax.annotation.Nullable; import lombok.Data; +import net.runelite.api.Actor; @Data public class SoundEffectPlayed { + @Nullable + private final Actor source; private int soundId; private int delay; + + private boolean consumed; + + public void consume() + { + consumed = true; + } } From 9f9205e65d144e444c57b5fe62ef7cd4d4625e7f Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 26 Oct 2019 12:18:49 -0400 Subject: [PATCH 086/185] devtools: add source to sound effect overlay --- .../net/runelite/client/plugins/devtools/SoundEffectOverlay.java | 1 + 1 file changed, 1 insertion(+) 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 index fbe2254066..cb99746a90 100644 --- 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 @@ -123,6 +123,7 @@ class SoundEffectOverlay extends Overlay String text = "Id: " + event.getSoundId() + + " - S: " + (event.getSource() != null ? event.getSource().getName() : "") + " - L: " + event.getSceneX() + "," + event.getSceneY() + " - R: " + event.getRange() + " - D: " + event.getDelay(); From 79800944011b8a1b0f0073adc6674323b1588374 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 26 Oct 2019 12:19:28 -0400 Subject: [PATCH 087/185] music plugin: add option to mute other players area sounds --- .../client/plugins/music/MusicConfig.java | 11 +++++++++++ .../client/plugins/music/MusicPlugin.java | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java index da764e62c9..e425a10f08 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -31,6 +31,16 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("music") public interface MusicConfig extends Config { + @ConfigItem( + keyName = "muteOtherAreaSounds", + name = "Mute others' area sounds", + description = "Mute area sounds caused from other players" + ) + default boolean muteOtherAreaSounds() + { + return false; + } + @ConfigItem( keyName = "musicVolume", name = "", @@ -60,6 +70,7 @@ public interface MusicConfig extends Config { return 0; } + @ConfigItem( keyName = "soundEffectVolume", name = "", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 167032278a..dd99b8ad5e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -37,13 +37,16 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.Player; import net.runelite.api.ScriptID; import net.runelite.api.SoundEffectID; import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; import net.runelite.api.VarPlayer; +import net.runelite.api.events.AreaSoundEffectPlayed; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.ScriptCallbackEvent; @@ -532,4 +535,16 @@ public class MusicPlugin extends Plugin client.getIntStack()[client.getIntStackSize() - 1] = -1; } } + + @Subscribe + public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed areaSoundEffectPlayed) + { + Actor source = areaSoundEffectPlayed.getSource(); + if (source != client.getLocalPlayer() + && source instanceof Player + && musicConfig.muteOtherAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + } } \ No newline at end of file From 0ef426ef4813e9923555273b35ea8c126ed6d5e7 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 26 Oct 2019 19:54:07 +0200 Subject: [PATCH 088/185] actions: fix --- .github/workflows/build.yml | 42 ++++++++++++++++++++--------------- .github/workflows/gradle.yml | 30 ++++++++++++------------- .github/workflows/scraper.yml | 6 ++--- .github/workflows/stale.yml | 2 +- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 691a56bcdb..451d893b38 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: pr-lint: name: PR title runs-on: ubuntu-latest - + steps: - name: PR title lint if: github.event_name == 'pull_request' @@ -15,49 +15,55 @@ jobs: title-regex: '^([\w-/]+): \w+' build: - runs-on: windows-latest + runs-on: ubuntu-latest name: Build steps: - - uses: actions/checkout@master + - uses: actions/checkout@v1 + - name: Make gradlew executable + run: chmod +x ./gradlew - name: Set up JDK 11 - uses: actions/setup-java@master + uses: actions/setup-java@v1 with: java-version: 11 - name: Assembling - run: gradlew assemble --console=plain + run: ./gradlew assemble --console=plain - name: Building - run: gradlew build --stacktrace -x test -x checkstyleMain --console=plain + run: ./gradlew build --stacktrace -x test -x checkstyleMain --console=plain test: - runs-on: windows-latest + runs-on: ubuntu-latest name: Test steps: - - uses: actions/checkout@master + - uses: actions/checkout@v1 + - name: Make gradlew executable + run: chmod +x ./gradlew - name: Set up JDK 11 - uses: actions/setup-java@master + uses: actions/setup-java@v1 with: java-version: 11 - name: Assembling - run: gradlew assemble --console=plain + run: ./gradlew assemble --console=plain - name: Testing - run: gradlew test --stacktrace --console=plain + run: ./gradlew test --stacktrace --console=plain checkstyle: name: Checkstyle - runs-on: windows-latest + runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v1 + - name: Make gradlew executable + run: chmod +x ./gradlew - name: Set up JDK 11 - uses: actions/setup-java@master + uses: actions/setup-java@v1 with: java-version: 11 - name: Assembling - run: gradlew assemble --console=plain + run: ./gradlew assemble --console=plain - name: Checking code conventions - run: gradlew checkstyleMain --console=plain + run: ./gradlew checkstyleMain --console=plain approve: name: Approve @@ -67,6 +73,6 @@ jobs: steps: - name: Approve pull request if: github.event_name == 'pull_request' && github.actor == 'OpenOSRS' - uses: hmarr/auto-approve-action@master + uses: hmarr/auto-approve-action@v2.0.0 with: - github-token: "${{ secrets.GITHUB_TOKEN }}" + github-token: "${{ secrets.GITHUB_TOKEN }}" \ No newline at end of file diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 619e3921c6..b478c70501 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v1 - name: Make gradlew executable run: chmod +x ./gradlew - name: Update Gradle Wrapper @@ -28,17 +28,17 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: Make gradlew executable - run: chmod +x ./gradlew - - name: Update Gradle dependencies - run: ./gradlew useLatestVersions --console=plain - - name: Create Gradle dependencies update Pull Request - uses: Owain94/create-pull-request@master - env: - GITHUB_TOKEN: ${{ secrets.OpenOSRS }} - PULL_REQUEST_BRANCH: GRADLE-DEPENDENCY-UPDATE - PULL_REQUEST_TITLE: 'project: Update gradle dependencies' - PULL_REQUEST_BODY: This is an auto-generated PR with an updated gradle dependencies versions - COMMIT_MESSAGE: 'project: Update gradle dependencies' - PULL_REQUEST_LABELS: automated pull request, gradle + - uses: actions/checkout@v1 + - name: Make gradlew executable + run: chmod +x ./gradlew + - name: Update Gradle dependencies + run: ./gradlew useLatestVersions --console=plain + - name: Create Gradle dependencies update Pull Request + uses: Owain94/create-pull-request@master + env: + GITHUB_TOKEN: ${{ secrets.OpenOSRS }} + PULL_REQUEST_BRANCH: GRADLE-DEPENDENCY-UPDATE + PULL_REQUEST_TITLE: 'project: Update gradle dependencies' + PULL_REQUEST_BODY: This is an auto-generated PR with an updated gradle dependencies versions + COMMIT_MESSAGE: 'project: Update gradle dependencies' + PULL_REQUEST_LABELS: automated pull request, gradle \ No newline at end of file diff --git a/.github/workflows/scraper.yml b/.github/workflows/scraper.yml index 62e7f738a2..591bbd73f6 100644 --- a/.github/workflows/scraper.yml +++ b/.github/workflows/scraper.yml @@ -9,9 +9,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v1 - name: Set up JDK 11 - uses: actions/setup-java@master + uses: actions/setup-java@v1 with: java-version: 11 - name: Make gradlew executable @@ -36,4 +36,4 @@ jobs: PULL_REQUEST_TITLE: 'Client: Update NPC stats' PULL_REQUEST_BODY: This is an auto-generated PR with changes from the OSRS wiki COMMIT_MESSAGE: 'Client: Update NPC stats' - PULL_REQUEST_LABELS: automated pull request, NPC stats + PULL_REQUEST_LABELS: automated pull request, NPC stats \ No newline at end of file diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index f6ec51e2e4..31269fc102 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -19,4 +19,4 @@ jobs: exempt-issue-label: 'awaiting-approval' exempt-pr-label: 'awaiting-approval' days-before-stale: 60 - days-before-close: 30 + days-before-close: 30 \ No newline at end of file From a3667f10e39a18cf5e4bae19065dd5e05ab486e3 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Sat, 26 Oct 2019 21:31:00 +0200 Subject: [PATCH 089/185] deathindicator: add permabones (#1829) * Add api support for faking ground items and add permabones * Remove unused method * fixed loading/keeping loaded, fixed calendar thingy, probably forgot something * Actually commit the calendar tsuff --- .../java/net/runelite/api/ItemDefinition.java | 13 + .../src/main/java/net/runelite/api/Scene.java | 12 + .../net/runelite/api/events/MenuOpened.java | 24 +- .../client/plugins/deathindicator/Bone.java | 42 ++++ .../client/plugins/deathindicator/Bones.java | 200 +++++++++++++++ .../deathindicator/DeathIndicatorConfig.java | 10 + .../deathindicator/DeathIndicatorPlugin.java | 233 ++++++++++++++++-- .../net/runelite/client/util/MiscUtils.java | 84 +++++++ .../mixins/RSItemDefinitionMixin.java | 25 ++ .../net/runelite/mixins/RSSceneMixin.java | 71 ++++++ .../java/net/runelite/rs/api/RSClient.java | 11 +- .../net/runelite/rs/api/RSItemDefinition.java | 11 + .../java/net/runelite/rs/api/RSNodeDeque.java | 9 + .../java/net/runelite/rs/api/RSScene.java | 3 + 14 files changed, 728 insertions(+), 20 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bone.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java diff --git a/runelite-api/src/main/java/net/runelite/api/ItemDefinition.java b/runelite-api/src/main/java/net/runelite/api/ItemDefinition.java index c955574543..891fdeec9c 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemDefinition.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemDefinition.java @@ -12,6 +12,11 @@ public interface ItemDefinition */ String getName(); + /** + * Sets the items name. + */ + void setName(String name); + /** * Gets the items ID. * @@ -86,6 +91,7 @@ public interface ItemDefinition * Returns whether or not the item can be sold on the grand exchange. */ boolean isTradeable(); + void setTradeable(boolean yes); /** * Gets an array of possible right-click menu actions the item @@ -114,4 +120,11 @@ public interface ItemDefinition * default value. */ void resetShiftClickActionIndex(); + + /** + * With this you can make certain (ground) items look like different ones. + * + * @param id The itemID of the item with desired model + */ + void setModelOverride(int id); } diff --git a/runelite-api/src/main/java/net/runelite/api/Scene.java b/runelite-api/src/main/java/net/runelite/api/Scene.java index 53cc8fcb15..5b7460340b 100644 --- a/runelite-api/src/main/java/net/runelite/api/Scene.java +++ b/runelite-api/src/main/java/net/runelite/api/Scene.java @@ -24,6 +24,8 @@ */ package net.runelite.api; +import net.runelite.api.coords.WorldPoint; + /** * Represents the entire 3D scene */ @@ -36,6 +38,16 @@ public interface Scene */ Tile[][][] getTiles(); + /** + * Adds an item to the scene + */ + void addItem(int id, int quantity, WorldPoint point); + + /** + * Removes an item from the scene + */ + void removeItem(int id, int quantity, WorldPoint point); + int getDrawDistance(); void setDrawDistance(int drawDistance); } diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java index 221c8b9d0d..ee31b0ad04 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOpened.java @@ -24,6 +24,7 @@ */ package net.runelite.api.events; +import java.util.Iterator; import lombok.AccessLevel; import lombok.Setter; import net.runelite.api.MenuEntry; @@ -33,7 +34,7 @@ import lombok.Data; * An event where a menu has been opened. */ @Data -public class MenuOpened implements Event +public class MenuOpened implements Event, Iterable { /** * This should be set to true if anything about the menu @@ -70,4 +71,25 @@ public class MenuOpened implements Event { this.modified = true; } + + @Override + public Iterator iterator() + { + return new Iterator() + { + int index = 0; + + @Override + public boolean hasNext() + { + return index < menuEntries.length; + } + + @Override + public MenuEntry next() + { + return menuEntries[index++]; + } + }; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bone.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bone.java new file mode 100644 index 0000000000..28daed468e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bone.java @@ -0,0 +1,42 @@ +package net.runelite.client.plugins.deathindicator; + +import java.time.Duration; +import java.time.Instant; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import net.runelite.api.Scene; +import net.runelite.api.coords.WorldPoint; +import static net.runelite.client.plugins.deathindicator.DeathIndicatorPlugin.HIJACKED_ITEMID; +import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.MiscUtils; + +@EqualsAndHashCode +@Getter +@Setter +class Bone +{ + private String name; + private WorldPoint loc; + private Instant time; + + void addToScene(Scene scene) + { + scene.addItem(HIJACKED_ITEMID, 1, loc); + } + + void removeFromScene(Scene scene) + { + scene.removeItem(HIJACKED_ITEMID, 1, loc); + } + + String getName() + { + return ColorUtil.colorStartTag(0xff9040) + "Bones (" + name + ")"; + } + + String getExamine() + { + return name + " died here " + MiscUtils.formatTimeAgo(Duration.between(time, Instant.now())); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java new file mode 100644 index 0000000000..7b561dd63b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java @@ -0,0 +1,200 @@ +package net.runelite.client.plugins.deathindicator; + +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.Scene; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.config.ConfigManager; +import static net.runelite.http.api.RuneLiteAPI.GSON; + +@Slf4j +public class Bones +{ + private static final String CONFIG_GROUP = "deathIndicator"; + private static final String BONES_PREFIX = "bones_"; + + private ImmutableMap>> map; + private boolean changed = false; + + void init(Client client, ConfigManager configManager) + { + // Clone is important here as the normal array changes + int[] regions = client.getMapRegions().clone(); + Bone[][] bones = getBones(configManager, regions); + if (log.isDebugEnabled()) + { + log.debug("Regions are now {}", Arrays.toString(regions)); + + int n = 0; + for (Bone[] ar : bones) + { + n += ar.length; + } + log.debug("Loaded {} Bones", n); + } + + initMap(regions, bones); + + showBones(client.getScene()); + } + + private Bone[][] getBones(ConfigManager configManager, int[] regions) + { + Bone[][] bones = new Bone[regions.length][]; + + for (int i = 0; i < regions.length; i++) + { + int region = regions[i]; + bones[i] = getBones(configManager, region); + } + + return bones; + } + + private Bone[] getBones(ConfigManager configManager, int regionId) + { + String json = configManager.getConfiguration(CONFIG_GROUP, BONES_PREFIX + regionId); + if (json == null) + { + return new Bone[0]; + } + + return GSON.fromJson(json, Bone[].class); + } + + @SuppressWarnings("unchecked") + private void initMap(int[] regions, Bone[][] bones) + { + ImmutableMap.Builder>> builder = ImmutableMap.builder(); + + for (int i = 0; i < regions.length; i++) + { + int region = regions[i]; + Bone[] boneA = bones[i]; + if (boneA.length == 0) + { + builder.put(region, Collections.EMPTY_MAP); + continue; + } + + Map> map = new HashMap(boneA.length); + for (Bone b : boneA) + { + List list = map.computeIfAbsent(b.getLoc(), wp -> new ArrayList<>()); + list.add(b); + } + + builder.put(region, map); + } + + this.map = builder.build(); + } + + private void showBones(Scene scene) + { + this.forEach(bone -> bone.addToScene(scene)); + } + + void save(ConfigManager configManager) + { + if (this.map == null || !changed) + { + this.changed = false; + return; + } + + for (Map.Entry>> entry : this.map.entrySet()) + { + final String key = BONES_PREFIX + entry.getKey(); + final Map> map = entry.getValue(); + if (map.size() == 0) + { + configManager.unsetConfiguration(CONFIG_GROUP, key); + continue; + } + + List list = new ArrayList<>(map.values().size()); + for (List lb : map.values()) + { + list.addAll(lb); + } + + String val = GSON.toJson(list.toArray(new Bone[0])); + configManager.setConfiguration(CONFIG_GROUP, key, val); + } + + this.changed = false; + } + + public boolean add(Bone bone) + { + if (this.map == null) + { + return false; + } + + this.changed = true; + final int region = bone.getLoc().getRegionID(); + final Map> map = this.map.get(region); + final List list = map.computeIfAbsent(bone.getLoc(), wp -> new ArrayList<>()); + list.add(bone); + return true; + } + + public void remove(Bone bone) + { + this.changed = true; + final int region = bone.getLoc().getRegionID(); + final Map> map = this.map.get(region); + final List list = map.get(bone.getLoc()); + list.remove(bone); + } + + public void clear(Scene scene) + { + if (map == null) + { + return; + } + + this.forEach(bone -> bone.removeFromScene(scene)); + } + + public Bone get(WorldPoint point, int i) + { + return get(point).get(i); + } + + public List get(WorldPoint point) + { + final int reg = point.getRegionID(); + final Map> map = this.map.get(reg); + if (map == null) + { + return null; + } + return map.get(point); + } + + private void forEach(Consumer consumer) + { + for (Map> map : this.map.values()) + { + for (Map.Entry> entry : map.entrySet()) + { + for (Bone bone : entry.getValue()) + { + consumer.accept(bone); + } + } + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java index e35b7cc93f..f03ff689d9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorConfig.java @@ -152,4 +152,14 @@ public interface DeathIndicatorConfig extends Config description = "" ) void timeOfDeath(Instant timeOfDeath); + + @ConfigItem( + keyName = "permaBones", + name = "Permanent bones", + description = "Show right clickable bones with the name of who died permanently, after seeing someone die" + ) + default boolean permaBones() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java index 194500c4cc..33ec854e8f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java @@ -30,18 +30,32 @@ import java.awt.image.BufferedImage; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.List; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.ItemDefinition; import net.runelite.api.ItemID; +import net.runelite.api.MenuEntry; +import net.runelite.api.MenuOpcode; +import net.runelite.api.Player; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemDespawned; import net.runelite.api.events.LocalPlayerDeath; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOpened; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.PlayerDeath; +import net.runelite.api.events.PostItemDefinition; +import net.runelite.api.util.Text; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.game.ItemManager; @@ -61,6 +75,10 @@ import net.runelite.client.util.ImageUtil; @Slf4j public class DeathIndicatorPlugin extends Plugin { + private static final Object BONES = new Object(); + // A random number, that jagex probably won't actually use in the near future + static final int HIJACKED_ITEMID = 0x69696969; + private static final Set RESPAWN_REGIONS = ImmutableSet.of( 12850, // Lumbridge 11828, // Falador @@ -88,6 +106,14 @@ public class DeathIndicatorPlugin extends Plugin @Inject private EventBus eventBus; + @Inject + private ConfigManager configManager; + + @Inject + private ClientThread clientThread; + + private final Bones bones = new Bones(); + private BufferedImage mapArrow; private Timer deathTimer; @@ -95,7 +121,7 @@ public class DeathIndicatorPlugin extends Plugin private WorldPoint lastDeath; private Instant lastDeathTime; private int lastDeathWorld; - + private int despawnIdx = 0; @Provides DeathIndicatorConfig deathIndicatorConfig(ConfigManager configManager) { @@ -129,12 +155,18 @@ public class DeathIndicatorPlugin extends Plugin worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); worldMapPointManager.add(new DeathWorldMapPoint(new WorldPoint(config.deathLocationX(), config.deathLocationY(), config.deathLocationPlane()), this)); } + + if (config.permaBones() && client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invokeLater(this::initBones); + } } @Override protected void shutDown() { eventBus.unregister(this); + eventBus.unregister(BONES); if (client.hasHintArrow()) { @@ -148,6 +180,24 @@ public class DeathIndicatorPlugin extends Plugin } worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); + + clientThread.invokeLater(this::clearBones); + saveBones(); + } + + private void initBones() + { + bones.init(client, configManager); + } + + private void saveBones() + { + bones.save(configManager); + } + + private void clearBones() + { + bones.clear(client.getScene()); } private void addSubscriptions() @@ -156,6 +206,100 @@ public class DeathIndicatorPlugin extends Plugin eventBus.subscribe(LocalPlayerDeath.class, this, this::onLocalPlayerDeath); eventBus.subscribe(GameTick.class, this, this::onGameTick); eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); + if (config.permaBones()) + { + addBoneSubs(); + } + } + + private void addBoneSubs() + { + eventBus.subscribe(ItemDespawned.class, BONES, this::onItemDespawn); + eventBus.subscribe(PlayerDeath.class, BONES, this::onPlayerDeath); + eventBus.subscribe(MenuEntryAdded.class, BONES, this::onMenuEntryAdded); + eventBus.subscribe(MenuOptionClicked.class, BONES, this::onMenuOptionClicked); + eventBus.subscribe(MenuOpened.class, BONES, this::onMenuOpened); + eventBus.subscribe(PostItemDefinition.class, BONES, this::onPostItemDefinition); + } + + private void onPostItemDefinition(PostItemDefinition def) + { + ItemDefinition itemDef = def.getItemDefinition(); + if (itemDef.getId() == HIJACKED_ITEMID) + { + itemDef.setModelOverride(ItemID.BONES); + itemDef.setName("Bones"); + // This is so never hide untradeables doesn't not hide it + itemDef.setTradeable(true); + } + } + + private void onPlayerDeath(PlayerDeath death) + { + Player p = death.getPlayer(); + Bone b = new Bone(); + + b.setName(Text.sanitize(p.getName())); + b.setTime(Instant.now()); + b.setLoc(p.getWorldLocation()); + + while (!bones.add(b)) + { + initBones(); + } + + b.addToScene(client.getScene()); + } + + private void onMenuEntryAdded(MenuEntryAdded event) + { + if (event.getIdentifier() == HIJACKED_ITEMID) + { + if (event.getOpcode() == MenuOpcode.GROUND_ITEM_THIRD_OPTION.getId()) + { + client.setMenuOptionCount(client.getMenuOptionCount() - 1); + } + } + } + + private void onMenuOpened(MenuOpened event) + { + int idx = 0; + + for (MenuEntry entry : event) + { + if (entry.getIdentifier() != HIJACKED_ITEMID) + { + continue; + } + + // Only entries with appropriate identifier here will be examine so that's easy + // Add idx to id field, so we can find that back from clicked event + entry.setIdentifier(HIJACKED_ITEMID + idx); + + Bone bone = bones.get( + WorldPoint.fromScene(client, entry.getParam0(), entry.getParam1(), client.getPlane()), + idx++ + ); + + entry.setTarget(bone.getName()); + event.setModified(); + } + } + + private void onMenuOptionClicked(MenuOptionClicked event) + { + if (event.getIdentifier() >= HIJACKED_ITEMID + && event.getOpcode() == MenuOpcode.EXAMINE_ITEM_GROUND.getId()) + { + Bone b = bones.get( + WorldPoint.fromScene(client, event.getParam0(), event.getParam1(), client.getPlane()), + event.getIdentifier() - HIJACKED_ITEMID + ); + + client.addChatMessage(ChatMessageType.ITEM_EXAMINE, "", b.getExamine(), ""); + event.consume(); + } } private void onLocalPlayerDeath(LocalPlayerDeath death) @@ -238,6 +382,29 @@ public class DeathIndicatorPlugin extends Plugin { if (event.getGroup().equals("deathIndicator")) { + if ("permaBones".equals(event.getKey())) + { + if (config.permaBones()) + { + addBoneSubs(); + + if (client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invokeLater(this::initBones); + } + } + else + { + eventBus.unregister(BONES); + + if (client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invokeLater(this::clearBones); + saveBones(); + } + } + return; + } if (!config.showDeathHintArrow() && hasDied()) { client.clearHintArrow(); @@ -267,32 +434,62 @@ public class DeathIndicatorPlugin extends Plugin private void onGameStateChanged(GameStateChanged event) { - if (!hasDied()) + switch (event.getGameState()) { - return; - } - - if (event.getGameState() == GameState.LOGGED_IN) - { - if (client.getWorld() == config.deathWorld()) - { - WorldPoint deathPoint = new WorldPoint(config.deathLocationX(), config.deathLocationY(), config.deathLocationPlane()); - - if (config.showDeathHintArrow()) + case LOADING: + clearBones(); + saveBones(); + break; + case LOGGED_IN: + if (config.permaBones()) { - client.setHintArrow(deathPoint); + initBones(); } - if (config.showDeathOnWorldMap()) + if (!hasDied()) + { + return; + } + + if (client.getWorld() == config.deathWorld()) + { + WorldPoint deathPoint = new WorldPoint(config.deathLocationX(), config.deathLocationY(), config.deathLocationPlane()); + + if (config.showDeathHintArrow()) + { + client.setHintArrow(deathPoint); + } + + if (config.showDeathOnWorldMap()) + { + worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); + worldMapPointManager.add(new DeathWorldMapPoint(deathPoint, this)); + } + } + else { worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); - worldMapPointManager.add(new DeathWorldMapPoint(deathPoint, this)); } - } - else + break; + } + + } + + private void onItemDespawn(ItemDespawned event) + { + if (event.getItem().getId() == HIJACKED_ITEMID) + { + List list = bones.get(event.getTile().getWorldLocation()); + if (list == null) { - worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); + return; } + if (list.size() <= despawnIdx) + { + despawnIdx = 0; + } + Bone bone = list.get(despawnIdx++); + bone.addToScene(client.getScene()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java b/runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java index 647a411cdf..29e7d7b93f 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java +++ b/runelite-client/src/main/java/net/runelite/client/util/MiscUtils.java @@ -1,6 +1,8 @@ package net.runelite.client.util; import java.awt.Polygon; +import java.time.Duration; +import java.time.temporal.ChronoUnit; import net.runelite.api.Client; import net.runelite.api.Player; import net.runelite.api.WorldType; @@ -16,6 +18,17 @@ public class MiscUtils private static final Polygon abovePoly = new Polygon(abovePointsX, abovePointsY, abovePointsX.length); private static final Polygon belowPoly = new Polygon(belowPointsX, belowPointsY, belowPointsX.length); + private static final ChronoUnit[] ORDERED_CHRONOS = new ChronoUnit[] + { + ChronoUnit.YEARS, + ChronoUnit.MONTHS, + ChronoUnit.WEEKS, + ChronoUnit.DAYS, + ChronoUnit.HOURS, + ChronoUnit.MINUTES, + ChronoUnit.SECONDS + }; + //test replacement so private for now private static boolean inWildy(WorldPoint point) { @@ -86,4 +99,75 @@ public class MiscUtils //return getWildernessLevelFrom(client, localPlayer.getWorldLocation()) > 0; } + + public static String formatTimeAgo(Duration dur) + { + long dA = 0, dB = 0, rm; + ChronoUnit cA = null, cB = null; + for (int i = 0; i < ORDERED_CHRONOS.length; i++) + { + cA = ORDERED_CHRONOS[i]; + dA = dur.getSeconds() / cA.getDuration().getSeconds(); + rm = dur.getSeconds() % cA.getDuration().getSeconds(); + if (dA <= 0) + { + cA = null; + continue; + } + + if (i + 1 < ORDERED_CHRONOS.length) + { + cB = ORDERED_CHRONOS[i + 1]; + dB = rm / cB.getDuration().getSeconds(); + + if (dB <= 0) + { + cB = null; + } + } + + break; + } + + if (cA == null) + { + return "just now."; + } + + String str = formatUnit(cA, dA); + + if (cB != null) + { + str += " and " + formatUnit(cB, dB); + } + + return str + " ago."; + } + + private static String formatUnit(ChronoUnit chrono, long val) + { + boolean multiple = val != 1; + String str; + if (multiple) + { + str = val + " "; + } + else + { + str = "a" + (chrono == ChronoUnit.HOURS ? "n " : " "); + } + str += chrono.name().toLowerCase(); + if (!multiple) + { + if (str.charAt(str.length() - 1) == 's') + { + str = str.substring(0, str.length() - 1); + } + } + else if (str.charAt(str.length() - 1) != 's') + { + str += "s"; + } + return str; + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java index 69d0a0cf27..a5f5ac535f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemDefinitionMixin.java @@ -9,6 +9,7 @@ import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSItemDefinition; +import net.runelite.rs.api.RSModel; @Mixin(RSItemDefinition.class) public abstract class RSItemDefinitionMixin implements RSItemDefinition @@ -21,6 +22,16 @@ public abstract class RSItemDefinitionMixin implements RSItemDefinition @Inject private int shiftClickActionIndex = DEFAULT_CUSTOM_SHIFT_CLICK_INDEX; + @Inject + private int modelOverride = -1; + + @Override + @Inject + public void setModelOverride(int id) + { + modelOverride = id; + } + @Inject RSItemDefinitionMixin() { @@ -64,4 +75,18 @@ public abstract class RSItemDefinitionMixin implements RSItemDefinition event.setItemDefinition(this); client.getCallbacks().post(PostItemDefinition.class, event); } + + @Copy("getModel") + public abstract RSModel rs$getModel(int quantity); + + @Replace("getModel") + public RSModel getModel(int quantity) + { + if (modelOverride == -1) + { + return rs$getModel(quantity); + } + + return client.getItemDefinition(modelOverride).getModel(quantity); + } } 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 f723e632f1..656e86b4cc 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -29,6 +29,7 @@ import net.runelite.api.Perspective; import net.runelite.api.TileModel; import net.runelite.api.TilePaint; import net.runelite.api.Tile; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.hooks.DrawCallbacks; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; @@ -38,6 +39,8 @@ import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSBoundaryObject; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSFloorDecoration; +import net.runelite.rs.api.RSNodeDeque; +import net.runelite.rs.api.RSTileItem; import net.runelite.rs.api.RSTileItemPile; import net.runelite.rs.api.RSScene; import net.runelite.rs.api.RSTile; @@ -716,4 +719,72 @@ public abstract class RSSceneMixin implements RSScene client.setSelectedSceneTileX(targetX); client.setSelectedSceneTileY(targetY); } + + @Override + @Inject + public void addItem(int id, int quantity, WorldPoint point) + { + final int sceneX = point.getX() - client.getBaseX(); + final int sceneY = point.getY() - client.getBaseY(); + final int plane = point.getPlane(); + + if (sceneX < 0 || sceneY < 0 || sceneX >= 104 || sceneY >= 104) + { + return; + } + + RSTileItem item = client.newTileItem(); + item.setId(id); + item.setQuantity(quantity); + RSNodeDeque[][][] groundItems = client.getGroundItemDeque(); + + if (groundItems[plane][sceneX][sceneY] == null) + { + groundItems[plane][sceneX][sceneY] = client.newNodeDeque(); + } + + groundItems[plane][sceneX][sceneY].addFirst(item); + + if (plane == client.getPlane()) + { + client.updateItemPile(sceneX, sceneY); + } + } + + @Override + @Inject + public void removeItem(int id, int quantity, WorldPoint point) + { + final int sceneX = point.getX() - client.getBaseX(); + final int sceneY = point.getY() - client.getBaseY(); + final int plane = point.getPlane(); + + if (sceneX < 0 || sceneY < 0 || sceneX >= 104 || sceneY >= 104) + { + return; + } + + RSNodeDeque items = client.getGroundItemDeque()[plane][sceneX][sceneY]; + + if (items == null) + { + return; + } + + for (RSTileItem item = (RSTileItem) items.last(); item != null; item = (RSTileItem) items.previous()) + { + if (item.getId() == id && quantity == 1) + { + item.unlink(); + break; + } + } + + if (items.last() == null) + { + client.getGroundItemDeque()[plane][sceneX][sceneY] = null; + } + + client.updateItemPile(sceneX, sceneY); + } } 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 5ecdfc616b..b1561e7439 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 @@ -1100,4 +1100,13 @@ public interface RSClient extends RSGameShell, Client */ @Import("Login_promptCredentials") void promptCredentials(boolean clearPass); -} \ No newline at end of file + + @Construct + RSTileItem newTileItem(); + + @Construct + RSNodeDeque newNodeDeque(); + + @Import("updateItemPile") + void updateItemPile(int localX, int localY); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java index 609ef5eb45..d7551e9944 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSItemDefinition.java @@ -9,6 +9,10 @@ public interface RSItemDefinition extends ItemDefinition @Override String getName(); + @Import("name") + @Override + void setName(String name); + @Import("id") @Override int getId(); @@ -41,6 +45,10 @@ public interface RSItemDefinition extends ItemDefinition @Override boolean isTradeable(); + @Import("isTradable") + @Override + void setTradeable(boolean yes); + /** * You probably want {@link #isStackable} *

@@ -60,4 +68,7 @@ public interface RSItemDefinition extends ItemDefinition @Import("getShiftClickIndex") @Override int getShiftClickActionIndex(); + + @Import("getModel") + RSModel getModel(int quantity); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java index c903f20f8c..d1686fa635 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeDeque.java @@ -9,4 +9,13 @@ public interface RSNodeDeque @Import("sentinel") RSNode getHead(); + + @Import("last") + RSNode last(); + + @Import("previous") + RSNode previous(); + + @Import("addFirst") + void addFirst(RSNode val); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java index 0b2705397d..73e306a680 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java @@ -36,4 +36,7 @@ public interface RSScene extends Scene @Import("minPlane") int getMinLevel(); + + @Import("newGroundItemPile") + void newGroundItemPile(int plane, int x, int y, int hash, RSEntity var5, long var6, RSEntity var7, RSEntity var8); } From 423d16fa8e9dc9ff9933b71fe3d53117391a5879 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 26 Oct 2019 21:58:50 -0400 Subject: [PATCH 090/185] http-service: make mongo database configurable --- .../net/runelite/http/service/config/ConfigService.java | 6 ++++-- http-service/src/main/resources/application.yaml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java b/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java index bbe8557d88..727620570f 100644 --- a/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java +++ b/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java @@ -51,6 +51,7 @@ import net.runelite.http.api.config.ConfigEntry; import net.runelite.http.api.config.Configuration; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service @@ -66,11 +67,12 @@ public class ConfigService @Autowired public ConfigService( - MongoClient mongoClient + MongoClient mongoClient, + @Value("${mongo.database}") String databaseName ) { - MongoDatabase database = mongoClient.getDatabase("config"); + MongoDatabase database = mongoClient.getDatabase(databaseName); MongoCollection collection = database.getCollection("config"); this.mongoCollection = collection; diff --git a/http-service/src/main/resources/application.yaml b/http-service/src/main/resources/application.yaml index ce902b76cb..f5e1a799d9 100644 --- a/http-service/src/main/resources/application.yaml +++ b/http-service/src/main/resources/application.yaml @@ -32,6 +32,7 @@ redis: mongo: jndiName: java:comp/env/mongodb/runelite + database: runelite # Twitter client for feed runelite: From b859cec91a5e4bacc23af2087d94f5a779c65bdc Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sun, 27 Oct 2019 19:35:25 +0100 Subject: [PATCH 091/185] gradle: kts dsl (#1845) * gradle: kts dsl * deob: Fix tests * gradle: Convert fernflower plugin to kotlin --- build.gradle | 207 ------------------ build.gradle.kts | 156 +++++++++++++ buildSrc/build.gradle | 7 - buildSrc/build.gradle.kts | 44 ++++ .../src/main/groovy/FernflowerPlugin.groovy | 16 -- .../src/main/groovy/FernflowerTask.groovy | 32 --- buildSrc/src/main/kotlin/Dependencies.kt | 193 ++++++++++++++++ buildSrc/src/main/kotlin/FernflowerPlugin.kt | 17 ++ buildSrc/src/main/kotlin/FernflowerTask.kt | 30 +++ .../gradle-plugins/fernflower.properties | 2 +- cache-client/build.gradle | 28 --- cache-client/cache-client.gradle.kts | 49 +++++ .../runelite/cache/client/CacheClient.java | 4 +- cache-updater/build.gradle | 15 -- cache-updater/cache-updater.gradle.kts | 40 ++++ cache/build.gradle | 36 --- cache/cache.gradle.kts | 69 ++++++ deobfuscator/build.gradle | 117 ---------- deobfuscator/deobfuscator.gradle.kts | 80 +++++++ http-api/build.gradle | 33 --- http-api/http-api.gradle.kts | 65 ++++++ .../src/main/resources/runelite.properties | 3 +- http-service-openosrs/build.gradle | 26 --- .../http-service-openosrs.gradle.kts | 53 +++++ http-service/build.gradle | 37 ---- http-service/http-service.gradle.kts | 64 ++++++ injected-client/injected-client.gradle.kts | 55 +++++ injector-plugin/build.gradle | 63 ------ injector-plugin/injector-plugin.gradle.kts | 83 +++++++ protocol-api/build.gradle | 13 -- protocol-api/protocol-api.gradle.kts | 38 ++++ protocol/build.gradle | 16 -- protocol/protocol.gradle.kts | 41 ++++ runelite-api/build.gradle | 14 -- runelite-api/runelite-api.gradle.kts | 39 ++++ runelite-client/build.gradle | 118 ---------- runelite-client/runelite-client.gradle.kts | 153 +++++++++++++ runelite-mixins/build.gradle | 13 -- runelite-mixins/runelite-mixins.gradle.kts | 38 ++++ runelite-plugin-archetype/build.gradle | 1 - .../runelite-plugin-archetype.gradle.kts | 26 +++ runelite-script-assembler-plugin/build.gradle | 35 --- ...unelite-script-assembler-plugin.gradle.kts | 66 ++++++ runescape-api/build.gradle | 6 - runescape-api/runescape-api.gradle.kts | 31 +++ runescape-client/build.gradle | 14 -- .../runescape-client.gradle.kts | 34 ++- settings.gradle | 41 ---- settings.gradle.kts | 57 +++++ wiki-scraper/build.gradle | 57 ----- .../src/main/java/net/runelite/data/App.java | 29 ++- wiki-scraper/wiki-scraper.gradle.kts | 69 ++++++ 52 files changed, 1598 insertions(+), 975 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/src/main/groovy/FernflowerPlugin.groovy delete mode 100644 buildSrc/src/main/groovy/FernflowerTask.groovy create mode 100644 buildSrc/src/main/kotlin/Dependencies.kt create mode 100644 buildSrc/src/main/kotlin/FernflowerPlugin.kt create mode 100644 buildSrc/src/main/kotlin/FernflowerTask.kt delete mode 100644 cache-client/build.gradle create mode 100644 cache-client/cache-client.gradle.kts delete mode 100644 cache-updater/build.gradle create mode 100644 cache-updater/cache-updater.gradle.kts delete mode 100644 cache/build.gradle create mode 100644 cache/cache.gradle.kts delete mode 100644 deobfuscator/build.gradle create mode 100644 deobfuscator/deobfuscator.gradle.kts delete mode 100644 http-api/build.gradle create mode 100644 http-api/http-api.gradle.kts delete mode 100644 http-service-openosrs/build.gradle create mode 100644 http-service-openosrs/http-service-openosrs.gradle.kts delete mode 100644 http-service/build.gradle create mode 100644 http-service/http-service.gradle.kts create mode 100644 injected-client/injected-client.gradle.kts delete mode 100644 injector-plugin/build.gradle create mode 100644 injector-plugin/injector-plugin.gradle.kts delete mode 100644 protocol-api/build.gradle create mode 100644 protocol-api/protocol-api.gradle.kts delete mode 100644 protocol/build.gradle create mode 100644 protocol/protocol.gradle.kts delete mode 100644 runelite-api/build.gradle create mode 100644 runelite-api/runelite-api.gradle.kts delete mode 100644 runelite-client/build.gradle create mode 100644 runelite-client/runelite-client.gradle.kts delete mode 100644 runelite-mixins/build.gradle create mode 100644 runelite-mixins/runelite-mixins.gradle.kts delete mode 100644 runelite-plugin-archetype/build.gradle create mode 100644 runelite-plugin-archetype/runelite-plugin-archetype.gradle.kts delete mode 100644 runelite-script-assembler-plugin/build.gradle create mode 100644 runelite-script-assembler-plugin/runelite-script-assembler-plugin.gradle.kts delete mode 100644 runescape-api/build.gradle create mode 100644 runescape-api/runescape-api.gradle.kts delete mode 100644 runescape-client/build.gradle rename injected-client/build.gradle => runescape-client/runescape-client.gradle.kts (70%) delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts delete mode 100644 wiki-scraper/build.gradle create mode 100644 wiki-scraper/wiki-scraper.gradle.kts diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 94aa44e5d5..0000000000 --- a/build.gradle +++ /dev/null @@ -1,207 +0,0 @@ -import org.ajoberstar.grgit.Grgit - -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "org.ajoberstar.grgit:grgit-gradle:3.1.1" - } -} - -plugins { - id 'com.adarshr.test-logger' version '1.7.0' apply false - id "com.github.ben-manes.versions" version "0.22.0" - id "com.gradle.build-scan" version "2.4" - id 'se.patrikerdes.use-latest-versions' version '0.2.8' -} - -apply plugin: 'application' - -ext { - grgit = Grgit.open(dir: "${rootProject.projectDir}") - localGitCommit = grgit.head().id - localGitCommitShort = grgit.head().getAbbreviatedId(7) - localGitDirty = !grgit.status().clean - - // sets the minimum launcher version that is output for the bootstrapper - launcherVersion = '2.0.3' - - // Dependencies versions - annotations = '17.0.0' - antlr = '4.7.2' - apacheCommonsCompress = '1.19' - apacheCommonsCsv = '1.7' - apacheCommonsText = '1.8' - asm = '7.2' - commonsCli = '1.4' - discord = '1.1' - fernflower = '07082019' - findbugs = '3.0.2' - gson = '2.8.6' - guava = '28.1-jre' - guice = '4.2.2' - h2 = '1.4.200' - hamcrest = '2.2' - httpcore = '4.4.12' - httpmime = '4.5.10' - javassist = '3.26.0-GA' - javax = '1.3.2' - javaxInject = '1' - jbsdiff = '1.0' - jclCore = '2.8' - jedis = '3.1.0' - jfoenix = '9.0.9' - jna = '5.4.0' - jogamp = '2.3.2' - jopt = '5.0.4' - jooq = '3.12.2' - junit = '4.12' - jupiter = '5.6.0-M1' - logback = '1.2.3' - lombok = '1.18.10' - mapstruct = '1.3.1.Final' - mariadbJdbc = '2.5.1' - mavenPluginAnnotations = '3.6.0' - mavenPluginApi = '3.6.2' - minio = '6.0.11' - mockito = '3.1.0' - mongodbDriverSync = '3.11.1' - mysqlConnectorJava = '8.0.18' - netty = '4.1.42.Final' - okhttp3 = '4.2.2' - orangeExtensions = '1.0' - petitparser = '2.2.0' - plexus = '3.3.0' - rxjava = '2.2.13' - rxrelay = '2.1.1' - scribejava = '6.9.0' - sisu = '0.3.3' - slf4j = '1.7.28' - springJdbc = '5.2.0.RELEASE' - springboot = '2.2.0.RELEASE' - sql2o = '1.6.0' - substance = '8.0.02' - trident = '1.5.00' -} - -allprojects { - apply plugin: 'maven' - if (this.name != 'rs-client') apply plugin: 'checkstyle' - - group = 'com.openosrs' - version = '1.5.37-SNAPSHOT' - - ext { - rsversion = 184 - cacheversion = 165 - plusVersion = '2.1.8.0' - - gitCommit = localGitCommit - gitCommitShort = localGitCommitShort - gitDirty = localGitDirty - - - rootPath = rootDir.toString().replace('\\', '/') - injectedClassesPath = rootPath + "/injector-plugin/out/injected-client/" - } -} - -subprojects { - apply plugin: 'com.adarshr.test-logger' - apply plugin: 'java-library' - apply plugin: 'maven' - apply plugin: 'fernflower' - apply plugin: 'maven-publish' - - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - - tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' - } - - tasks.withType(GroovyCompile).configureEach { - options.incremental = true - } - - publishing { - repositories { - maven { - name = "runelite" - url = uri("https://maven.pkg.github.com/open-osrs/runelite") - credentials { - username = System.getProperty("gpr_user") - password = System.getProperty("gpr_key") - } - } - } - publications { - gpr(MavenPublication) { - from(components.java) - } - } - } - - repositories { - mavenLocal() - - maven { url "http://repo1.maven.org/maven2" } - maven { url "http://repo.runelite.net" } - maven { url "http://repo.maven.apache.org/maven2" } - maven { url "https://raw.githubusercontent.com/open-osrs/hosting/master" } - - if (System.getenv("NEXUS-URL") != null) { - maven { url System.getenv("NEXUS-URL") } - } - } - - checkstyle { - toolVersion = '6.4.1' - sourceSets = [sourceSets.main] - configFile = file("${rootDir}/checkstyle/checkstyle.xml") - configProperties = [ "suppressionFile" : file("${rootDir}/checkstyle/suppressions.xml")] - showViolations = true - ignoreFailures = false - maxWarnings = 0 - } - -} - - -wrapper { - gradleVersion = '5.6.2' - - doLast { - def optsEnvVar = "DEFAULT_JVM_OPTS" - scriptFile.write scriptFile.text.replace("$optsEnvVar='\"-Xmx64m\" \"-Xms64m\"'", "$optsEnvVar='\"-Xmx4g\" \"-Xms2g\" \"-Dfile.encoding=UTF-8\"'") - batchScript.write batchScript.text.replace("set $optsEnvVar=\"-Xmx64m\" \"-Xms64m\"", "set $optsEnvVar=\"-Xmx4g\" \"-Xms2g\" \"-Dfile.encoding=UTF-8\"") - } -} - -run { - classpath = childProjects.client.sourceSets.main.runtimeClasspath - mainClassName = "net.runelite.client.RuneLite" -} - -def isNonStable = { String version -> - def unstableKeyword = ['ALPHA', 'BETA', 'RC'].any { it -> version.toUpperCase().contains(it) } - - return unstableKeyword -} - -dependencyUpdates { - checkForGradleUpdate = false - - resolutionStrategy { - componentSelection { - all { - if (isNonStable(candidate.version)) { - reject() - } - } - } - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000000..4469cd42e7 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,156 @@ +/* + * 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. + */ + +import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask +import org.ajoberstar.grgit.Grgit + +buildscript { + repositories { + maven(url = "https://plugins.gradle.org/m2/") + } + dependencies { + classpath(Plugins.grgitPlugin) + classpath(Plugins.versionsPlugin) + } +} + +plugins { + id(Plugins.testLogger.first) version Plugins.testLogger.second apply false + id(Plugins.versions.first) version Plugins.versions.second + id(Plugins.buildScan.first) version Plugins.buildScan.second + id(Plugins.latestVersion.first) version Plugins.latestVersion.second + id(Plugins.grgit.first) version Plugins.grgit.second + + application +} + +val grgit = Grgit.open(mapOf("dir" to rootProject.projectDir.absolutePath)) +val localGitCommit = grgit.head().id +val localGitCommitShort = grgit.head().getAbbreviatedId(7) + +fun isNonStable(version: String): Boolean { + return listOf("ALPHA", "BETA", "RC").any { + version.toUpperCase().contains(it) + } +} + +allprojects { + apply() + + group = "com.openosrs" + version = ProjectVersions.rlVersion + + project.extra["gitCommit"] = localGitCommit + project.extra["gitCommitShort"] = localGitCommitShort + + project.extra["rootPath"] = rootDir.toString().replace("\\", "/") + project.extra["injectedClassesPath"] = "${rootDir}/injector-plugin/out/injected-client/" +} + +subprojects { + apply() + apply() + apply() + apply(plugin = Plugins.testLogger.first) + apply() + + if (this.name != "rs-client") apply(plugin = "checkstyle") + + repositories { + mavenLocal() + + maven(url = "http://repo1.maven.org/maven2") + maven(url = "http://repo.runelite.net") + maven(url = "http://repo.maven.apache.org/maven2") + maven(url = "https://raw.githubusercontent.com/open-osrs/hosting/master") + + if (System.getenv("NEXUS-URL") != null) { + maven(url = System.getenv("NEXUS-URL")) + } + } + + configure { + sourceSets = setOf(project.sourceSets.main.get()) + configFile = file("${rootDir}/checkstyle/checkstyle.xml") + configProperties = mapOf("suppressionFile" to file("${rootDir}/checkstyle/suppressions.xml")) + maxWarnings = 0 + toolVersion = "6.4.1" + isShowViolations = true + isIgnoreFailures = false + } + + configure { + repositories { + maven { + name = "runelite" + url = uri("https://maven.pkg.github.com/open-osrs/runelite") + credentials { + username = System.getProperty("gpr_user") + password = System.getProperty("gpr_key") + } + } + } + publications { + register("gpr", MavenPublication::class) { + from(components["java"]) + } + } + } + + tasks { + java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + withType { + options.encoding = "UTF-8" + } + } +} + +application { + mainClassName = "net.runelite.client.RuneLite" +} + +tasks { + named("run") { + classpath = project(":runelite-client").sourceSets.main.get().runtimeClasspath + } + + named("dependencyUpdates") { + checkForGradleUpdate = false + + resolutionStrategy { + componentSelection { + all { + if (candidate.displayName.contains("fernflower") || isNonStable(candidate.version)) { + reject("Non stable") + } + } + } + } + } +} \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle deleted file mode 100644 index 313b14ce5c..0000000000 --- a/buildSrc/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -repositories { - maven { url "https://raw.githubusercontent.com/open-osrs/hosting/master" } -} -dependencies { - compile localGroovy() - implementation group: 'net.runelite', name: 'fernflower', version: '07082019' -} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000000..e07fbc3103 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,44 @@ +/* + * 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. + */ + +plugins { + `kotlin-dsl` + groovy +} + +repositories { + mavenCentral() + maven(url = "https://raw.githubusercontent.com/open-osrs/hosting/master") +} + +dependencies { + implementation(gradleApi()) + implementation(localGroovy()) + implementation(group = "net.runelite", name = "fernflower", version = "07082019") +} + +kotlinDslPluginOptions { + experimentalWarning.set(false) +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/FernflowerPlugin.groovy b/buildSrc/src/main/groovy/FernflowerPlugin.groovy deleted file mode 100644 index 062adced78..0000000000 --- a/buildSrc/src/main/groovy/FernflowerPlugin.groovy +++ /dev/null @@ -1,16 +0,0 @@ -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.StopExecutionException - -class FernflowerPlugin implements Plugin { - void apply(Project project) { - project.task('decompile', type: FernflowerTask) { - it.dependsOn(project.tasks.jar) - it.doFirst { - if (!project.tasks.jar.didWork) { - throw new StopExecutionException() - } - } - } - } -} diff --git a/buildSrc/src/main/groovy/FernflowerTask.groovy b/buildSrc/src/main/groovy/FernflowerTask.groovy deleted file mode 100644 index 49e46b5639..0000000000 --- a/buildSrc/src/main/groovy/FernflowerTask.groovy +++ /dev/null @@ -1,32 +0,0 @@ -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler - -class FernflowerTask extends DefaultTask { - List extraArgs - String inputJar - String outputDir - - @InputFile - File getInputJar() { - project.file(inputJar ?: project.buildDir.toString() + '/libs/' + project.getName() + '-' + project.version + '.jar') - } - - @OutputDirectory - File getOutputDir() { - project.file(outputDir ?: project.buildDir.toString() + '/decompiled-sources') - } - - @TaskAction - void decompile() { - getOutputDir().mkdirs() - def args = [getInputJar().toString(), getOutputDir().toString()] - if (extraArgs) { - args.addAll(extraArgs) - } - - ConsoleDecompiler.main(args as String[]) - } -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt new file mode 100644 index 0000000000..fac83295bf --- /dev/null +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -0,0 +1,193 @@ +/* + * 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. + */ + +const val kotlinVersion = "1.3.50" + +object ProjectVersions { + const val launcherVersion = "2.0.3" + const val rlVersion = "1.5.37-SNAPSHOT" + + const val openosrsVersion = "2.1.8.0" + + const val rsversion = 184 + const val cacheversion = 165 +} + +object Plugins { + val grgitPlugin = "org.ajoberstar:grgit:2.3.0" + val versionsPlugin = "com.github.ben-manes:gradle-versions-plugin:0.27.0" + + val testLogger = Pair("com.adarshr.test-logger", "2.0.0") + val versions = Pair("com.github.ben-manes.versions", "0.27.0") + val buildScan = Pair("com.gradle.build-scan", "3.0") + val latestVersion = Pair("se.patrikerdes.use-latest-versions", "0.2.12") + val grgit = Pair("org.ajoberstar.grgit", "4.0.0-rc.1") + val jarTest = Pair("com.github.hauner.jarTest", "1.0.1") + val shadow = Pair("com.github.johnrengelman.shadow", "5.1.0") +} + +object Libraries { + private object Versions { + const val annotations = "17.0.0" + const val antlr = "4.7.2" + const val apacheCommonsCompress = "1.19" + const val apacheCommonsCsv = "1.7" + const val apacheCommonsText = "1.8" + const val asm = "7.2" + const val commonsCli = "1.4" + const val discord = "1.1" + const val fernflower = "07082019" + const val findbugs = "3.0.2" + const val gson = "2.8.6" + const val guava = "28.1-jre" + const val guice = "4.2.2" + const val h2 = "1.4.200" + const val hamcrest = "2.2" + const val httpcore = "4.4.12" + const val httpmime = "4.5.10" + const val javassist = "3.26.0-GA" + const val javax = "1.3.2" + const val javaxInject = "1" + const val jbsdiff = "1.0" + const val jclCore = "2.8" + const val jedis = "3.1.0" + const val jna = "5.4.0" + const val jogamp = "2.3.2" + const val jopt = "5.0.4" + const val jooq = "3.12.2" + const val junit = "4.12" + const val jupiter = "5.6.0-M1" + const val logback = "1.2.3" + const val lombok = "1.18.10" + const val mapstruct = "1.3.1.Final" + const val mariadbJdbc = "2.5.1" + const val mavenPluginAnnotations = "3.6.0" + const val mavenPluginApi = "3.6.2" + const val minio = "6.0.11" + const val mockito = "3.1.0" + const val mongodbDriverSync = "3.11.1" + const val mysqlConnectorJava = "8.0.18" + const val naturalMouse = "2.0.2" + const val netty = "4.1.42.Final" + const val okhttp3 = "4.2.2" + const val orangeExtensions = "1.0" + const val petitparser = "2.2.0" + const val plexus = "3.3.0" + const val rxjava = "2.2.13" + const val rxrelay = "2.1.1" + const val scribejava = "6.9.0" + const val sisu = "0.3.3" + const val slf4j = "1.7.28" + const val springJdbc = "5.2.0.RELEASE" + const val springboot = "2.2.0.RELEASE" + const val sql2o = "1.6.0" + const val substance = "8.0.02" + const val trident = "1.5.00" + } + + const val annotations = "org.jetbrains:annotations:${Versions.annotations}" + const val antlr = "org.antlr:antlr4-runtime:${Versions.antlr}" + const val apacheCommonsCompress = "org.apache.commons:commons-compress:${Versions.apacheCommonsCompress}" + const val apacheCommonsCsv = "org.apache.commons:commons-csv:${Versions.apacheCommonsCsv}" + const val apacheCommonsText = "org.apache.commons:commons-text:${Versions.apacheCommonsText}" + const val asmAll = "org.ow2.asm:asm:${Versions.asm}" + const val asmUtil = "org.ow2.asm:asm-util:${Versions.asm}" + const val asmTree = "org.ow2.asm:asm-tree:${Versions.asm}" + const val commonsCli = "commons-cli:commons-cli:${Versions.commonsCli}" + const val discord = "net.runelite:discord:${Versions.discord}" + const val fernflower = "net.runelite:fernflower:${Versions.fernflower}" + const val findbugs = "com.google.code.findbugs:jsr305:${Versions.findbugs}" + const val gson = "com.google.code.gson:gson:${Versions.gson}" + const val guava = "com.google.guava:guava:${Versions.guava}" + const val guice = "com.google.inject:guice:${Versions.guice}:no_aop" + const val guiceGrapher = "com.google.inject.extensions:guice-grapher:${Versions.guice}" + const val guiceTestlib = "com.google.inject.extensions:guice-testlib:${Versions.guice}" + const val h2 = "com.h2database:h2:${Versions.h2}" + const val hamcrest = "org.hamcrest:hamcrest-library:${Versions.hamcrest}" + const val httpcore = "org.apache.httpcomponents:httpcore:${Versions.httpcore}" + const val httpmime = "org.apache.httpcomponents:httpmime:${Versions.httpmime}" + const val javassist = "org.javassist:javassist:${Versions.javassist}" + const val javax = "javax.annotation:javax.annotation-api:${Versions.javax}" + const val javaxInject = "javax.inject:javax.inject:${Versions.javaxInject}" + const val jbsdiff = "io.sigpipe:jbsdiff:${Versions.jbsdiff}" + const val jclCore = "org.xeustechnologies:jcl-core:${Versions.jclCore}" + const val jedis = "redis.clients:jedis:${Versions.jedis}" + const val jna = "net.java.dev.jna:jna:${Versions.jna}" + const val jnaPlatform = "net.java.dev.jna:jna-platform:${Versions.jna}" + const val jogampJogl = "org.jogamp.jogl:jogl-all:${Versions.jogamp}" + const val jogampGluegen = "org.jogamp.gluegen:gluegen-rt:${Versions.jogamp}" + const val jogampGluegenLinuxAmd64 = "org.jogamp.gluegen:gluegen-rt:${Versions.jogamp}:natives-linux-amd64" + const val jogampGluegenLinuxI586 = "org.jogamp.gluegen:gluegen-rt:${Versions.jogamp}:natives-linux-i586" + const val jogampGluegenWindowsAmd64 = "org.jogamp.gluegen:gluegen-rt:${Versions.jogamp}:natives-windows-amd64" + const val jogampGluegenWindowsI586 = "org.jogamp.gluegen:gluegen-rt:${Versions.jogamp}:natives-windows-i586" + const val jogampJoglLinuxAmd64 = "org.jogamp.jogl:jogl-all:${Versions.jogamp}:natives-linux-amd64" + const val jogampJoglLinuxI586 = "org.jogamp.jogl:jogl-all:${Versions.jogamp}:natives-linux-i586" + const val jogampJoglWindowsAmd64 = "org.jogamp.jogl:jogl-all:${Versions.jogamp}:natives-windows-amd64" + const val jogampJoglWindowsI586 = "org.jogamp.jogl:jogl-all:${Versions.jogamp}:natives-windows-i586" + const val jopt = "net.sf.jopt-simple:jopt-simple:${Versions.jopt}" + const val jooq = "org.jooq:jooq:${Versions.jooq}" + const val jooqCodegen = "org.jooq:jooq-codegen:${Versions.jooq}" + const val jooqMeta = "org.jooq:jooq-meta:${Versions.jooq}" + const val junit = "junit:junit:${Versions.junit}" + const val jupiter = "org.junit.jupiter:junit-jupiter-api:${Versions.jupiter}" + const val logback = "ch.qos.logback:logback-classic:${Versions.logback}" + const val lombok = "org.projectlombok:lombok:${Versions.lombok}" + const val mapstruct = "org.mapstruct:mapstruct-jdk8:${Versions.mapstruct}" + const val mapstructProcessor = "org.mapstruct:mapstruct-processor:${Versions.mapstruct}" + const val mariadbJdbc = "org.mariadb.jdbc:mariadb-java-client:${Versions.mariadbJdbc}" + const val mavenPluginAnnotations = "org.apache.maven.plugin-tools:maven-plugin-annotations:${Versions.mavenPluginAnnotations}" + const val mavenPluginApi = "org.apache.maven:maven-plugin-api:${Versions.mavenPluginApi}" + const val minio = "io.minio:minio:${Versions.minio}" + const val mockitoCore = "org.mockito:mockito-core:${Versions.mockito}" + const val mockitoInline = "org.mockito:mockito-inline:${Versions.mockito}" + const val mongodbDriverSync = "org.mongodb:mongodb-driver-sync:${Versions.mongodbDriverSync}" + const val mysqlConnectorJava = "mysql:mysql-connector-java:${Versions.mysqlConnectorJava}" + const val naturalMouse = "com.github.joonasvali.naturalmouse:naturalmouse:${Versions.naturalMouse}" + const val nettyAll = "io.netty:netty-all:${Versions.netty}" + const val nettyBuffer = "io.netty:netty-buffer:${Versions.netty}" + const val okhttp3 = "com.squareup.okhttp3:okhttp:${Versions.okhttp3}" + const val okhttp3Webserver = "com.squareup.okhttp3:mockwebserver:${Versions.okhttp3}" + const val orangeExtensions = "net.runelite:orange-extensions:${Versions.orangeExtensions}" + const val petitparser = "com.github.petitparser:java-petitparser:${Versions.petitparser}" + const val plexus = "org.codehaus.plexus:plexus-utils:${Versions.plexus}" + const val rxjava = "io.reactivex.rxjava2:rxjava:${Versions.rxjava}" + const val rxrelay = "com.jakewharton.rxrelay2:rxrelay:${Versions.rxrelay}" + const val scribejava = "com.github.scribejava:scribejava-apis:${Versions.scribejava}" + const val sisu = "org.eclipse.sisu:org.eclipse.sisu.inject:${Versions.sisu}" + const val slf4jApi = "org.slf4j:slf4j-api:${Versions.slf4j}" + const val slf4jNop = "org.slf4j:slf4j-nop:${Versions.slf4j}" + const val slf4jSimple = "org.slf4j:slf4j-simple:${Versions.slf4j}" + const val springbootDevtools = "org.springframework.boot:spring-boot-devtools:${Versions.springboot}" + const val springbootStarter = "org.springframework.boot:spring-boot-starter:${Versions.springboot}" + const val springbootStarterWeb = "org.springframework.boot:spring-boot-starter-web:${Versions.springboot}" + const val springbootStarterJdbc = "org.springframework.boot:spring-boot-starter-jdbc:${Versions.springboot}" + const val springbootStarterTest = "org.springframework.boot:spring-boot-starter-test:${Versions.springboot}" + const val springbootStarterTomcat = "org.springframework.boot:spring-boot-starter-tomcat:${Versions.springboot}" + const val springbootJdbc = "org.springframework:spring-jdbc:${Versions.springJdbc}" + const val sql2o = "org.sql2o:sql2o:${Versions.sql2o}" + const val substance = "net.runelite.pushingpixels:substance:${Versions.substance}" + const val trident = "net.runelite.pushingpixels:trident:${Versions.trident}" + const val vanilla = "net.runelite.rs:vanilla:${ProjectVersions.rsversion}" +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/FernflowerPlugin.kt b/buildSrc/src/main/kotlin/FernflowerPlugin.kt new file mode 100644 index 0000000000..36c5778d04 --- /dev/null +++ b/buildSrc/src/main/kotlin/FernflowerPlugin.kt @@ -0,0 +1,17 @@ +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.StopExecutionException + +class FernflowerPlugin : Plugin { + override fun apply(project: Project) { + project.tasks.create("decompile", FernflowerTask::class.java).run { + dependsOn(project.tasks.getByName("jar")) + + doFirst { + if (!project.tasks.getByName("jar").didWork) { + throw StopExecutionException() + } + } + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/FernflowerTask.kt b/buildSrc/src/main/kotlin/FernflowerTask.kt new file mode 100644 index 0000000000..3dbb2ba995 --- /dev/null +++ b/buildSrc/src/main/kotlin/FernflowerTask.kt @@ -0,0 +1,30 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.TaskAction +import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler +import java.io.File + +open class FernflowerTask: DefaultTask() { + + var extraArgs: List? = null + var inputJar: String? = null + var outputDir: String? = null + + fun getInputJar(): File { + return project.file(inputJar ?: project.buildDir.toString() + "/libs/" + project.name + '-' + project.version + ".jar") + } + + fun getOutputDir(): File { + return project.file(outputDir ?: project.buildDir.toString() + "/decompiled-sources") + } + + @TaskAction + fun decompile() { + getOutputDir().mkdirs() + val args = mutableListOf(getInputJar().toString(), getOutputDir().toString()) + if (extraArgs != null) { + args.addAll(extraArgs!!) + } + + ConsoleDecompiler.main(args.toTypedArray()) + } +} \ No newline at end of file diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties index 3d922df9d7..6b2628a4c7 100644 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties @@ -1 +1 @@ -implementation-class=FernflowerPlugin \ No newline at end of file +implementation-class=kt \ No newline at end of file diff --git a/cache-client/build.gradle b/cache-client/build.gradle deleted file mode 100644 index feed79e98e..0000000000 --- a/cache-client/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -description = 'Cache Client' - -dependencies { - api project(':cache') - api project(':protocol') - - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'io.netty', name: 'netty-all', version: netty - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4j - testImplementation project(path: ':cache', configuration: 'testArchives') -} - -task update { - dependsOn ":cache-client:build" - - doLast { - def path = sourceSets.main.runtimeClasspath - def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def cacheClient = loader.loadClass('net.runelite.cache.client.CacheClient') - - cacheClient.getCache(rsversion); - - loader.close() - } -} diff --git a/cache-client/cache-client.gradle.kts b/cache-client/cache-client.gradle.kts new file mode 100644 index 0000000000..8b96c87357 --- /dev/null +++ b/cache-client/cache-client.gradle.kts @@ -0,0 +1,49 @@ +/* + * 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. + */ + +description = "Cache Client" + +dependencies { + api(project(":cache")) + api(project(":protocol")) + + implementation(Libraries.guava) + implementation(Libraries.nettyAll) + implementation(Libraries.slf4jApi) + + testImplementation(Libraries.junit) + testImplementation(Libraries.slf4jSimple) + testImplementation(project(path = ":cache", configuration = "testArchives")) +} + +tasks { + register("download") { + dependsOn("copyVanilla") + + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.cache.client.CacheClient" + args(listOf(ProjectVersions.rsversion)) + } +} diff --git a/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java b/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java index a8afe8b82d..956905f539 100644 --- a/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java +++ b/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java @@ -85,7 +85,7 @@ public class CacheClient implements AutoCloseable private CompletableFuture handshakeFuture; private final Queue requests = new ArrayDeque<>(); - public static void getCache(int clientRevision) + public static void main(String[] args) { Path path = Paths.get(System.getProperty("user.home"), "jagexcache" + File.separator + "oldschool" + File.separator + "LIVE"); final File jagexcache = new File(String.valueOf(path)); @@ -95,7 +95,7 @@ public class CacheClient implements AutoCloseable try (Store store = new Store(jagexcache)) { store.load(); - CacheClient c = new CacheClient(store, clientRevision); + CacheClient c = new CacheClient(store, Integer.parseInt(args[0])); c.connect(); CompletableFuture handshake = c.handshake(); handshake.get(); diff --git a/cache-updater/build.gradle b/cache-updater/build.gradle deleted file mode 100644 index ec821898e7..0000000000 --- a/cache-updater/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -description = 'Cache Updater' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'io.minio', name: 'minio', version: minio - implementation group: 'mysql', name: 'mysql-connector-java', version: mysqlConnectorJava - implementation group: 'org.springframework.boot', name: 'spring-boot-devtools', version: springboot - implementation group: 'org.springframework.boot', name: 'spring-boot-starter', version: springboot - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: springboot - implementation group: 'org.sql2o', name: 'sql2o', version: sql2o - implementation project(':cache-client') -} diff --git a/cache-updater/cache-updater.gradle.kts b/cache-updater/cache-updater.gradle.kts new file mode 100644 index 0000000000..2007258401 --- /dev/null +++ b/cache-updater/cache-updater.gradle.kts @@ -0,0 +1,40 @@ +/* + * 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. + */ + +description = "Cache Updater" + +dependencies { + annotationProcessor(Libraries.lombok) + + compileOnly(Libraries.lombok) + + implementation(Libraries.minio) + implementation(Libraries.mysqlConnectorJava) + implementation(Libraries.springbootDevtools) + implementation(Libraries.springbootStarter) + implementation(Libraries.springbootStarterJdbc) + implementation(Libraries.sql2o) + implementation(project(":cache-client")) +} diff --git a/cache/build.gradle b/cache/build.gradle deleted file mode 100644 index 3221972040..0000000000 --- a/cache/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens - -plugins { - id "com.github.hauner.jarTest" version "1.0.1" -} - -description = 'Cache' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - api project(':http-api') - - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'commons-cli', name: 'commons-cli', version: commonsCli - implementation group: 'io.netty', name: 'netty-buffer', version: netty - implementation group: 'org.antlr', name: 'antlr4-runtime', version: antlr - implementation group: 'org.apache.commons', name: 'commons-compress', version: apacheCommonsCompress - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'net.runelite.rs', name: 'cache', version: cacheversion - testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4j -} - -processTestResources { - from file("src/test/resources/cache.properties"), { - filter(ReplaceTokens, tokens: [ - "rs.version": rsversion.toString(), - "cache.version": cacheversion.toString() - ]) - } -} diff --git a/cache/cache.gradle.kts b/cache/cache.gradle.kts new file mode 100644 index 0000000000..e85a59a7d8 --- /dev/null +++ b/cache/cache.gradle.kts @@ -0,0 +1,69 @@ +/* + * 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. + */ + +import org.apache.tools.ant.filters.ReplaceTokens + +plugins { + id(Plugins.jarTest.first) version Plugins.jarTest.second +} + +description = "Cache" + +dependencies { + annotationProcessor(Libraries.lombok) + + api(project(":http-api")) + + compileOnly(Libraries.lombok) + + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.commonsCli) + implementation(Libraries.nettyBuffer) + implementation(Libraries.antlr) + implementation(Libraries.apacheCommonsCompress) + implementation(Libraries.slf4jApi) + + testImplementation(Libraries.junit) + testImplementation(group = "net.runelite.rs", name = "cache", version = "${ProjectVersions.cacheversion}") + testImplementation(Libraries.slf4jSimple) +} + +tasks { + "processTestResources"(ProcessResources::class) { + val tokens = mapOf( + "rs.version" to ProjectVersions.rsversion.toString(), + "cache.version" to ProjectVersions.cacheversion.toString() + ) + + inputs.properties(tokens) + + from("src/test/resources") { + include("cache.properties") + + filter("tokens" to tokens) + } + } +} diff --git a/deobfuscator/build.gradle b/deobfuscator/build.gradle deleted file mode 100644 index 0d61c904d6..0000000000 --- a/deobfuscator/build.gradle +++ /dev/null @@ -1,117 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens -import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -import java.nio.file.Files -import java.nio.file.Paths -import java.util.zip.ZipFile - -plugins { - id "com.github.hauner.jarTest" version "1.0.1" -} - -description = 'Deobfuscator' - -def deobfuscatedJar = "${rootPath}/runescape-client/build/libs/rs-client-${project.version}.jar" - -def unzipFile(String file, String dest) -{ - def zipFile = new ZipFile(file) - - zipFile.entries().each { it -> - def path = Paths.get(dest + File.separator + it.name) - if (it.directory) - { - Files.createDirectories(path) - } - else - { - def parentDir = path.getParent() - if (!Files.exists(parentDir)) - { - Files.createDirectories(parentDir) - } - Files.copy(zipFile.getInputStream(it), path) - } - } -} - -configurations { - deobjars -} - -dependencies { - deobjars group: 'net.runelite.rs', name: 'vanilla', version: rsversion - deobjars project(':rs-client') - - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'net.runelite', name: 'fernflower', version: fernflower - implementation group: 'org.ow2.asm', name: 'asm', version: asm - implementation group: 'org.ow2.asm', name: 'asm-util', version: asm - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation project(':runelite-api') - implementation project(':runescape-api') - - runtime group: 'org.slf4j', name: 'slf4j-simple', version: slf4j - - testImplementation configurations.deobjars.dependencies - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'org.mockito', name: 'mockito-core', version: mockito -} - -processResources { - from file("src/main/resources/deob.properties"), { - filter(ReplaceTokens, tokens: [ - "rs.version": rsversion.toString(), - "vanilla.jar": configurations.deobjars.find {it.name.startsWith("vanilla")}.toString().replace('\\', "/"), - "rs.client": configurations.deobjars.find {it.name.startsWith("rs-client")}.toString().replace('\\', "/") - ]) - } -} -processTestResources { - from file("src/test/resources/deob-test.properties"), { - filter(ReplaceTokens, tokens: [ - "rs.client": configurations.deobjars.find {it.name.startsWith("rs-client")}.toString().replace('\\', "/"), - "rs.version": rsversion.toString(), - "vanilla.jar": configurations.deobjars.find {it.name.startsWith("vanilla")}.toString().replace('\\', "/") - ]) - } -} - -task gamepackUpdate { - dependsOn ":deobfuscator:build" - dependsOn ":rs-client:build" - - doLast { - def path = sourceSets.main.runtimeClasspath - def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def downloader = loader.loadClass('net.runelite.gamepack.Downloader') - def clientVersion = loader.loadClass('net.runelite.deob.clientver.ClientVersionMain') - def deob = loader.loadClass('net.runelite.deob.Deob') - def mappings = loader.loadClass('net.runelite.deob.updater.UpdateMappings') - - String gamepack = downloader.gamepack() - int version = clientVersion.version(gamepack) - - String gamepackVersion = gamepack.replace("gamepack.jar", "gamepack-" + version + ".jar") - String gamepackDeob = gamepack.replace("gamepack.jar", "gamepack-" + version + "-deob.jar") - String gamepackMappings = gamepack.replace("gamepack.jar", "gamepack-" + version + "-updated-mappings.jar") - String gamepackMappingsDecomp = gamepackMappings.replace(".jar", "-decomp") - String gamepackMappingsFern = gamepackMappingsDecomp + File.separator + gamepackMappings.split("/gamepack/")[1] - - if (version == -1 || version == rsversion) - { - return - } - - deob.main(gamepackVersion, gamepackDeob) - mappings.main(deobfuscatedJar, gamepackDeob, gamepackMappings) - - new File(gamepackMappingsDecomp).mkdirs() - ConsoleDecompiler.main(gamepackMappings, gamepackMappingsDecomp) - - unzipFile(gamepackMappingsFern, gamepackMappingsDecomp) - new File(gamepackMappingsFern).delete() - - loader.close() - } -} diff --git a/deobfuscator/deobfuscator.gradle.kts b/deobfuscator/deobfuscator.gradle.kts new file mode 100644 index 0000000000..c818fa5808 --- /dev/null +++ b/deobfuscator/deobfuscator.gradle.kts @@ -0,0 +1,80 @@ +/* + * 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. + */ + +import org.apache.tools.ant.filters.ReplaceTokens + +plugins { + id(Plugins.jarTest.first) version Plugins.jarTest.second +} + +val deobjars = configurations.create("deobjars") + +dependencies { + deobjars(group = "net.runelite.rs", name = "vanilla", version = ProjectVersions.rsversion.toString()) + deobjars(project(":runescape-client")) + + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.fernflower) + implementation(Libraries.asmAll) + implementation(Libraries.asmUtil) + implementation(Libraries.slf4jApi) + implementation(project(":runelite-api")) + implementation(project(":runescape-api")) + + runtime(Libraries.slf4jSimple) + + testImplementation(deobjars) + testImplementation(Libraries.junit) + testImplementation(Libraries.mockitoCore) +} + +tasks { + val tokens = mapOf( + "rs.version" to ProjectVersions.rsversion.toString(), + "vanilla.jar" to deobjars.find { it.name.startsWith("vanilla") }.toString().replace("\\", "/"), + "rs.client" to deobjars.find { it.name.startsWith("runescape-client") }.toString().replace("\\", "/") + ) + + "processResources"(ProcessResources::class) { + inputs.properties(tokens) + + from("src/main/resources") { + include("deob.properties") + + filter("tokens" to tokens) + } + } + + "processTestResources"(ProcessResources::class) { + inputs.properties(tokens) + + from("src/test/resources") { + include("deob-test.properties") + + filter("tokens" to tokens) + } + } +} diff --git a/http-api/build.gradle b/http-api/build.gradle deleted file mode 100644 index a191f21f61..0000000000 --- a/http-api/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens - -description = 'Web API' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - compileOnly group: 'javax.inject', name: 'javax.inject', version: javaxInject - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp3 - implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: rxjava - implementation group: 'org.apache.commons', name: 'commons-csv', version: apacheCommonsCsv - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation project(':runelite-api') - - testImplementation group: 'com.squareup.okhttp3', name: 'mockwebserver', version: okhttp3 - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4j -} - -processResources { - from file("src/main/resources/runelite.properties"), { - filter(ReplaceTokens, tokens: [ - "projectver": project.version, - "rsver": rsversion.toString(), - "gitcommit": gitCommitShort, - "gitdirty": gitDirty.toString() - ]) - } -} diff --git a/http-api/http-api.gradle.kts b/http-api/http-api.gradle.kts new file mode 100644 index 0000000000..9f5dfac4af --- /dev/null +++ b/http-api/http-api.gradle.kts @@ -0,0 +1,65 @@ +/* + * 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. + */ + +import org.apache.tools.ant.filters.ReplaceTokens + +description = "Web API" + +dependencies { + annotationProcessor(Libraries.lombok) + + compileOnly(Libraries.javaxInject) + compileOnly(Libraries.lombok) + + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.okhttp3) + implementation(Libraries.rxjava) + implementation(Libraries.apacheCommonsCsv) + implementation(Libraries.slf4jApi) + implementation(project(":runelite-api")) + + testImplementation(Libraries.okhttp3Webserver) + testImplementation(Libraries.junit) + testImplementation(Libraries.slf4jSimple) +} + +tasks { + "processResources"(ProcessResources::class) { + val tokens = mapOf( + "projectver" to ProjectVersions.rlVersion, + "rsver" to ProjectVersions.rsversion.toString(), + "gitcommit" to project.extra["gitCommit"] + ) + + inputs.properties(tokens) + + from("src/main/resources") { + include("runelite.properties") + + filter("tokens" to tokens) + } + } +} diff --git a/http-api/src/main/resources/runelite.properties b/http-api/src/main/resources/runelite.properties index 7eb618db7a..9464b52906 100644 --- a/http-api/src/main/resources/runelite.properties +++ b/http-api/src/main/resources/runelite.properties @@ -1,4 +1,3 @@ runelite.version=@projectver@ rs.version=@rsver@ -runelite.commit=@gitcommit@ -runelite.dirty=@gitdirty@ \ No newline at end of file +runelite.commit=@gitcommit@ \ No newline at end of file diff --git a/http-service-openosrs/build.gradle b/http-service-openosrs/build.gradle deleted file mode 100644 index 1aee171338..0000000000 --- a/http-service-openosrs/build.gradle +++ /dev/null @@ -1,26 +0,0 @@ -apply plugin: 'war' - -description = 'Web Service OpenOSRS' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - api project(':cache') - api project(':http-api') - api project(':http-service') - - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp3 - implementation group: 'org.springframework', name: 'spring-jdbc', version: springJdbc - implementation group: 'org.springframework.boot', name: 'spring-boot-devtools', version: springboot - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springboot - implementation group: 'org.sql2o', name: 'sql2o', version: sql2o - implementation(group: 'redis.clients', name: 'jedis', version: jedis) { - exclude(module: 'commons-pool2') - } - - providedCompile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: mariadbJdbc - providedCompile group: 'org.projectlombok', name: 'lombok', version: lombok - providedCompile group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: springboot -} diff --git a/http-service-openosrs/http-service-openosrs.gradle.kts b/http-service-openosrs/http-service-openosrs.gradle.kts new file mode 100644 index 0000000000..6bf4f040ac --- /dev/null +++ b/http-service-openosrs/http-service-openosrs.gradle.kts @@ -0,0 +1,53 @@ +/* + * 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. + */ + +plugins { + war +} + +description = "Web Service OpenOSRS" + +dependencies { + annotationProcessor(Libraries.lombok) + + api(project(":cache")) + api(project(":http-api")) + api(project(":http-service")) + + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.okhttp3) + implementation(Libraries.springbootJdbc) + implementation(Libraries.springbootDevtools) + implementation(Libraries.springbootStarterWeb) + implementation(Libraries.sql2o) + implementation(Libraries.jedis) { + exclude(module = "commons-pool2") + } + + providedCompile(Libraries.mariadbJdbc) + providedCompile(Libraries.lombok) + providedCompile(Libraries.springbootStarterTomcat) +} diff --git a/http-service/build.gradle b/http-service/build.gradle deleted file mode 100644 index 831fb94d45..0000000000 --- a/http-service/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -apply plugin: 'war' - -description = 'Web Service' - -dependencies { - annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: mapstruct - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - api project(':cache') - api project(':http-api') - api project(':runelite-api') - - implementation group: 'com.github.scribejava', name: 'scribejava-apis', version: scribejava - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'io.minio', name: 'minio', version: minio - implementation group: 'org.mapstruct', name: 'mapstruct-jdk8', version: mapstruct - implementation group: 'org.mongodb', name: 'mongodb-driver-sync', version: mongodbDriverSync - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation group: 'org.springframework', name: 'spring-jdbc', version: springJdbc - implementation group: 'org.springframework.boot', name: 'spring-boot-devtools', version: springboot - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springboot - implementation group: 'org.sql2o', name: 'sql2o', version: sql2o - implementation(group: 'redis.clients', name: 'jedis', version: jedis) { - exclude(module: 'commons-pool2') - } - - providedCompile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: mariadbJdbc - providedCompile group: 'org.projectlombok', name: 'lombok', version: lombok - providedCompile group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: springboot - - testImplementation group: 'com.h2database', name: 'h2', version: '1.4.200' - testImplementation group: 'com.squareup.okhttp3', name: 'mockwebserver', version: okhttp3 - testImplementation(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: springboot) { - exclude(module: 'commons-logging') - } -} diff --git a/http-service/http-service.gradle.kts b/http-service/http-service.gradle.kts new file mode 100644 index 0000000000..6eaf8c53a3 --- /dev/null +++ b/http-service/http-service.gradle.kts @@ -0,0 +1,64 @@ +/* + * 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. + */ + +plugins { + war +} + +description = "Web Service" + +dependencies { + annotationProcessor(Libraries.mapstructProcessor) + annotationProcessor(Libraries.lombok) + + api(project(":cache")) + api(project(":http-api")) + api(project(":runelite-api")) + + implementation(Libraries.scribejava) + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.minio) + implementation(Libraries.mapstruct) + implementation(Libraries.mongodbDriverSync) + implementation(Libraries.slf4jApi) + implementation(Libraries.springbootJdbc) + implementation(Libraries.springbootDevtools) + implementation(Libraries.springbootStarterWeb) + implementation(Libraries.sql2o) + implementation(Libraries.jedis) { + exclude(module = "commons-pool2") + } + + providedCompile(Libraries.mariadbJdbc) + providedCompile(Libraries.lombok) + providedCompile(Libraries.springbootStarterTomcat) + + testImplementation(Libraries.h2) + testImplementation(Libraries.okhttp3Webserver) + testImplementation(Libraries.springbootStarterTest) { + exclude(module = "commons-logging") + } +} diff --git a/injected-client/injected-client.gradle.kts b/injected-client/injected-client.gradle.kts new file mode 100644 index 0000000000..a736dab534 --- /dev/null +++ b/injected-client/injected-client.gradle.kts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2019 ThatGamerBlue + * 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. + */ + +description = "Injected Client" + +tasks { + compileJava { + dependsOn(":injector-plugin:assemble") + + outputs.upToDateWhen { false } + + doLast { + copy { + val f = file ("build/classes/java/main") + f.deleteRecursively() + f.mkdirs() + from(project.extra["injectedClassesPath"]) + into("build/classes/java/main") + } + } + } + + classes { + val f = file("build/classes/java/main/Placeholder.class") + f.delete() + } + + // this is just here to show how the fernflower plugin could be used + //build { + // dependsOn(project.tasks.getByName("decompile")) + //} +} \ No newline at end of file diff --git a/injector-plugin/build.gradle b/injector-plugin/build.gradle deleted file mode 100644 index 13e3f2555e..0000000000 --- a/injector-plugin/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -group = 'us.runelitepl.rs' -description = 'Injector' - -def buildPath = buildDir.toString().replace('\\', '/') // this doesnt work in an ext block for some reason -def deobfuscatedJar = "${rootPath}/runescape-client/build/libs/rs-client-${project.version}.jar" -def vanillaJar = "${buildPath}/vanilla-${rsversion}.jar" - -configurations { - vanilla -} - -dependencies { - annotationProcessor group: 'org.eclipse.sisu', name: 'org.eclipse.sisu.inject', version: sisu - - compileOnly group: 'org.apache.maven.plugin-tools', name: 'maven-plugin-annotations', version: mavenPluginAnnotations - - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'org.apache.maven', name: 'maven-plugin-api', version: mavenPluginApi - implementation group: 'org.ow2.asm', name: 'asm', version: asm - implementation group: 'org.ow2.asm', name: 'asm-util', version: asm - implementation project(':deobfuscator') - implementation project(':mixins') - implementation project(':runelite-api') - implementation project(':runescape-api') - - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'org.mockito', name: 'mockito-core', version: mockito - testImplementation project(':deobfuscator') - testImplementation project(path: ':deobfuscator', configuration: 'testArchives') - - vanilla "net.runelite.rs:vanilla:${rsversion}" -} - -compileJava { - dependsOn ":rs-client:build" - - inputs.dir("${project.rootDir}/runescape-client/") - inputs.dir("${project.rootDir}/runescape-api/") - inputs.dir("${project.rootDir}/runelite-mixins/") -} - -compileJava.doLast() { - copy { - from configurations.vanilla - into "$buildDir" - } - def path = sourceSets.main.runtimeClasspath - def loader - try { - loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def inject = loader.loadClass('net.runelite.injector.Injector') - String[] jarPaths = [ - deobfuscatedJar.toString(), - vanillaJar.toString(), - injectedClassesPath.toString() - ] - inject.main(jarPaths) - } finally { - if (loader) { - loader.close() - } - } -} diff --git a/injector-plugin/injector-plugin.gradle.kts b/injector-plugin/injector-plugin.gradle.kts new file mode 100644 index 0000000000..97d3974575 --- /dev/null +++ b/injector-plugin/injector-plugin.gradle.kts @@ -0,0 +1,83 @@ +/* + * 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. + */ + +group = "com.openosrs.rs" +description = "Injector" + +val deobfuscatedJar = "${project.extra["rootPath"]}/runescape-client/build/libs/runescape-client-${ProjectVersions.rlVersion}.jar" +val vanillaJar = "${buildDir}/vanilla-${ProjectVersions.rsversion}.jar" + +val vanilla = configurations.create("vanilla") + +dependencies { + annotationProcessor(Libraries.sisu) + + compileOnly(Libraries.mavenPluginAnnotations) + + implementation(Libraries.guava) + implementation(Libraries.mavenPluginApi) + implementation(Libraries.asmAll) + implementation(Libraries.asmUtil) + implementation(project(":deobfuscator")) + implementation(project(":runelite-mixins")) + implementation(project(":runelite-api")) + implementation(project(":runescape-api")) + + testImplementation(Libraries.junit) + testImplementation(Libraries.mockitoCore) + testImplementation(project(":deobfuscator")) + testImplementation(project(path = ":deobfuscator", configuration = "testArchives")) + + vanilla(Libraries.vanilla) +} + +tasks { + register("copyVanilla") { + copy { + from(configurations.get("vanilla")) + into("$buildDir") + } + } + + register("inject") { + dependsOn("copyVanilla") + + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.injector.Injector" + args(listOf(deobfuscatedJar, vanillaJar, project.extra["injectedClassesPath"])) + } + + compileJava { + dependsOn(":runescape-client:build") + + inputs.dir(project(":runescape-client").projectDir.absolutePath) + inputs.dir(project(":runescape-api").projectDir.absolutePath) + inputs.dir(project(":runelite-mixins").projectDir.absolutePath) + } + + jar { + dependsOn("inject") + } +} diff --git a/protocol-api/build.gradle b/protocol-api/build.gradle deleted file mode 100644 index 8169e3e904..0000000000 --- a/protocol-api/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -description = 'Protocol API' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation project(':runelite-api') - - testImplementation group: 'junit', name: 'junit', version: junit -} diff --git a/protocol-api/protocol-api.gradle.kts b/protocol-api/protocol-api.gradle.kts new file mode 100644 index 0000000000..194b518656 --- /dev/null +++ b/protocol-api/protocol-api.gradle.kts @@ -0,0 +1,38 @@ +/* + * 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. + */ + +description = "Protocol API" + +dependencies { + annotationProcessor(Libraries.lombok) + + compileOnly(Libraries.lombok) + + implementation(Libraries.guava) + implementation(Libraries.slf4jApi) + implementation(project(":runelite-api")) + + testImplementation(Libraries.junit) +} diff --git a/protocol/build.gradle b/protocol/build.gradle deleted file mode 100644 index 508ad243e1..0000000000 --- a/protocol/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -description = 'Protocol' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - api project(':protocol-api') - - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'io.netty', name: 'netty-all', version: netty - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation project(':cache') - - testImplementation group: 'junit', name: 'junit', version: junit -} diff --git a/protocol/protocol.gradle.kts b/protocol/protocol.gradle.kts new file mode 100644 index 0000000000..f8f830a7c3 --- /dev/null +++ b/protocol/protocol.gradle.kts @@ -0,0 +1,41 @@ +/* + * 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. + */ + +description = "Protocol" + +dependencies { + annotationProcessor(Libraries.lombok) + + api(project(":protocol-api")) + + compileOnly(Libraries.lombok) + + implementation(Libraries.guava) + implementation(Libraries.nettyAll) + implementation(Libraries.slf4jApi) + implementation(project(":cache")) + + testImplementation(Libraries.junit) +} diff --git a/runelite-api/build.gradle b/runelite-api/build.gradle deleted file mode 100644 index e715877cac..0000000000 --- a/runelite-api/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -description = 'RuneLite API' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'com.google.code.findbugs', name: 'jsr305', version: findbugs - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'org.apache.commons', name: 'commons-text', version: apacheCommonsText - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - - testImplementation group: 'junit', name: 'junit', version: junit -} diff --git a/runelite-api/runelite-api.gradle.kts b/runelite-api/runelite-api.gradle.kts new file mode 100644 index 0000000000..fc7e9ade31 --- /dev/null +++ b/runelite-api/runelite-api.gradle.kts @@ -0,0 +1,39 @@ +/* + * 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. + */ + +description = "RuneLite API" + +dependencies { + annotationProcessor(Libraries.lombok) + + compileOnly(Libraries.lombok) + + implementation(Libraries.findbugs) + implementation(Libraries.guava) + implementation(Libraries.apacheCommonsText) + implementation(Libraries.slf4jApi) + + testImplementation(Libraries.junit) +} diff --git a/runelite-client/build.gradle b/runelite-client/build.gradle deleted file mode 100644 index b8a692b33a..0000000000 --- a/runelite-client/build.gradle +++ /dev/null @@ -1,118 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens -import java.text.SimpleDateFormat - -plugins { - id 'com.github.johnrengelman.shadow' version '5.1.0' - id 'java' -} - -description = 'RuneLite Client' - -dependencies { - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - compileOnly group: 'javax.annotation', name: 'javax.annotation-api', version: javax - compileOnly group: 'net.runelite', name: 'orange-extensions', version: orangeExtensions - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'ch.qos.logback', name: 'logback-classic', version: logback - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'com.google.inject', name: 'guice', version: guice, classifier: 'no_aop' - implementation group: 'com.h2database', name: 'h2', version: h2 - implementation group: 'com.jakewharton.rxrelay2', name: 'rxrelay', version: rxrelay - implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp3 - implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: rxjava - implementation group: 'net.java.dev.jna', name: 'jna', version: jna - implementation group: 'net.java.dev.jna', name: 'jna-platform', version: jna - implementation group: 'net.runelite', name: 'discord', version: discord - implementation group: 'net.runelite.pushingpixels', name: 'substance', version: substance - implementation group: 'net.sf.jopt-simple', name: 'jopt-simple', version: jopt - implementation group: 'org.apache.commons', name: 'commons-text', version: apacheCommonsText - implementation group: 'org.apache.httpcomponents', name: 'httpcore', version: httpcore - implementation group: 'org.apache.httpcomponents', name: 'httpmime', version: httpmime - implementation group: 'org.codehaus.plexus', name: 'plexus-utils', version: plexus - implementation group: 'org.javassist', name: 'javassist', version: javassist - implementation group: 'org.jetbrains', name: 'annotations', version: annotations - implementation group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: jogamp - implementation group: 'org.jogamp.jogl', name: 'jogl-all', version: jogamp - implementation group: 'org.jooq', name: 'jooq', version: jooq - implementation group: 'org.jooq', name: 'jooq-codegen', version: jooq - implementation group: 'org.jooq', name: 'jooq-meta', version: jooq - implementation group: 'org.ow2.asm', name: 'asm-tree', version: asm - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation group: 'org.xeustechnologies', name: 'jcl-core', version: jclCore - implementation project(':http-api') - implementation project(':runelite-api') - implementation(group: 'io.sigpipe', name: 'jbsdiff', version: jbsdiff) { - exclude(module: 'xz') - } - implementation group: 'com.github.joonasvali.naturalmouse', name: 'naturalmouse', version: '2.0.2' - runtime group: 'net.runelite.pushingpixels', name: 'trident', version: trident - runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: jogamp, classifier: 'natives-linux-amd64' - runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: jogamp, classifier: 'natives-linux-i586' - runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: jogamp, classifier: 'natives-windows-amd64' - runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: jogamp, classifier: 'natives-windows-i586' - runtime group: 'org.jogamp.jogl', name: 'jogl-all', version: jogamp, classifier: 'natives-linux-amd64' - runtime group: 'org.jogamp.jogl', name: 'jogl-all', version: jogamp, classifier: 'natives-linux-i586' - runtime group: 'org.jogamp.jogl', name: 'jogl-all', version: jogamp, classifier: 'natives-windows-amd64' - runtime group: 'org.jogamp.jogl', name: 'jogl-all', version: jogamp, classifier: 'natives-windows-i586' - runtime project(':injected-client') - runtime project(':runescape-api') - - testAnnotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - testCompileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - testImplementation group: 'com.google.inject.extensions', name: 'guice-grapher', version: guice - testImplementation group: 'com.google.inject.extensions', name: 'guice-testlib', version: guice - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'org.hamcrest', name: 'hamcrest-library', version: hamcrest - testImplementation group: 'org.mockito', name: 'mockito-core', version: mockito - testImplementation group: 'org.mockito', name: 'mockito-inline', version: mockito - testImplementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j -} - -static def getDate() { - return new SimpleDateFormat("MM-dd-yyyy", Locale.forLanguageTag("en-US")).format(new Date()) -} - -def buildDate = getDate() - -processResources { - from file("src/main/resources/open.osrs.properties"), { - filter(ReplaceTokens, tokens: [ - "project.version": project.version, - "rs.version": rsversion.toString(), - "open.osrs.version": plusVersion.toString(), - "open.osrs.builddate": buildDate.toString(), - "launcher.version": launcherVersion.toString() - ]) - } -} - -tasks.withType(AbstractArchiveTask) { - preserveFileTimestamps = false - reproducibleFileOrder = true -} - -jar { - manifest { - attributes 'Main-Class': 'net.runelite.client.RuneLite' - } -} - -shadowJar { - archiveClassifier.set("shaded") - - exclude("net/runelite/injector/**") -} - -task dependencyReportFile(type: DependencyReportTask) { - outputFile = file('dependencies.txt') - Set configs = [project.configurations.runtimeClasspath] - setConfigurations(configs) -} - -tasks.build.dependsOn tasks.shadowJar -tasks.shadowJar.dependsOn tasks.dependencyReportFile diff --git a/runelite-client/runelite-client.gradle.kts b/runelite-client/runelite-client.gradle.kts new file mode 100644 index 0000000000..27f6e1cefa --- /dev/null +++ b/runelite-client/runelite-client.gradle.kts @@ -0,0 +1,153 @@ +/* + * 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. + */ + +import org.apache.tools.ant.filters.ReplaceTokens +import java.util.Date +import java.text.SimpleDateFormat + +buildscript { + dependencies { + classpath(gradleApi()) + } +} + +plugins { + id(Plugins.shadow.first) version Plugins.shadow.second + java +} + +description = "RuneLite Client" + +dependencies { + annotationProcessor(Libraries.lombok) + + compileOnly(Libraries.javax) + compileOnly(Libraries.orangeExtensions) + compileOnly(Libraries.lombok) + + implementation(Libraries.logback) + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.guice) + implementation(Libraries.h2) + implementation(Libraries.rxrelay) + implementation(Libraries.okhttp3) + implementation(Libraries.rxjava) + implementation(Libraries.jna) + implementation(Libraries.jnaPlatform) + implementation(Libraries.discord) + implementation(Libraries.substance) + implementation(Libraries.jopt) + implementation(Libraries.apacheCommonsText) + implementation(Libraries.httpcore) + implementation(Libraries.httpmime) + implementation(Libraries.plexus) + implementation(Libraries.javassist) + implementation(Libraries.annotations) + implementation(Libraries.jogampGluegen) + implementation(Libraries.jogampJogl) + implementation(Libraries.jooq) + implementation(Libraries.jooqCodegen) + implementation(Libraries.jooqMeta) + implementation(Libraries.asmTree) + implementation(Libraries.slf4jApi) + implementation(Libraries.jclCore) + implementation(project(":http-api")) + implementation(project(":runelite-api")) + implementation(Libraries.jbsdiff) { + exclude(module = "xz") + } + implementation(Libraries.naturalMouse) + runtime(Libraries.trident) + runtime(Libraries.jogampGluegenLinuxAmd64) + runtime(Libraries.jogampGluegenLinuxI586) + runtime(Libraries.jogampGluegenWindowsAmd64) + runtime(Libraries.jogampGluegenWindowsI586) + runtime(Libraries.jogampJoglLinuxAmd64) + runtime(Libraries.jogampJoglLinuxI586) + runtime(Libraries.jogampJoglWindowsAmd64) + runtime(Libraries.jogampJoglWindowsI586) + runtime(project(":injected-client")) + runtime(project(":runescape-api")) + + testAnnotationProcessor(Libraries.lombok) + + testCompileOnly(Libraries.lombok) + + testImplementation(Libraries.guiceGrapher) + testImplementation(Libraries.guiceTestlib) + testImplementation(Libraries.junit) + testImplementation(Libraries.hamcrest) + testImplementation(Libraries.mockitoCore) + testImplementation(Libraries.mockitoInline) + testImplementation(Libraries.slf4jApi) +} + +fun formatDate(date: Date?) = with(date ?: Date()) { + SimpleDateFormat("MM-dd-yyyy").format(this) +} + +tasks { + register("dependencyReportFile") { + outputFile = file("dependencies.txt") + setConfiguration("runtimeClasspath") + } + + build { + finalizedBy("shadowJar") + } + + "processResources"(ProcessResources::class) { + val tokens = mapOf( + "project.version" to ProjectVersions.rlVersion, + "rs.version" to ProjectVersions.rsversion.toString(), + "open.osrs.version" to ProjectVersions.openosrsVersion, + "open.osrs.builddate" to formatDate(Date()), + "launcher.version" to ProjectVersions.launcherVersion + ) + + inputs.properties(tokens) + + from("src/main/resources") { + include("open.osrs.properties") + + filter("tokens" to tokens) + } + } + + jar { + manifest { + attributes(mutableMapOf("Main-Class" to "net.runelite.client.RuneLite")) + } + } + + shadowJar { + dependsOn("dependencyReportFile") + + archiveClassifier.set("shaded") + + exclude("net/runelite/injector/**") + } +} \ No newline at end of file diff --git a/runelite-mixins/build.gradle b/runelite-mixins/build.gradle deleted file mode 100644 index b58bca5cb6..0000000000 --- a/runelite-mixins/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -description = 'RuneLite Mixins' - -dependencies { - compileOnly group: 'com.google.guava', name: 'guava', version: guava - compileOnly group: 'javax.inject', name: 'javax.inject', version: javaxInject - compileOnly group: 'org.slf4j', name: 'slf4j-api', version: slf4j - - implementation project(':runescape-api') -} - -tasks.withType(JavaCompile){ - options.compilerArgs.addAll('-source', '7', '-Xlint:-unchecked') -} diff --git a/runelite-mixins/runelite-mixins.gradle.kts b/runelite-mixins/runelite-mixins.gradle.kts new file mode 100644 index 0000000000..1fba54af2c --- /dev/null +++ b/runelite-mixins/runelite-mixins.gradle.kts @@ -0,0 +1,38 @@ +/* + * 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. + */ + +description = "RuneLite Mixins" + +dependencies { + compileOnly(Libraries.guava) + compileOnly(Libraries.javaxInject) + compileOnly(Libraries.slf4jApi) + + implementation(project(":runescape-api")) +} + +tasks.withType { + options.compilerArgs.addAll(arrayOf("-source", "7", "-Xlint:-unchecked")) +} diff --git a/runelite-plugin-archetype/build.gradle b/runelite-plugin-archetype/build.gradle deleted file mode 100644 index 9d0ad72536..0000000000 --- a/runelite-plugin-archetype/build.gradle +++ /dev/null @@ -1 +0,0 @@ -description = 'RuneLite Plugin Archetype' diff --git a/runelite-plugin-archetype/runelite-plugin-archetype.gradle.kts b/runelite-plugin-archetype/runelite-plugin-archetype.gradle.kts new file mode 100644 index 0000000000..21b29f0405 --- /dev/null +++ b/runelite-plugin-archetype/runelite-plugin-archetype.gradle.kts @@ -0,0 +1,26 @@ +/* + * 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. + */ + +description = "RuneLite Plugin Archetype" diff --git a/runelite-script-assembler-plugin/build.gradle b/runelite-script-assembler-plugin/build.gradle deleted file mode 100644 index 82786107b0..0000000000 --- a/runelite-script-assembler-plugin/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -description = 'Script Assembler Plugin' - -dependencies { - annotationProcessor group: 'org.eclipse.sisu', name: 'org.eclipse.sisu.inject', version: sisu - - compileOnly group: 'org.apache.maven.plugin-tools', name: 'maven-plugin-annotations', version: mavenPluginAnnotations - - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'org.apache.maven', name: 'maven-plugin-api', version: mavenPluginApi - implementation group: 'org.slf4j', name: 'slf4j-nop', version: slf4j - implementation project(':cache') - implementation project(':runelite-api') -} - -compileJava.outputs.upToDateWhen {false} - -compileJava.doLast { - def path = sourceSets.main.runtimeClasspath - def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def assemble = loader.loadClass('net.runelite.script.AssembleMojo') - String[] assembleArgs = [ - "${project.rootDir}/runelite-client/src/main/scripts", - "${project.rootDir}/runelite-client/src/main/resources/runelite" - ] - assemble.main(assembleArgs) - - def index = loader.loadClass('net.runelite.script.IndexMojo') - String[] indexArgs = [ - "${project.rootDir}/runelite-client/src/main/resources/runelite", - "${project.rootDir}/runelite-client/src/main/resources/runelite/index" - ] - index.main(indexArgs) - - loader.close() -} diff --git a/runelite-script-assembler-plugin/runelite-script-assembler-plugin.gradle.kts b/runelite-script-assembler-plugin/runelite-script-assembler-plugin.gradle.kts new file mode 100644 index 0000000000..b1402a58c5 --- /dev/null +++ b/runelite-script-assembler-plugin/runelite-script-assembler-plugin.gradle.kts @@ -0,0 +1,66 @@ +/* + * 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. + */ + +description = "Script Assembler Plugin" + +dependencies { + annotationProcessor(Libraries.sisu) + + compileOnly(Libraries.mavenPluginAnnotations) + + implementation(Libraries.guava) + implementation(Libraries.mavenPluginApi) + implementation(Libraries.slf4jNop) + implementation(project(":cache")) + implementation(project(":runelite-api")) +} + +tasks { + register("assembleMojo") { + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.script.AssembleMojo" + args(listOf( + "${project.extra["rootPath"]}/runelite-client/src/main/scripts", + "${project.extra["rootPath"]}/runelite-client/src/main/resources/runelite" + )) + } + + register("indexMojo") { + dependsOn("assembleMojo") + + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.script.IndexMojo" + args(listOf( + "${project.extra["rootPath"]}/runelite-client/src/main/resources/runelite", + "${project.extra["rootPath"]}/runelite-client/src/main/resources/runelite/index" + )) + } + + compileJava { + outputs.upToDateWhen {false} + + finalizedBy("indexMojo") + } +} \ No newline at end of file diff --git a/runescape-api/build.gradle b/runescape-api/build.gradle deleted file mode 100644 index 77abba4353..0000000000 --- a/runescape-api/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -group = 'us.runelitepl.rs' -description = 'RuneScape API' - -dependencies { - api project(':runelite-api') -} diff --git a/runescape-api/runescape-api.gradle.kts b/runescape-api/runescape-api.gradle.kts new file mode 100644 index 0000000000..5746b30ae4 --- /dev/null +++ b/runescape-api/runescape-api.gradle.kts @@ -0,0 +1,31 @@ +/* + * 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. + */ + +group = "us.runelitepl.rs" +description = "RuneScape API" + +dependencies { + api(project(":runelite-api")) +} diff --git a/runescape-client/build.gradle b/runescape-client/build.gradle deleted file mode 100644 index a26ab5f36e..0000000000 --- a/runescape-client/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -group = 'us.runelitepl.rs' -description = 'RuneScape Client' - -dependencies { - implementation project(':runescape-api') - - testImplementation group: 'junit', name: 'junit', version: junit - testImplementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4j -} - -tasks.withType(JavaCompile) { - options.compilerArgs.addAll('-g:source,vars,lines', '-Xlint:-unchecked') -} diff --git a/injected-client/build.gradle b/runescape-client/runescape-client.gradle.kts similarity index 70% rename from injected-client/build.gradle rename to runescape-client/runescape-client.gradle.kts index e0810e7bad..43aede0b59 100644 --- a/injected-client/build.gradle +++ b/runescape-client/runescape-client.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 ThatGamerBlue + * Copyright (c) 2019 Owain van Brakel * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,28 +22,20 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -description = 'Injected Client' -compileJava { - dependsOn ':injector-plugin:assemble' +group = "com.openosrs.rs" +description = "RuneScape Client" + +dependencies { + implementation(project(":runescape-api")) + + testImplementation(Libraries.junit) + testImplementation(Libraries.slf4jApi) + testImplementation(Libraries.slf4jSimple) } -compileJava.outputs.upToDateWhen { false } - -compileJava.doLast() { - copy { - File f = file("build/classes/java/main") - f.deleteDir() - f.mkdirs() - from ("${injectedClassesPath}") - into ("build/classes/java/main") +tasks { + withType { + options.compilerArgs.addAll(arrayOf("-g:source,vars,lines", "-Xlint:-unchecked")) } } - -classes.doLast() { - File f = file("build/classes/java/main/Placeholder.class") - f.delete() -} - -// tasks.build.dependsOn(tasks.decompile) -// this is just here to show how this could be used \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 2d3e25eaaf..0000000000 --- a/settings.gradle +++ /dev/null @@ -1,41 +0,0 @@ -rootProject.name = 'runelite-parent' -include ':http-api' -include ':cache' -include ':runelite-api' -include ':protocol-api' -include ':protocol' -include ':cache-client' -include ':cache-updater' -include ':runescape-api' -include ':rs-client' -include ':deobfuscator' -include ':script-assembler-plugin' -include ':client' -include ':mixins' -include ':injector-plugin' -include ':injected-client' -include ':runelite-plugin-archetype' -include ':http-service' -include ':http-service-openosrs' -include ':wiki-scraper' - -project(':http-api').projectDir = "$rootDir/http-api" as File -project(':cache').projectDir = "$rootDir/cache" as File -project(':runelite-api').projectDir = "$rootDir/runelite-api" as File -project(':protocol-api').projectDir = "$rootDir/protocol-api" as File -project(':protocol').projectDir = "$rootDir/protocol" as File -project(':cache-client').projectDir = "$rootDir/cache-client" as File -project(':cache-updater').projectDir = "$rootDir/cache-updater" as File -project(':runescape-api').projectDir = "$rootDir/runescape-api" as File -project(':rs-client').projectDir = "$rootDir/runescape-client" as File -project(':deobfuscator').projectDir = "$rootDir/deobfuscator" as File -project(':script-assembler-plugin').projectDir = "$rootDir/runelite-script-assembler-plugin" as File -project(':client').projectDir = "$rootDir/runelite-client" as File -project(':mixins').projectDir = "$rootDir/runelite-mixins" as File -project(':injector-plugin').projectDir = "$rootDir/injector-plugin" as File -project(':injected-client').projectDir = "$rootDir/injected-client" as File -project(':runelite-plugin-archetype').projectDir = "$rootDir/runelite-plugin-archetype" as File -project(':http-service').projectDir = "$rootDir/http-service" as File -project(':http-service-openosrs').projectDir = "$rootDir/http-service-openosrs" as File -project(':wiki-scraper').projectDir = "$rootDir/wiki-scraper" as File - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000000..d9f072a2ef --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,57 @@ +/* + * 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. + */ + +rootProject.name = "OpenOSRS" + +include(":http-api") +include(":cache") +include(":runelite-api") +include(":protocol-api") +include(":protocol") +include(":cache-client") +include(":cache-updater") +include(":runescape-api") +include(":runescape-client") +include(":deobfuscator") +include(":runelite-script-assembler-plugin") +include(":runelite-client") +include(":runelite-mixins") +include(":injector-plugin") +include(":injected-client") +include(":runelite-plugin-archetype") +include(":http-service") +include(":http-service-openosrs") +include(":wiki-scraper") + +for (project in rootProject.children) { + project.apply { + projectDir = file("$name") + buildFileName = "$name.gradle.kts" + + require(projectDir.isDirectory) { "Project '${project.path} must have a $projectDir directory" } + require(buildFile.isFile) { "Project '${project.path} must have a $buildFile build script" } + } +} + diff --git a/wiki-scraper/build.gradle b/wiki-scraper/build.gradle deleted file mode 100644 index e34e73e741..0000000000 --- a/wiki-scraper/build.gradle +++ /dev/null @@ -1,57 +0,0 @@ -repositories { - mavenCentral() - maven { url 'https://jitpack.io' } -} - -description = 'RuneLite Wiki scraper' - -dependencies { - api project(':cache') - api project(':runelite-api') - - annotationProcessor group: 'org.projectlombok', name: 'lombok', version: lombok - - compileOnly group: 'org.projectlombok', name: 'lombok', version: lombok - - implementation group: 'com.google.code.gson', name: 'gson', version: gson - implementation group: 'com.google.guava', name: 'guava', version: guava - implementation group: 'com.github.petitparser', name: 'java-petitparser', version: '2.2.0' - implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp3 - implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j - implementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4j - - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: jupiter -} - -task npcStatsScrape { - doLast { - def path = sourceSets.main.runtimeClasspath - def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def scrape = loader.loadClass('net.runelite.data.App') - scrape.npcStats(rootProject.file("./runelite-client/src/main/resources/")); - - loader.close() - } -} - -task itemStatsScrape { - doLast { - def path = sourceSets.main.runtimeClasspath - def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def scrape = loader.loadClass('net.runelite.data.App') - scrape.itemStats(rootProject.file("./runelite-client/src/main/resources/")); - - loader.close() - } -} - -task itemLimitsScrape { - doLast { - def path = sourceSets.main.runtimeClasspath - def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[]) - def scrape = loader.loadClass('net.runelite.data.App') - scrape.itemLimits(rootProject.file("./runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/")); - - loader.close() - } -} diff --git a/wiki-scraper/src/main/java/net/runelite/data/App.java b/wiki-scraper/src/main/java/net/runelite/data/App.java index ca8b73a9c6..3f4bd9a8ac 100644 --- a/wiki-scraper/src/main/java/net/runelite/data/App.java +++ b/wiki-scraper/src/main/java/net/runelite/data/App.java @@ -45,7 +45,28 @@ public class App private final static MediaWiki wiki = new MediaWiki("https://oldschool.runescape.wiki"); - public static Store cacheStore() throws IOException + public static void main(String[] args) throws IOException + { + if (args.length < 2) + { + System.exit(-1); + } + + switch (args[0]) + { + case "npcStats": + npcStats(new File(args[1])); + break; + case "itemStats": + itemStats(new File(args[1])); + break; + case "itemLimits": + itemLimits(new File(args[1])); + break; + } + } + + private static Store cacheStore() throws IOException { Path path = Paths.get(System.getProperty("user.home"), "jagexcache" + File.separator + "oldschool" + File.separator + "LIVE"); final File jagexcache = new File(String.valueOf(path)); @@ -65,17 +86,17 @@ public class App return cacheStore; } - public static void npcStats(File path) throws IOException + private static void npcStats(File path) throws IOException { NpcStatsDumper.dump(cacheStore(), wiki, path); } - public static void itemStats(File path) throws IOException + private static void itemStats(File path) throws IOException { ItemStatsDumper.dump(cacheStore(), wiki, path); } - public static void itemLimits(File path) throws IOException + private static void itemLimits(File path) throws IOException { ItemLimitsDumper.dump(cacheStore(), wiki, path); } diff --git a/wiki-scraper/wiki-scraper.gradle.kts b/wiki-scraper/wiki-scraper.gradle.kts new file mode 100644 index 0000000000..124411046a --- /dev/null +++ b/wiki-scraper/wiki-scraper.gradle.kts @@ -0,0 +1,69 @@ +/* + * 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. + */ + +repositories { + mavenCentral() + maven(url = "https://jitpack.io") +} + +description = "RuneLite Wiki scraper" + +dependencies { + api(project(":cache")) + api(project(":runelite-api")) + + annotationProcessor(Libraries.lombok) + + compileOnly(Libraries.lombok) + + implementation(Libraries.gson) + implementation(Libraries.guava) + implementation(Libraries.petitparser) + implementation(Libraries.okhttp3) + implementation(Libraries.slf4jApi) + implementation(Libraries.slf4jSimple) + + testImplementation(Libraries.jupiter) +} + +tasks { + register("npcStatsScrape") { + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.data.App" + args(listOf("npcStats", rootProject.file("./runelite-client/src/main/resources/").absolutePath)) + } + + register("itemStatsScrape") { + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.data.App" + args(listOf("itemStats", rootProject.file("./runelite-client/src/main/resources/").absolutePath)) + } + + register("itemLimitsScrape") { + classpath = project.sourceSets.main.get().runtimeClasspath + main = "net.runelite.data.App" + args(listOf("itemLimits", rootProject.file("./runelite-client/src/main/resources/").absolutePath)) + } +} From 53e56720fc5d18d0b43c079841444e4e2e6bb50d Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 27 Oct 2019 21:08:34 +0100 Subject: [PATCH 092/185] raids plugin: add option to manually broadcast layout Closes #9541 Signed-off-by: Tomas Slusny --- .../client/plugins/raids/RaidsConfig.java | 2 +- .../client/plugins/raids/RaidsOverlay.java | 3 +++ .../client/plugins/raids/RaidsPlugin.java | 24 ++++++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) 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 2323a15a49..f92e483eae 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 @@ -160,6 +160,6 @@ public interface RaidsConfig extends Config ) default boolean layoutMessage() { - return true; + return false; } } 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 5ca7214b57..9613d2e643 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 @@ -30,6 +30,7 @@ import java.awt.Graphics2D; import javax.inject.Inject; import lombok.Setter; import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.plugins.raids.solver.Room; import net.runelite.client.ui.overlay.Overlay; @@ -44,6 +45,7 @@ import net.runelite.client.ui.overlay.components.TitleComponent; public class RaidsOverlay extends Overlay { private static final int OLM_PLANE = 0; + static final String BROADCAST_ACTION = "Broadcast layout"; private Client client; private RaidsPlugin plugin; @@ -63,6 +65,7 @@ public class RaidsOverlay extends Overlay this.plugin = plugin; this.config = config; getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids overlay")); + getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY, BROADCAST_ACTION, "Raids overlay")); } @Override 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 6508792768..7c075b8767 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 @@ -39,6 +39,7 @@ import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.InstanceTemplates; +import net.runelite.api.MenuAction; import net.runelite.api.NullObjectID; import static net.runelite.api.Perspective.SCENE_SIZE; import net.runelite.api.Point; @@ -56,6 +57,7 @@ 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.events.OverlayMenuClicked; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -253,6 +255,17 @@ public class RaidsPlugin extends Plugin } } + @Subscribe + public void onOverlayMenuClicked(final OverlayMenuClicked event) + { + if (event.getEntry().getMenuAction() == MenuAction.RUNELITE_OVERLAY && + event.getEntry().getOption().equals(RaidsOverlay.BROADCAST_ACTION) && + event.getOverlay() == overlay) + { + sendRaidLayoutMessage(); + } + } + private void checkRaidPresence(boolean force) { if (client.getGameState() != GameState.LOGGED_IN) @@ -288,7 +301,11 @@ public class RaidsPlugin extends Plugin raid.updateLayout(layout); RotationSolver.solve(raid.getCombatRooms()); overlay.setScoutOverlayShown(true); - sendRaidLayoutMessage(); + + if (config.layoutMessage()) + { + sendRaidLayoutMessage(); + } } else if (!config.scoutOverlayAtBank()) { @@ -305,11 +322,6 @@ public class RaidsPlugin extends Plugin private void sendRaidLayoutMessage() { - if (!config.layoutMessage()) - { - return; - } - final String layout = getRaid().getLayout().toCodeString(); final String rooms = getRaid().toRoomString(); final String raidData = "[" + layout + "]: " + rooms; From 7b82d61e09bac82ed23934a93f3d519766c381a7 Mon Sep 17 00:00:00 2001 From: trimbe Date: Sun, 27 Oct 2019 16:11:28 -0400 Subject: [PATCH 093/185] clues plugin: add fairy rings to coord clues --- .../cluescrolls/clues/CoordinateClue.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index 3d833104d7..43965ade9d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -63,7 +63,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(2383, 3370, 0), "West of the outpost") .put(new WorldPoint(3312, 3375, 0), "North-west of Exam Centre, on the hill.") .put(new WorldPoint(3121, 3384, 0), "North-east of Draynor Manor, near River Lum.") - .put(new WorldPoint(3430, 3388, 0), "West of Mort Myre Swamp.") + .put(new WorldPoint(3430, 3388, 0), "West of Mort Myre Swamp (BKR).") .put(new WorldPoint(2920, 3403, 0), "South-east of Taverley, near Lady of the Lake.") .put(new WorldPoint(2594, 2899, 0), "South-east of Feldip Hills, by the crimson swifts (AKS).") .put(new WorldPoint(2387, 3435, 0), "West of Tree Gnome Stronghold, near the pen containing terrorbirds.") @@ -71,21 +71,21 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(2381, 3468, 0), "West of Tree Gnome Stronghold, north of the pen with terrorbirds.") .put(new WorldPoint(3005, 3475, 0), "Ice Mountain, west of Edgeville.") .put(new WorldPoint(2585, 3505, 0), "By the shore line north of the Coal Trucks.") - .put(new WorldPoint(3443, 3515, 0), "South of Slayer Tower.") + .put(new WorldPoint(3443, 3515, 0), "South of Slayer Tower (CKS).") .put(new WorldPoint(2416, 3516, 0), "Tree Gnome Stronghold, west of Grand Tree, near swamp.") - .put(new WorldPoint(3429, 3523, 0), "South of Slayer Tower.") - .put(new WorldPoint(2363, 3531, 0), "North-east of Eagles' Peak.") + .put(new WorldPoint(3429, 3523, 0), "South of Slayer Tower (CKS).") + .put(new WorldPoint(2363, 3531, 0), "North-east of Eagles' Peak (AKQ).") .put(new WorldPoint(2919, 3535, 0), "East of Burthorpe pub.") .put(new WorldPoint(3548, 3560, 0), "Inside Fenkenstrain's Castle.") .put(new WorldPoint(1456, 3620, 0), "Graveyard west of Shayzien (DJR).") .put(new WorldPoint(2735, 3638, 0), "East of Rellekka, north-west of Golden Apple Tree (AJR).") .put(new WorldPoint(2681, 3653, 0), "Rellekka, in the garden of the south-east house.") - .put(new WorldPoint(2537, 3881, 0), "Miscellania.") + .put(new WorldPoint(2537, 3881, 0), "Miscellania (CIP).") .put(new WorldPoint(2828, 3234, 0), "Southern coast of Crandor.") .put(new WorldPoint(1247, 3726, 0), "Just inside the Farming Guild") .put(new WorldPoint(3770, 3898, 0), "On the small island north-east of Fossil Island's mushroom forest.") // Hard - .put(new WorldPoint(2209, 3161, 0), "North-east of Tyras Camp.") + .put(new WorldPoint(2209, 3161, 0), "North-east of Tyras Camp (BJS).") .put(new WorldPoint(2181, 3206, 0), "South of Elf Camp.") .put(new WorldPoint(3081, 3209, 0), "Small Island (CLP).") .put(new WorldPoint(3374, 3250, 0), "Duel Arena combat area.") @@ -98,12 +98,12 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(2581, 3030, 0), "Gu'Tanoth island, enter cave north-west of Feldip Hills (AKS).") .put(new WorldPoint(2961, 3024, 0), "Ship yard (DKP).") .put(new WorldPoint(2339, 3311, 0), "East of Prifddinas on Arandar mountain pass.") - .put(new WorldPoint(3440, 3341, 0), "Nature Spirit's grotto.") - .put(new WorldPoint(2763, 2974, 0), "Cairn Isle, west of Shilo Village.") + .put(new WorldPoint(3440, 3341, 0), "Nature Spirit's grotto (BIP).") + .put(new WorldPoint(2763, 2974, 0), "Cairn Isle, west of Shilo Village (CKR).") .put(new WorldPoint(3138, 2969, 0), "West of Bandit Camp in Kharidian Desert.") .put(new WorldPoint(2924, 2963, 0), "On the southern part of eastern Karamja.") - .put(new WorldPoint(2838, 2914, 0), "Kharazi Jungle, near water pool.") - .put(new WorldPoint(3441, 3419, 0), "Mort Myre Swamp.") + .put(new WorldPoint(2838, 2914, 0), "Kharazi Jungle, near water pool (CKR).") + .put(new WorldPoint(3441, 3419, 0), "Mort Myre Swamp (BKR).") .put(new WorldPoint(2950, 2902, 0), "South-east of Kharazi Jungle.") .put(new WorldPoint(2775, 2891, 0), "South-west of Kharazi Jungle.") .put(new WorldPoint(3113, 3602, 0), "Wilderness. North of Edgeville (level 11).") @@ -113,8 +113,8 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(3305, 3692, 0), "Wilderness. West of eastern green dragon.") .put(new WorldPoint(3055, 3696, 0), "Wilderness. Bandit Camp.") .put(new WorldPoint(3302, 3696, 0), "Wilderness. West of eastern green dragon.") - .put(new WorldPoint(1479, 3696, 0), "Lizardman Canyon.") - .put(new WorldPoint(2712, 3732, 0), "North-east of Rellekka.") + .put(new WorldPoint(1479, 3696, 0), "Lizardman Canyon (DJR).") + .put(new WorldPoint(2712, 3732, 0), "North-east of Rellekka (DKS).") .put(new WorldPoint(2970, 3749, 0), "Wilderness. Forgotten Cemetery.") .put(new WorldPoint(3094, 3764, 0), "Wilderness. Mining site north of Bandit Camp.") .put(new WorldPoint(3311, 3769, 0), "Wilderness. North of Venenatis.") @@ -188,7 +188,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(1698, 3792, 0), "Arceuus church.") .put(new WorldPoint(2951, 3820, 0), "Wilderness. Chaos Temple (level 38).") .put(new WorldPoint(2202, 3825, 0), "Pirates' Cove, between Lunar Isle and Rellekka.") - .put(new WorldPoint(1761, 3853, 0), "Arceuus essence mine.") + .put(new WorldPoint(1761, 3853, 0), "Arceuus essence mine (CIS).") .put(new WorldPoint(2090, 3863, 0), "South of Lunar Isle, west of Astral altar.") .put(new WorldPoint(1442, 3878, 0), "Sulphur Mine.") .put(new WorldPoint(3380, 3929, 0), "Wilderness. Near Volcano.") From 5344cd6ddbd0e435bad7a088dbc266738319a5fc Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 27 Oct 2019 16:20:37 -0400 Subject: [PATCH 094/185] menu swapper: add pyramid plunder start-minigame and quick-leave Co-authored-by: MrH4mm3r --- .../MenuEntrySwapperConfig.java | 20 +++++++++++++++++++ .../MenuEntrySwapperPlugin.java | 9 +++++++++ 2 files changed, 29 insertions(+) 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 13f780a823..ddd3a1513c 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 @@ -321,4 +321,24 @@ public interface MenuEntrySwapperConfig extends Config { return false; } + + @ConfigItem( + keyName = "swapStartMinigame", + name = "Pyramid Plunder Start-minigame", + description = "Swap Talk-to with Start-minigame at the Guardian Mummy" + ) + default boolean swapStartMinigame() + { + return true; + } + + @ConfigItem( + keyName = "swapQuickleave", + name = "Quick-Leave", + description = "Swap Leave Tomb with Quick-Leave at Pyramid Plunder" + ) + default boolean swapQuickLeave() + { + return false; + } } 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 91fddefb66..7d37fae388 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 @@ -458,6 +458,15 @@ public class MenuEntrySwapperPlugin extends Plugin { swap("enchant", option, target, index); } + + if (config.swapStartMinigame()) + { + swap("start-minigame", option, target, index); + } + } + else if (config.swapQuickLeave() && option.equals("leave tomb") && target.equals("tomb door")) + { + swap("quick-leave", option, target, index); } else if (config.swapTravel() && option.equals("pass") && target.equals("energy barrier")) { From b02009d6e1e71eb3331fbbbecafd65944e445d52 Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Mon, 28 Oct 2019 00:13:16 +0000 Subject: [PATCH 095/185] project: Update gradle wrapper --- gradlew | 2 +- gradlew.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew b/gradlew index a016f754cd..83f2acfdc3 100755 --- a/gradlew +++ b/gradlew @@ -44,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx4g" "-Xms2g" "-Dfile.encoding=UTF-8"' +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index e79b159744..24467a141f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -30,7 +30,7 @@ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx4g" "-Xms2g" "-Dfile.encoding=UTF-8" +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome From 449e990a751ea184e35743cc6250498a73bf4639 Mon Sep 17 00:00:00 2001 From: ReeeMan <39725162+ReeeMan@users.noreply.github.com> Date: Mon, 28 Oct 2019 00:29:48 +0000 Subject: [PATCH 096/185] contributing: update file. (#1851) confused me for way too long....... --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fe0d820eca..28cc23d1ee 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -54,7 +54,7 @@ Before you submit your pull request consider the following guidelines: * After cloning, set a new remote [upstream](https://help.github.com/articles/configuring-a-remote-for-a-fork/) (this helps to keep your fork up to date) ```shell - git remote add upstream https://github.com/runelite-extended/runelite.git + git remote add upstream https://github.com/open-osrs/runelite.git ``` * Make your changes in a new git branch: From f3feebdf1c1d7a6e3e1e0ef9e344a5c6720d728a Mon Sep 17 00:00:00 2001 From: JHPinto Date: Mon, 28 Oct 2019 01:08:07 +0000 Subject: [PATCH 097/185] gauntlet: add resource tracker (#1813) * Adde resource tracker to Gauntlet Plugin. Isolate XpDrops into a separate entity that produces XpDropEvents, and adjust the XpDropPlugin to work with the new events. Add gauntlet creature death animations to the LootManage. * Indentation and format adjustments --- .../java/net/runelite/api/AnimationID.java | 9 + .../java/net/runelite/client/RuneLite.java | 5 + .../net/runelite/client/game/LootManager.java | 25 ++- .../net/runelite/client/game/XpDropEvent.java | 12 ++ .../runelite/client/game/XpDropManager.java | 60 +++++++ .../plugins/experiencedrop/XpDropPlugin.java | 69 ++++---- .../plugins/gauntlet/GauntletConfig.java | 12 ++ .../plugins/gauntlet/GauntletPlugin.java | 156 +++++++++++++++++- 8 files changed, 303 insertions(+), 45 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/game/XpDropEvent.java create mode 100644 runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java 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 58f9a56ac3..722f72c389 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -98,6 +98,15 @@ public final class AnimationID public static final int FISHING_DRAGON_HARPOON = 7401; public static final int FISHING_INFERNAL_HARPOON = 7402; public static final int FISHING_CRYSTAL_HARPOON = 8336; + public static final int CRYSTALLINE_RAT_DEATH = 8334; + public static final int CRYSTALLINE_BAT_DEATH = 4917; + public static final int CRYSTALLINE_WOLF_DEATH = 8335; + public static final int CRYSTALLINE_SPIDER_DEATH = 8338; + public static final int CRYSTALLINE_UNICORN_DEATH = 6377; + public static final int CRYSTALLINE_DRAGON_DEATH = 92; + public static final int CRYSTALLINE_BEAR_DEATH = 4929; + public static final int CRYSTALLINE_DARK_BEAST_DEATH = 2733; + public static final int CORRUPTED_SCORPION_DEATH = 6256; public static final int FISHING_OILY_ROD = 622; public static final int FISHING_KARAMBWAN = 1193; public static final int FISHING_CRUSHING_INFERNAL_EELS = 7553; diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index e54dda2e32..09c8310887 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -59,6 +59,7 @@ import net.runelite.client.eventbus.EventBus; import net.runelite.client.game.ClanManager; import net.runelite.client.game.ItemManager; import net.runelite.client.game.LootManager; +import net.runelite.client.game.XpDropManager; import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.menus.MenuManager; @@ -151,6 +152,9 @@ public class RuneLite @Inject private Provider lootManager; + @Inject + private Provider xpDropManager; + @Inject private Provider chatboxPanelManager; @@ -368,6 +372,7 @@ public class RuneLite chatMessageManager.get(); commandManager.get(); lootManager.get(); + xpDropManager.get(); chatboxPanelManager.get(); eventBus.subscribe(GameStateChanged.class, this, hooks::onGameStateChanged); diff --git a/runelite-client/src/main/java/net/runelite/client/game/LootManager.java b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java index 59ee0d988d..59370602da 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/LootManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java @@ -61,9 +61,27 @@ import net.runelite.client.events.PlayerLootReceived; @Slf4j public class LootManager { - private static final Map NPC_DEATH_ANIMATIONS = ImmutableMap.of( - NpcID.CAVE_KRAKEN, AnimationID.CAVE_KRAKEN_DEATH - ); + private static final Map NPC_DEATH_ANIMATIONS = ImmutableMap.builder() + .put(NpcID.CAVE_KRAKEN, AnimationID.CAVE_KRAKEN_DEATH) + .put(NpcID.CRYSTALLINE_BAT, AnimationID.CRYSTALLINE_BAT_DEATH) + .put(NpcID.CRYSTALLINE_RAT, AnimationID.CRYSTALLINE_RAT_DEATH) + .put(NpcID.CRYSTALLINE_SPIDER, AnimationID.CRYSTALLINE_SPIDER_DEATH) + .put(NpcID.CRYSTALLINE_WOLF, AnimationID.CRYSTALLINE_WOLF_DEATH) + .put(NpcID.CRYSTALLINE_UNICORN, AnimationID.CRYSTALLINE_UNICORN_DEATH) + .put(NpcID.CRYSTALLINE_SCORPION, AnimationID.CORRUPTED_SCORPION_DEATH) + .put(NpcID.CRYSTALLINE_DRAGON, AnimationID.CRYSTALLINE_DRAGON_DEATH) + .put(NpcID.CRYSTALLINE_DARK_BEAST, AnimationID.CRYSTALLINE_DARK_BEAST_DEATH) + .put(NpcID.CRYSTALLINE_BEAR, AnimationID.CRYSTALLINE_BEAR_DEATH) + .put(NpcID.CORRUPTED_BAT, AnimationID.CRYSTALLINE_BAT_DEATH) + .put(NpcID.CORRUPTED_RAT, AnimationID.CRYSTALLINE_RAT_DEATH) + .put(NpcID.CORRUPTED_SPIDER, AnimationID.CRYSTALLINE_SPIDER_DEATH) + .put(NpcID.CORRUPTED_WOLF, AnimationID.CRYSTALLINE_WOLF_DEATH) + .put(NpcID.CORRUPTED_UNICORN, AnimationID.CRYSTALLINE_UNICORN_DEATH) + .put(NpcID.CORRUPTED_SCORPION, AnimationID.CORRUPTED_SCORPION_DEATH) + .put(NpcID.CORRUPTED_DRAGON, AnimationID.CRYSTALLINE_DRAGON_DEATH) + .put(NpcID.CORRUPTED_DARK_BEAST, AnimationID.CRYSTALLINE_DARK_BEAST_DEATH) + .put(NpcID.CORRUPTED_BEAR, AnimationID.CRYSTALLINE_BEAR_DEATH) + .build(); private final EventBus eventBus; private final Client client; @@ -167,6 +185,7 @@ public class LootManager final Tile tile = itemSpawned.getTile(); final LocalPoint location = tile.getLocalLocation(); final int packed = location.getSceneX() << 8 | location.getSceneY(); + log.debug("storing items in {}", packed); itemSpawns.put(packed, new ItemStack(item.getId(), item.getQuantity(), location)); log.debug("Item spawn {} ({}) location {}", item.getId(), item.getQuantity(), location); } diff --git a/runelite-client/src/main/java/net/runelite/client/game/XpDropEvent.java b/runelite-client/src/main/java/net/runelite/client/game/XpDropEvent.java new file mode 100644 index 0000000000..6f1f36e2a1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/XpDropEvent.java @@ -0,0 +1,12 @@ +package net.runelite.client.game; + +import lombok.Data; +import net.runelite.api.Skill; +import net.runelite.api.events.Event; + +@Data +public class XpDropEvent implements Event +{ + private Skill skill; + private int exp; +} diff --git a/runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java b/runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java new file mode 100644 index 0000000000..b42cbdc99f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java @@ -0,0 +1,60 @@ +package net.runelite.client.game; + +import java.util.EnumMap; +import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; +import lombok.AccessLevel; +import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.client.eventbus.EventBus; + +@Singleton +public class XpDropManager +{ + + private final Map previousSkillExpTable = new EnumMap<>(Skill.class); + @Getter(AccessLevel.PACKAGE) + private int damage = 0; + @Getter(AccessLevel.PACKAGE) + private int tickShow = 0; + private int previousExpGained; + private Client client; + private EventBus eventBus; + + @Inject + private XpDropManager( + final EventBus eventBus, + final Client client + ) + { + this.client = client; + this.eventBus = eventBus; + eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); + eventBus.subscribe(ExperienceChanged.class, this, this::onExperienceChanged); + } + + private void onGameStateChanged(GameStateChanged event) + { + damage = 0; + tickShow = 0; + } + + private void onExperienceChanged(ExperienceChanged event) + { + final Skill skill = event.getSkill(); + final int xp = client.getSkillExperience(skill); + Integer previous = previousSkillExpTable.put(skill, xp); + if (previous != null) + { + previousExpGained = xp - previous; + XpDropEvent xpDropEvent = new XpDropEvent(); + xpDropEvent.setExp(previousExpGained); + xpDropEvent.setSkill(skill); + eventBus.post(XpDropEvent.class, xpDropEvent); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java index 91e8036c98..a2b4f94d9d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java @@ -29,8 +29,6 @@ package net.runelite.client.plugins.experiencedrop; import com.google.inject.Provides; import java.awt.Color; import java.util.Arrays; -import java.util.EnumMap; -import java.util.Map; import java.util.stream.IntStream; import javax.inject.Inject; import javax.inject.Singleton; @@ -46,7 +44,6 @@ import net.runelite.api.SpriteID; import net.runelite.api.Varbits; import net.runelite.api.WorldType; import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.ScriptCallbackEvent; @@ -57,6 +54,7 @@ import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.game.NPCManager; +import net.runelite.client.game.XpDropEvent; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; @@ -65,30 +63,23 @@ import net.runelite.client.util.ColorUtil; @PluginDescriptor( name = "XP Drop", description = "Enable customization of the way XP drops are displayed", - tags = {"experience", "levels", "tick"} -) + tags = {"experience", "levels", "tick"}) @Singleton public class XpDropPlugin extends Plugin { private static final int XPDROP_PADDING = 2; // space between xp drop icons private static final double HITPOINT_RATIO = 1.33; // Base rate of hp xp per point damage private static final double DMM_MULTIPLIER_RATIO = 10; - @Inject private Client client; - @Inject private XpDropConfig config; - @Inject private NPCManager npcManager; - @Inject private OverlayManager overlayManager; - @Inject private XpDropOverlay overlay; - @Inject private EventBus eventBus; @@ -106,16 +97,15 @@ public class XpDropPlugin extends Plugin private boolean hasDropped = false; private boolean correctPrayer; private Skill lastSkill = null; - private final Map previousSkillExpTable = new EnumMap<>(Skill.class); private PrayerType currentTickPrayer; private XpDropConfig.DamageMode damageMode; - private boolean hideSkillIcons; private Color getMeleePrayerColor; private Color getRangePrayerColor; private Color getMagePrayerColor; private int fakeXpDropDelay; private XpDropConfig.DamageMode showdamagedrops; + @Getter(AccessLevel.PACKAGE) private Color damageColor; @@ -153,10 +143,17 @@ public class XpDropPlugin extends Plugin eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); eventBus.subscribe(WidgetHiddenChanged.class, this, this::onWidgetHiddenChanged); eventBus.subscribe(GameTick.class, this, this::onGameTick); - eventBus.subscribe(ExperienceChanged.class, this, this::onExperienceChanged); + eventBus.subscribe(XpDropEvent.class, this, this::onXpDropEvent); eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent); } + private void onXpDropEvent(XpDropEvent event) + { + previousExpGained = event.getExp(); + lastSkill = event.getSkill(); + hasDropped = true; + } + private void onConfigChanged(ConfigChanged event) { if (!event.getGroup().equals("xpdrop")) @@ -188,8 +185,8 @@ public class XpDropPlugin extends Plugin private void onGameStateChanged(GameStateChanged event) { - damage = 0; tickShow = 0; + damage = 0; } private void onWidgetHiddenChanged(WidgetHiddenChanged event) @@ -269,9 +266,12 @@ public class XpDropPlugin extends Plugin switch (prayer) { case MELEE: - if (spriteIDs.anyMatch(id -> - id == SpriteID.SKILL_ATTACK || id == SpriteID.SKILL_STRENGTH || id == SpriteID.SKILL_DEFENCE - || correctPrayer)) + if (spriteIDs.anyMatch( + id -> + id == SpriteID.SKILL_ATTACK + || id == SpriteID.SKILL_STRENGTH + || id == SpriteID.SKILL_DEFENCE + || correctPrayer)) { color = this.getMeleePrayerColor.getRGB(); correctPrayer = true; @@ -351,21 +351,6 @@ public class XpDropPlugin extends Plugin client.runScript(XPDROP_DISABLED, lastSkill.ordinal(), previousExpGained); } - private void onExperienceChanged(ExperienceChanged event) - { - final Skill skill = event.getSkill(); - final int xp = client.getSkillExperience(skill); - - lastSkill = skill; - - Integer previous = previousSkillExpTable.put(skill, xp); - if (previous != null) - { - previousExpGained = xp - previous; - hasDropped = true; - } - } - private void onScriptCallbackEvent(ScriptCallbackEvent e) { if (this.showdamagedrops == XpDropConfig.DamageMode.NONE) @@ -404,16 +389,19 @@ public class XpDropPlugin extends Plugin final int exp = intStack[intStackSize - 1]; calculateDamageDealt(exp); } - else if (eventName.equals("xpDropAddDamage") && - damageMode == XpDropConfig.DamageMode.IN_XP_DROP && - damage > 0) + else if (eventName.equals("xpDropAddDamage") + && damageMode == XpDropConfig.DamageMode.IN_XP_DROP + && damage > 0) { final String[] stringStack = client.getStringStack(); final int stringStackSize = client.getStringStackSize(); - String builder = stringStack[stringStackSize - 1] + - ColorUtil.colorTag(this.damageColor) + - " (" + damage + ")"; + String builder = + stringStack[stringStackSize - 1] + + ColorUtil.colorTag(this.damageColor) + + " (" + + damage + + ")"; stringStack[stringStackSize - 1] = builder; } } @@ -431,7 +419,8 @@ public class XpDropPlugin extends Plugin Actor a = client.getLocalPlayer().getInteracting(); if (!(a instanceof NPC) && !(a instanceof Player)) { - // If we are interacting with nothing we may have clicked away at the perfect time fall back to last tick + // If we are interacting with nothing we may have clicked away at the perfect time fall back + // to last tick if (!(lastOpponent instanceof NPC) && !(lastOpponent instanceof Player)) { damage = (int) Math.rint(damageDealt); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletConfig.java index de9ed17d0d..134b32ae1d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletConfig.java @@ -321,4 +321,16 @@ public interface GauntletConfig extends Config { return false; } + + @ConfigItem( + position = 21, + keyName = "displayResources", + name = "Show raw resources gathered", + description = "Displays how much of each resource you have gathered.", + titleSection = "resources" + ) + default boolean displayGatheredResources() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletPlugin.java index 9b56c36b6c..d2c558497e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gauntlet/GauntletPlugin.java @@ -43,6 +43,7 @@ import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.GameState; import net.runelite.api.HeadIcon; +import net.runelite.api.ItemID; import net.runelite.api.NPC; import net.runelite.api.NPCDefinition; import net.runelite.api.NpcID; @@ -50,6 +51,7 @@ import net.runelite.api.ObjectID; import net.runelite.api.Player; import net.runelite.api.Projectile; import net.runelite.api.ProjectileID; +import net.runelite.api.Skill; import net.runelite.api.SoundEffectID; import net.runelite.api.Varbits; import net.runelite.api.events.AnimationChanged; @@ -58,6 +60,7 @@ import net.runelite.api.events.GameObjectDespawned; import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.ProjectileSpawned; @@ -65,6 +68,8 @@ import net.runelite.api.events.VarbitChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; +import net.runelite.client.events.NpcLootReceived; +import net.runelite.client.game.ItemManager; import net.runelite.client.game.SkillIconManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -73,7 +78,10 @@ import static net.runelite.client.plugins.gauntlet.Hunllef.BossAttack.LIGHTNING; import static net.runelite.client.plugins.gauntlet.Hunllef.BossAttack.MAGIC; import static net.runelite.client.plugins.gauntlet.Hunllef.BossAttack.PRAYER; import static net.runelite.client.plugins.gauntlet.Hunllef.BossAttack.RANGE; +import net.runelite.client.game.XpDropEvent; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.infobox.Counter; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @PluginDescriptor( name = "Gauntlet", @@ -104,7 +112,8 @@ public class GauntletPlugin extends Plugin ObjectID.PHREN_ROOTS_36066, ObjectID.FISHING_SPOT_36068, ObjectID.FISHING_SPOT_35971, ObjectID.GRYM_ROOT, ObjectID.GRYM_ROOT_36070, ObjectID.LINUM_TIRINUM, ObjectID.LINUM_TIRINUM_36072 ); - + private static final int GATHERING_HERB = 0; + private static final int GATHERING_CLOTH = 1; @Inject @Getter(AccessLevel.NONE) private Client client; @@ -138,6 +147,10 @@ public class GauntletPlugin extends Plugin @Setter(AccessLevel.PACKAGE) @Nullable private Hunllef hunllef; + @Inject + private InfoBoxManager infoBoxManager; + @Inject + private ItemManager itemManager; private boolean attackVisualOutline; private boolean completeStartup = false; private boolean displayTimerChat; @@ -160,11 +173,24 @@ public class GauntletPlugin extends Plugin private final Map items = new HashMap<>(); private final Set projectiles = new HashSet<>(); private final Set resources = new HashSet<>(); + private GauntletConfig.CounterDisplay countAttacks; private int resourceIconSize; private Set tornadoes = new HashSet<>(); private int projectileIconSize; - + private boolean displayResources; + private Counter oreCounter; + private Counter woodCounter; + private Counter clothCounter; + private Counter fishCounter; + private Counter herbCounter; + private int oresGathered; + private int woodGathered; + private int clothGathered; + private int fishGathered; + private int herbGathered; + private int currentFarmingAction = -1; + private boolean countersVisible = false; @Provides GauntletConfig getConfig(ConfigManager configManager) @@ -177,6 +203,7 @@ public class GauntletPlugin extends Plugin { addSubscriptions(); updateConfig(); + initializeCounters(); overlayManager.add(overlay); overlayManager.add(infoboxoverlay); overlayManager.add(GauntletCounter); @@ -200,6 +227,47 @@ public class GauntletPlugin extends Plugin } } + private void addCounters() + { + if (!countersVisible) + { + infoBoxManager.addInfoBox(oreCounter); + infoBoxManager.addInfoBox(woodCounter); + infoBoxManager.addInfoBox(clothCounter); + infoBoxManager.addInfoBox(fishCounter); + infoBoxManager.addInfoBox(herbCounter); + countersVisible = true; + } + } + + private void initializeCounters() + { + resetGatheringCounters(); + oreCounter = new Counter(itemManager.getImage(ItemID.CORRUPTED_ORE), this, 0); + woodCounter = new Counter(itemManager.getImage(ItemID.PHREN_BARK_23878), this, 0); + clothCounter = new Counter(itemManager.getImage(ItemID.LINUM_TIRINUM_23876), this, 0); + fishCounter = new Counter(itemManager.getImage(ItemID.RAW_PADDLEFISH), this, 0); + herbCounter = new Counter(itemManager.getImage(ItemID.GRYM_LEAF_23875), this, 0); + } + + private void resetGatheringCounters() + { + oresGathered = 0; + fishGathered = 0; + woodGathered = 0; + clothGathered = 0; + herbGathered = 0; + } + + private void updateCounters() + { + oreCounter.setCount(oresGathered); + woodCounter.setCount(woodGathered); + clothCounter.setCount(clothGathered); + fishCounter.setCount(fishGathered); + herbCounter.setCount(herbGathered); + } + @Override protected void shutDown() { @@ -213,12 +281,24 @@ public class GauntletPlugin extends Plugin overlayManager.remove(overlay); overlayManager.remove(infoboxoverlay); overlayManager.remove(GauntletCounter); + removeCounters(); + resetGatheringCounters(); resources.clear(); projectiles.clear(); tornadoes.clear(); setHunllef(null); } + private void removeCounters() + { + infoBoxManager.removeInfoBox(oreCounter); + infoBoxManager.removeInfoBox(woodCounter); + infoBoxManager.removeInfoBox(clothCounter); + infoBoxManager.removeInfoBox(fishCounter); + infoBoxManager.removeInfoBox(herbCounter); + countersVisible = false; + } + private void addSubscriptions() { eventBus.subscribe(AnimationChanged.class, this, this::onAnimationChanged); @@ -231,6 +311,56 @@ public class GauntletPlugin extends Plugin eventBus.subscribe(NpcSpawned.class, this, this::onNpcSpawned); eventBus.subscribe(ProjectileSpawned.class, this, this::onProjectileSpawned); eventBus.subscribe(VarbitChanged.class, this, this::onVarbitChanged); + eventBus.subscribe(XpDropEvent.class, this, this::onXpDropEvent); + eventBus.subscribe(NpcLootReceived.class, this, this::onNpcLootReceived); + eventBus.subscribe(MenuOptionClicked.class, this, this::onMenuOptionClicked); + } + + private void onMenuOptionClicked(MenuOptionClicked menuOptionClicked) + { + if (menuOptionClicked.getTarget().toUpperCase().contains("LINUM")) + { + currentFarmingAction = GATHERING_CLOTH; + } + if (menuOptionClicked.getTarget().toUpperCase().contains("GRYM")) + { + currentFarmingAction = GATHERING_HERB; + } + } + + private void onNpcLootReceived(NpcLootReceived npcLootReceived) + { + fishGathered += (int) npcLootReceived.getItems().stream().filter(item -> item.getId() == ItemID.RAW_PADDLEFISH).count(); + herbGathered += (int) npcLootReceived.getItems().stream().filter(item -> item.getId() == ItemID.GRYM_LEAF || item.getId() == ItemID.GRYM_LEAF_23875).count(); + updateCounters(); + } + + private void onXpDropEvent(XpDropEvent experienceChanged) + { + if (experienceChanged.getSkill().compareTo(Skill.MINING) == 0) + { + oresGathered++; + } + if (experienceChanged.getSkill().compareTo(Skill.WOODCUTTING) == 0) + { + woodGathered++; + } + if (experienceChanged.getSkill().compareTo(Skill.FARMING) == 0) + { + if (currentFarmingAction == GATHERING_HERB) + { + herbGathered++; + } + else if (currentFarmingAction == GATHERING_CLOTH) + { + clothGathered++; + } + } + if (experienceChanged.getSkill().compareTo(Skill.FISHING) == 0) + { + fishGathered++; + } + updateCounters(); } private void onAnimationChanged(AnimationChanged event) @@ -325,6 +455,18 @@ public class GauntletPlugin extends Plugin timerVisible = false; } } + + if (event.getKey().equals("displayResources")) + { + if (this.displayResources && this.startedGauntlet()) + { + addCounters(); + } + else + { + removeCounters(); + } + } } private void onGameObjectDespawned(GameObjectDespawned event) @@ -379,6 +521,7 @@ public class GauntletPlugin extends Plugin if (HUNLLEF_NPC_IDS.contains(npc.getId())) { setHunllef(null); + resetGatheringCounters(); } else if (TORNADO_NPC_IDS.contains(npc.getId())) { @@ -436,6 +579,14 @@ public class GauntletPlugin extends Plugin { timer.checkStates(true); } + if (startedGauntlet() && displayResources) + { + addCounters(); + } + else + { + removeCounters(); + } } boolean fightingBoss() @@ -468,5 +619,6 @@ public class GauntletPlugin extends Plugin this.displayTimerChat = config.displayTimerChat(); this.attackVisualOutline = config.attackVisualOutline(); this.highlightPrayerInfobox = config.highlightPrayerInfobox(); + this.displayResources = config.displayGatheredResources(); } } From b4346cf5f153009b3b05e87fb92f24bc752704a3 Mon Sep 17 00:00:00 2001 From: ReeeMan <39725162+ReeeMan@users.noreply.github.com> Date: Mon, 28 Oct 2019 01:20:40 +0000 Subject: [PATCH 098/185] Sanitize the Regex matcher since it still has nbsp in it (#1850) --- .../java/net/runelite/client/plugins/coxhelper/CoxPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 dbb1dc6ec1..2c7c15c4f1 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 @@ -223,7 +223,7 @@ public class CoxPlugin extends Plugin { final String fixedPlayerName = Text.sanitize(rawPlayerName); - if (fixedPlayerName.equals(tpMatcher.group(1))) + if (fixedPlayerName.equals(Text.sanitize(tpMatcher.group(1)))) { victims.add(new Victim(player, Victim.Type.TELEPORT)); } From c0b1651717b18afdf4ee3cd436f8db8023863a5a Mon Sep 17 00:00:00 2001 From: whocodes Date: Sun, 27 Oct 2019 22:12:06 -0400 Subject: [PATCH 099/185] mes: Fix Remove objects wildcard --- .../plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 6c92270e37..ce9eb67640 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 @@ -601,8 +601,7 @@ public class MenuEntrySwapperPlugin extends Plugin for (final String object : removedObjects) { if (target.equals(object) - || hasArrow && target.endsWith(object) - || targetLength > object.length() && target.startsWith(object)) + || hasArrow && target.endsWith(object)) { client.setMenuOptionCount(client.getMenuOptionCount() - 1); return; From 897cfffa015ac322a538da1df16b1fe92d4b6be8 Mon Sep 17 00:00:00 2001 From: trimbe Date: Sun, 27 Oct 2019 13:37:44 -0400 Subject: [PATCH 100/185] tabinterface: remember search after clicking deposit-x --- .../runelite/client/plugins/banktags/tabs/TabInterface.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index e6a3683daa..61b992036e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -606,9 +606,11 @@ public class TabInterface chatboxPanelManager.close(); } - if (event.getWidgetId() == WidgetInfo.BANK_ITEM_CONTAINER.getId() + if ((event.getWidgetId() == WidgetInfo.BANK_ITEM_CONTAINER.getId() + || event.getWidgetId() == WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER.getId()) && event.getMenuAction() == MenuAction.EXAMINE_ITEM_BANK_EQ - && event.getMenuOption().equalsIgnoreCase("withdraw-x")) + && (event.getMenuOption().equalsIgnoreCase("withdraw-x") + || event.getMenuOption().equalsIgnoreCase("deposit-x"))) { waitSearchTick = true; rememberedSearch = client.getVar(VarClientStr.INPUT_TEXT); From 6beddcb1e956c4b726f2b4fb8605fe230be28a52 Mon Sep 17 00:00:00 2001 From: Harry Freeborough Date: Mon, 28 Oct 2019 09:44:17 +0000 Subject: [PATCH 101/185] Correct capitalisations of "RuneScape" (#10142) --- .../main/java/net/runelite/client/config/ChatColorConfig.java | 4 ++-- .../plugins/cluescrolls/clues/hotcold/HotColdSolver.java | 2 +- .../net/runelite/client/plugins/hiscore/HiscorePanel.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java index c9a3e40d3d..e57be2942b 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java @@ -164,7 +164,7 @@ public interface ChatColorConfig extends Config position = 45, keyName = "opaqueServerMessage", name = "Server message", - description = "Color of Server Messages (eg. 'Welcome to Runescape')" + description = "Color of Server Messages (eg. 'Welcome to RuneScape')" ) Color opaqueServerMessage(); @@ -404,7 +404,7 @@ public interface ChatColorConfig extends Config position = 75, keyName = "transparentServerMessage", name = "Server message (transparent)", - description = "Color of Server Messages (eg. 'Welcome to Runescape') (transparent)" + description = "Color of Server Messages (eg. 'Welcome to RuneScape') (transparent)" ) Color transparentServerMessage(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdSolver.java index 87414f0387..052fef03ea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdSolver.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdSolver.java @@ -38,7 +38,7 @@ import net.runelite.api.coords.WorldPoint; *

* These puzzles are established by having some way to test the distance from the solution via "warmth", where being * colder means one is farther away from the target, and being warmer means one is closer to it, with the goal being to - * reach the most warm value to discover the solution point. Hot-cold puzzles in Old School Runescape are implemented + * reach the most warm value to discover the solution point. Hot-cold puzzles in Old School RuneScape are implemented * with specific set of solution points, so this solver will filter from a provided set of possible solutions as new * signals of temperatures and temperature changes are provided. */ diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index 0ddb3372f3..d61f8866db 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -97,7 +97,7 @@ import net.runelite.http.api.hiscore.Skill; @Slf4j public class HiscorePanel extends PluginPanel { - /* The maximum allowed username length in runescape accounts */ + /* The maximum allowed username length in RuneScape accounts */ private static final int MAX_USERNAME_LENGTH = 12; /** @@ -345,7 +345,7 @@ public class HiscorePanel extends PluginPanel return; } - /* Runescape usernames can't be longer than 12 characters long */ + /* RuneScape usernames can't be longer than 12 characters long */ if (lookup.length() > MAX_USERNAME_LENGTH) { searchBar.setIcon(IconTextField.Icon.ERROR); From 151ea90b2fbf95ab1abf68a6300a7486ad118294 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 28 Oct 2019 16:14:10 -0400 Subject: [PATCH 102/185] barrows plugin: remove minimap Removed at Jagex's request --- .../client/plugins/barrows/BarrowsConfig.java | 11 -- .../plugins/barrows/BarrowsOverlay.java | 134 +----------------- .../client/plugins/barrows/BarrowsPlugin.java | 97 +------------ 3 files changed, 2 insertions(+), 240 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java index 663e03fbb3..fe6a657e5e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsConfig.java @@ -32,17 +32,6 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("barrows") public interface BarrowsConfig extends Config { - @ConfigItem( - keyName = "showMinimap", - name = "Show Minimap in tunnels", - description = "Configures whether or not the minimap is displayed", - position = 0 - ) - default boolean showMinimap() - { - return true; - } - @ConfigItem( keyName = "showBrotherLoc", name = "Show Brothers location", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java index 4ecdebccf3..d430ef0c01 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsOverlay.java @@ -28,16 +28,9 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; -import java.util.List; import javax.inject.Inject; import net.runelite.api.Client; -import net.runelite.api.GameObject; -import net.runelite.api.NPC; -import net.runelite.api.NPCComposition; -import net.runelite.api.ObjectComposition; import net.runelite.api.Perspective; -import net.runelite.api.Player; -import net.runelite.api.WallObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.widgets.Widget; import net.runelite.client.ui.overlay.Overlay; @@ -65,59 +58,9 @@ class BarrowsOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - Player local = client.getLocalPlayer(); - final Color npcColor = getMinimapDotColor(1); - final Color playerColor = getMinimapDotColor(2); Widget puzzleAnswer = plugin.getPuzzleAnswer(); - // tunnels are only on z=0 - if (!plugin.getWalls().isEmpty() && client.getPlane() == 0 && config.showMinimap()) - { - // NPC dots - graphics.setColor(npcColor); - final List npcs = client.getNpcs(); - for (NPC npc : npcs) - { - final NPCComposition composition = npc.getComposition(); - - if (composition != null && !composition.isMinimapVisible()) - { - continue; - } - - net.runelite.api.Point minimapLocation = npc.getMinimapLocation(); - if (minimapLocation != null) - { - graphics.fillOval(minimapLocation.getX(), minimapLocation.getY(), 4, 4); - } - } - - // Player dots - graphics.setColor(playerColor); - final List players = client.getPlayers(); - for (Player player : players) - { - if (player == local) - { - // Skip local player as we draw square for it later - continue; - } - - net.runelite.api.Point minimapLocation = player.getMinimapLocation(); - if (minimapLocation != null) - { - graphics.fillOval(minimapLocation.getX(), minimapLocation.getY(), 4, 4); - } - } - - // Render barrows walls/doors - renderObjects(graphics, local); - - // Local player square - graphics.setColor(playerColor); - graphics.fillRect(local.getMinimapLocation().getX(), local.getMinimapLocation().getY(), 3, 3); - } - else if (config.showBrotherLoc()) + if (config.showBrotherLoc()) { renderBarrowsBrothers(graphics); } @@ -132,81 +75,6 @@ class BarrowsOverlay extends Overlay return null; } - private void renderObjects(Graphics2D graphics, Player localPlayer) - { - LocalPoint localLocation = localPlayer.getLocalLocation(); - for (WallObject wall : plugin.getWalls()) - { - LocalPoint location = wall.getLocalLocation(); - if (localLocation.distanceTo(location) <= MAX_DISTANCE) - { - renderWalls(graphics, wall); - } - } - - for (GameObject ladder : plugin.getLadders()) - { - LocalPoint location = ladder.getLocalLocation(); - if (localLocation.distanceTo(location) <= MAX_DISTANCE) - { - renderLadders(graphics, ladder); - } - } - } - - private void renderWalls(Graphics2D graphics, WallObject wall) - { - net.runelite.api.Point minimapLocation = wall.getMinimapLocation(); - - if (minimapLocation == null) - { - return; - } - - ObjectComposition objectComp = client.getObjectDefinition(wall.getId()); - ObjectComposition impostor = objectComp.getImpostorIds() != null ? objectComp.getImpostor() : null; - - if (impostor != null && impostor.getActions()[0] != null) - { - graphics.setColor(Color.green); - } - else - { - graphics.setColor(Color.gray); - } - - graphics.fillRect(minimapLocation.getX(), minimapLocation.getY(), 3, 3); - } - - /** - * Get minimap dot color from client - * @param typeIndex index of minimap dot type (1 npcs, 2 players) - * @return color - */ - private Color getMinimapDotColor(int typeIndex) - { - final int pixel = client.getMapDots()[typeIndex].getPixels()[1]; - return new Color(pixel); - } - - private void renderLadders(Graphics2D graphics, GameObject ladder) - { - net.runelite.api.Point minimapLocation = ladder.getMinimapLocation(); - - if (minimapLocation == null) - { - return; - } - - ObjectComposition objectComp = client.getObjectDefinition(ladder.getId()); - - if (objectComp.getImpostorIds() != null && objectComp.getImpostor() != null) - { - graphics.setColor(Color.orange); - graphics.fillRect(minimapLocation.getX(), minimapLocation.getY(), 6, 6); - } - } - private void renderBarrowsBrothers(Graphics2D graphics) { for (BarrowsBrothers brother : BarrowsBrothers.values()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java index 2d4db73d12..77619ba55a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java @@ -25,33 +25,19 @@ package net.runelite.client.plugins.barrows; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; import com.google.inject.Provides; import java.time.temporal.ChronoUnit; -import java.util.HashSet; -import java.util.Set; import javax.inject.Inject; -import lombok.AccessLevel; import lombok.Getter; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; -import net.runelite.api.GameObject; import net.runelite.api.GameState; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; -import net.runelite.api.NullObjectID; -import net.runelite.api.ObjectID; import net.runelite.api.SpriteID; -import net.runelite.api.WallObject; import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.GameObjectChanged; -import net.runelite.api.events.GameObjectDespawned; -import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.WallObjectChanged; -import net.runelite.api.events.WallObjectDespawned; -import net.runelite.api.events.WallObjectSpawned; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -75,21 +61,10 @@ import net.runelite.client.util.QuantityFormatter; @PluginDescriptor( name = "Barrows Brothers", description = "Show helpful information for the Barrows minigame", - tags = {"combat", "minigame", "minimap", "bosses", "pve", "pvm"} + tags = {"combat", "minigame", "bosses", "pve", "pvm"} ) public class BarrowsPlugin extends Plugin { - @Getter(AccessLevel.PACKAGE) - private static final Set BARROWS_WALLS = Sets.newHashSet - ( - ObjectID.DOOR_20678, NullObjectID.NULL_20681, NullObjectID.NULL_20682, NullObjectID.NULL_20683, NullObjectID.NULL_20684, NullObjectID.NULL_20685, NullObjectID.NULL_20686, NullObjectID.NULL_20687, - NullObjectID.NULL_20688, NullObjectID.NULL_20689, NullObjectID.NULL_20690, NullObjectID.NULL_20691, NullObjectID.NULL_20692, NullObjectID.NULL_20693, NullObjectID.NULL_20694, NullObjectID.NULL_20695, - NullObjectID.NULL_20696, ObjectID.DOOR_20697, NullObjectID.NULL_20700, NullObjectID.NULL_20701, NullObjectID.NULL_20702, NullObjectID.NULL_20703, NullObjectID.NULL_20704, NullObjectID.NULL_20705, - NullObjectID.NULL_20706, NullObjectID.NULL_20707, NullObjectID.NULL_20708, NullObjectID.NULL_20709, NullObjectID.NULL_20710, NullObjectID.NULL_20711, NullObjectID.NULL_20712, NullObjectID.NULL_20713, - NullObjectID.NULL_20714, NullObjectID.NULL_20715, NullObjectID.NULL_20728, NullObjectID.NULL_20730 - ); - - private static final Set BARROWS_LADDERS = Sets.newHashSet(NullObjectID.NULL_20675, NullObjectID.NULL_20676, NullObjectID.NULL_20677); private static final ImmutableList POSSIBLE_SOLUTIONS = ImmutableList.of( WidgetInfo.BARROWS_PUZZLE_ANSWER1, WidgetInfo.BARROWS_PUZZLE_ANSWER2, @@ -99,12 +74,6 @@ public class BarrowsPlugin extends Plugin private static final long PRAYER_DRAIN_INTERVAL_MS = 18200; private static final int CRYPT_REGION_ID = 14231; - @Getter(AccessLevel.PACKAGE) - private final Set walls = new HashSet<>(); - - @Getter(AccessLevel.PACKAGE) - private final Set ladders = new HashSet<>(); - private LoopTimer barrowsPrayerDrainTimer; private boolean wasInCrypt = false; @@ -156,8 +125,6 @@ public class BarrowsPlugin extends Plugin { overlayManager.remove(barrowsOverlay); overlayManager.remove(brotherOverlay); - walls.clear(); - ladders.clear(); puzzleAnswer = null; wasInCrypt = false; stopPrayerDrainTimer(); @@ -185,66 +152,6 @@ public class BarrowsPlugin extends Plugin } } - @Subscribe - public void onWallObjectSpawned(WallObjectSpawned event) - { - WallObject wallObject = event.getWallObject(); - if (BARROWS_WALLS.contains(wallObject.getId())) - { - walls.add(wallObject); - } - } - - @Subscribe - public void onWallObjectChanged(WallObjectChanged event) - { - WallObject previous = event.getPrevious(); - WallObject wallObject = event.getWallObject(); - - walls.remove(previous); - if (BARROWS_WALLS.contains(wallObject.getId())) - { - walls.add(wallObject); - } - } - - @Subscribe - public void onWallObjectDespawned(WallObjectDespawned event) - { - WallObject wallObject = event.getWallObject(); - walls.remove(wallObject); - } - - @Subscribe - public void onGameObjectSpawned(GameObjectSpawned event) - { - GameObject gameObject = event.getGameObject(); - if (BARROWS_LADDERS.contains(gameObject.getId())) - { - ladders.add(gameObject); - } - } - - @Subscribe - public void onGameObjectChanged(GameObjectChanged event) - { - GameObject previous = event.getPrevious(); - GameObject gameObject = event.getGameObject(); - - ladders.remove(previous); - if (BARROWS_LADDERS.contains(gameObject.getId())) - { - ladders.add(gameObject); - } - } - - @Subscribe - public void onGameObjectDespawned(GameObjectDespawned event) - { - GameObject gameObject = event.getGameObject(); - ladders.remove(gameObject); - } - @Subscribe public void onGameStateChanged(GameStateChanged event) { @@ -252,8 +159,6 @@ public class BarrowsPlugin extends Plugin { wasInCrypt = isInCrypt(); // on region changes the tiles get set to null - walls.clear(); - ladders.clear(); puzzleAnswer = null; } else if (event.getGameState() == GameState.LOGGED_IN) From a2166f121599c8c570c1f336400971c487f3844b Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 28 Oct 2019 18:05:35 -0400 Subject: [PATCH 103/185] http-api: centralize json mediatype --- http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java | 2 ++ .../java/net/runelite/http/api/ge/GrandExchangeClient.java | 3 +-- .../net/runelite/http/api/loottracker/LootTrackerClient.java | 3 +-- .../src/main/java/net/runelite/http/api/xtea/XteaClient.java | 4 +--- 4 files changed, 5 insertions(+), 7 deletions(-) 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 472c241f72..2f0ba34bc0 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 @@ -31,6 +31,7 @@ import java.util.Properties; import java.util.concurrent.TimeUnit; import okhttp3.HttpUrl; import okhttp3.Interceptor; +import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -45,6 +46,7 @@ public class RuneLiteAPI public static final OkHttpClient CLIENT; public static final Gson GSON = new Gson(); + public static final MediaType JSON = MediaType.parse("application/json"); public static String userAgent; private static final String BASE = "https://api.runelite.net"; diff --git a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java index a1b97bc390..78e64d383a 100644 --- a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java +++ b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeClient.java @@ -30,10 +30,10 @@ import java.util.UUID; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import static net.runelite.http.api.RuneLiteAPI.JSON; import okhttp3.Call; import okhttp3.Callback; import okhttp3.HttpUrl; -import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; @@ -42,7 +42,6 @@ import okhttp3.Response; @AllArgsConstructor public class GrandExchangeClient { - private static final MediaType JSON = MediaType.parse("application/json"); private static final Gson GSON = RuneLiteAPI.GSON; private final UUID uuid; diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java index 59d1a567ff..71eb151364 100644 --- a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java @@ -36,10 +36,10 @@ import java.util.UUID; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; +import static net.runelite.http.api.RuneLiteAPI.JSON; import okhttp3.Call; import okhttp3.Callback; import okhttp3.HttpUrl; -import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; @@ -48,7 +48,6 @@ import okhttp3.Response; @AllArgsConstructor public class LootTrackerClient { - private static final MediaType JSON = MediaType.parse("application/json"); private static final Gson GSON = RuneLiteAPI.GSON; private final UUID uuid; diff --git a/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java b/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java index e4ee2c22b9..42b10e3239 100644 --- a/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java +++ b/http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java @@ -31,10 +31,10 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.List; import net.runelite.http.api.RuneLiteAPI; +import static net.runelite.http.api.RuneLiteAPI.JSON; import okhttp3.Call; import okhttp3.Callback; import okhttp3.HttpUrl; -import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; @@ -43,8 +43,6 @@ import org.slf4j.LoggerFactory; public class XteaClient { - private static final MediaType JSON = MediaType.parse("application/json"); - private static final Logger logger = LoggerFactory.getLogger(XteaClient.class); public void submit(XteaRequest xteaRequest) From 66e7acd86f11b0ab2a813a759b6dcc87392b4672 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 24 Oct 2019 13:29:05 -0600 Subject: [PATCH 104/185] music: check parent and siblings for null --- .../client/plugins/music/MusicPlugin.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index dd99b8ad5e..6f3496a922 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -411,13 +411,21 @@ public class MusicPlugin extends Plugin { { Widget handle = slider.getHandle(); - Widget[] siblings = handle.getParent().getChildren(); - if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + Widget parent = handle.getParent(); + if (parent == null) { continue; } - siblings[slider.getTrack().getIndex()] = null; - siblings[handle.getIndex()] = null; + else + { + Widget[] siblings = parent.getChildren(); + if (siblings == null || handle.getIndex() >= siblings.length || siblings[handle.getIndex()] != handle) + { + continue; + } + siblings[slider.getTrack().getIndex()] = null; + siblings[handle.getIndex()] = null; + } } Object[] init = icon.getOnLoadListener(); @@ -444,11 +452,19 @@ public class MusicPlugin extends Plugin Widget handle = slider.getHandle(); if (handle != null) { - Widget[] siblings = handle.getParent().getChildren(); - if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + Widget parent = handle.getParent(); + if (parent == null) { handle = null; } + else + { + Widget[] siblings = parent.getChildren(); + if (siblings == null || handle.getIndex() >= siblings.length || siblings[handle.getIndex()] != handle) + { + handle = null; + } + } } if (handle == null) { From b123ad667a8f4f14419f4c27454d7506820fdccb Mon Sep 17 00:00:00 2001 From: Joel <47850057+PERSS0N@users.noreply.github.com> Date: Tue, 29 Oct 2019 23:01:20 +0100 Subject: [PATCH 105/185] Add item mapping for Berserker Necklace (or) (#10158) --- .../src/main/java/net/runelite/client/game/ItemMapping.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java index 638dfcb19b..47cb63556e 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java @@ -106,6 +106,8 @@ public enum ItemMapping ITEM_FURY_ORNAMENT_KIT(FURY_ORNAMENT_KIT, AMULET_OF_FURY_OR), ITEM_TORMENTED_BRACELET(TORMENTED_BRACELET, TORMENTED_BRACELET_OR), ITEM_TORMENTED_ORNAMENT_KIT(TORMENTED_ORNAMENT_KIT, TORMENTED_BRACELET_OR), + ITEM_BERSERKER_NECKLACE(BERSERKER_NECKLACE, BERSERKER_NECKLACE_OR), + ITEM_BERSERKER_NECKLACE_ORNAMENT_KIT(BERSERKER_NECKLACE_ORNAMENT_KIT, BERSERKER_NECKLACE_OR), // Ensouled heads ITEM_ENSOULED_GOBLIN_HEAD(ENSOULED_GOBLIN_HEAD_13448, ENSOULED_GOBLIN_HEAD), From 2655654c9f052bfeb51cac53be63b62f13f3c4ea Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 30 Oct 2019 04:22:38 +0100 Subject: [PATCH 106/185] project: merge upstream --- .../cache/definitions/NpcDefinition.java | 53 +++++++++--------- .../cache/definitions/loaders/NpcLoader.java | 56 +++++++++---------- .../cache/definitions/savers/NpcSaver.java | 48 ++++++++-------- .../http/service/config/ConfigService.java | 6 +- .../src/main/resources/application.yaml | 1 + .../api/events/AreaSoundEffectPlayed.java | 11 ++++ .../api/events/SoundEffectPlayed.java | 11 ++++ .../runelite/api/events/VolumeChanged.java | 24 +++++--- .../plugins/devtools/SoundEffectOverlay.java | 1 + .../runelite/client/plugins/gpu/GLUtil.java | 3 + .../client/plugins/music/MusicConfig.java | 11 ++++ .../client/plugins/music/MusicPlugin.java | 18 +++++- .../client/plugins/raids/RaidsConfig.java | 2 +- .../client/plugins/raids/RaidsOverlay.java | 3 + .../client/plugins/raids/RaidsPlugin.java | 42 +++++++------- .../plugins/worldmap/QuestStartLocation.java | 4 +- .../runelite/client/plugins/gpu/common.glsl | 6 +- .../client/plugins/gpu/common_func.glsl | 6 +- .../net/runelite/client/plugins/gpu/geom.glsl | 6 +- .../client/plugins/gpu/to_screen.glsl | 26 ++++----- .../net/runelite/mixins/RSClientMixin.java | 3 +- .../net/runelite/mixins/SoundEffectMixin.java | 4 +- .../data/dump/wiki/NpcStatsDumper.java | 2 +- 23 files changed, 206 insertions(+), 141 deletions(-) diff --git a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java index 8ba160c97a..ddfabfe367 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java +++ b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java @@ -31,38 +31,37 @@ import lombok.Data; @Data public class NpcDefinition { - public final int id; - public short[] recolorToFind; - public int rotation = 32; public String name = "null"; - public short[] recolorToReplace; + public int size = 1; public int[] models; - public int[] models_2; - public int stanceAnimation = -1; - public int anInt2165 = -1; - public int tileSpacesOccupied = 1; - public int walkAnimation = -1; - public short[] retextureToReplace; - public int rotate90RightAnimation = -1; - public boolean aBool2170 = true; - public int resizeX = 128; - public int contrast = 0; + public int[] chatheadModels; + public int standingAnimation = -1; + public int rotateLeftAnimation = -1; + public int rotateRightAnimation = -1; + public int walkingAnimation = -1; public int rotate180Animation = -1; - public int varbitIndex = -1; - public String[] options = new String[5]; - public boolean renderOnMinimap = true; - public int combatLevel = -1; + public int rotate90RightAnimation = -1; public int rotate90LeftAnimation = -1; - public int resizeY = 128; - public boolean hasRenderPriority = false; - public int ambient = 0; - public int headIcon = -1; - public int[] configs; + public short[] recolorToFind; + public short[] recolorToReplace; public short[] retextureToFind; + public short[] retextureToReplace; + public String[] actions = new String[5]; + public boolean isMinimapVisible = true; + public int combatLevel = -1; + public int widthScale = 128; + public int heightScale = 128; + public boolean hasRenderPriority; + public int ambient; + public int contrast; + public int headIcon = -1; + public int rotationSpeed = 32; + public int[] configs; + public int varbitId = -1; public int varpIndex = -1; - public boolean isClickable = true; - public int anInt2189 = -1; - public boolean aBool2190 = false; - public Map params = null; + public boolean isInteractable = true; + public boolean rotationFlag = true; + public boolean isPet; + public Map params; } diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java index 478ef2660a..0ce81f864b 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java @@ -24,13 +24,12 @@ */ package net.runelite.cache.definitions.loaders; +import java.util.HashMap; import net.runelite.cache.definitions.NpcDefinition; import net.runelite.cache.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; - public class NpcLoader { private static final Logger logger = LoggerFactory.getLogger(NpcLoader.class); @@ -67,7 +66,6 @@ public class NpcLoader { def.models[index] = stream.readUnsignedShort(); } - } else if (opcode == 2) { @@ -75,37 +73,37 @@ public class NpcLoader } else if (opcode == 12) { - def.tileSpacesOccupied = stream.readUnsignedByte(); + def.size = stream.readUnsignedByte(); } else if (opcode == 13) { - def.stanceAnimation = stream.readUnsignedShort(); + def.standingAnimation = stream.readUnsignedShort(); } else if (opcode == 14) { - def.walkAnimation = stream.readUnsignedShort(); + def.walkingAnimation = stream.readUnsignedShort(); } else if (opcode == 15) { - def.anInt2165 = stream.readUnsignedShort(); + def.rotateLeftAnimation = stream.readUnsignedShort(); } else if (opcode == 16) { - def.anInt2189 = stream.readUnsignedShort(); + def.rotateRightAnimation = stream.readUnsignedShort(); } else if (opcode == 17) { - def.walkAnimation = stream.readUnsignedShort(); + def.walkingAnimation = stream.readUnsignedShort(); def.rotate180Animation = stream.readUnsignedShort(); def.rotate90RightAnimation = stream.readUnsignedShort(); def.rotate90LeftAnimation = stream.readUnsignedShort(); } else if (opcode >= 30 && opcode < 35) { - def.options[opcode - 30] = stream.readString(); - if (def.options[opcode - 30].equalsIgnoreCase("Hidden")) + def.actions[opcode - 30] = stream.readString(); + if (def.actions[opcode - 30].equalsIgnoreCase("Hidden")) { - def.options[opcode - 30] = null; + def.actions[opcode - 30] = null; } } else if (opcode == 40) @@ -137,17 +135,17 @@ public class NpcLoader else if (opcode == 60) { length = stream.readUnsignedByte(); - def.models_2 = new int[length]; + def.chatheadModels = new int[length]; for (index = 0; index < length; ++index) { - def.models_2[index] = stream.readUnsignedShort(); + def.chatheadModels[index] = stream.readUnsignedShort(); } } else if (opcode == 93) { - def.renderOnMinimap = false; + def.isMinimapVisible = false; } else if (opcode == 95) { @@ -155,11 +153,11 @@ public class NpcLoader } else if (opcode == 97) { - def.resizeX = stream.readUnsignedShort(); + def.widthScale = stream.readUnsignedShort(); } else if (opcode == 98) { - def.resizeY = stream.readUnsignedShort(); + def.heightScale = stream.readUnsignedShort(); } else if (opcode == 99) { @@ -179,18 +177,18 @@ public class NpcLoader } else if (opcode == 103) { - def.rotation = stream.readUnsignedShort(); + def.rotationSpeed = stream.readUnsignedShort(); } else if (opcode == 106) { - def.varbitIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varbitIndex) + def.varbitId = stream.readUnsignedShort(); + if (def.varbitId == 65535) { - def.varbitIndex = -1; + def.varbitId = -1; } def.varpIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varpIndex) + if (def.varpIndex == 65535) { def.varpIndex = -1; } @@ -212,26 +210,26 @@ public class NpcLoader } else if (opcode == 107) { - def.isClickable = false; + def.isInteractable = false; } else if (opcode == 109) { - def.aBool2170 = false; + def.rotationFlag = false; } else if (opcode == 111) { - def.aBool2190 = true; + def.isPet = true; } else if (opcode == 118) { - def.varbitIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varbitIndex) + def.varbitId = stream.readUnsignedShort(); + if (def.varbitId == 65535) { - def.varbitIndex = -1; + def.varbitId = -1; } def.varpIndex = stream.readUnsignedShort(); - if ('\uffff' == def.varpIndex) + if (def.varpIndex == 65535) { def.varpIndex = -1; } diff --git a/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java b/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java index 55d4b966e9..577681cf80 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java +++ b/cache/src/main/java/net/runelite/cache/definitions/savers/NpcSaver.java @@ -47,45 +47,45 @@ public class NpcSaver out.writeByte(2); out.writeString(npc.name); } - if (npc.tileSpacesOccupied != 1) + if (npc.size != 1) { out.writeByte(12); - out.writeByte(npc.tileSpacesOccupied); + out.writeByte(npc.size); } - if (npc.stanceAnimation != -1) + if (npc.standingAnimation != -1) { out.writeByte(13); - out.writeShort(npc.stanceAnimation); + out.writeShort(npc.standingAnimation); } - if (npc.walkAnimation != -1) + if (npc.walkingAnimation != -1) { out.writeByte(14); - out.writeShort(npc.walkAnimation); + out.writeShort(npc.walkingAnimation); } - if (npc.anInt2165 != -1) + if (npc.rotateLeftAnimation != -1) { out.writeByte(15); - out.writeShort(npc.anInt2165); + out.writeShort(npc.rotateLeftAnimation); } - if (npc.anInt2189 != -1) + if (npc.rotateRightAnimation != -1) { out.writeByte(16); - out.writeShort(npc.anInt2189); + out.writeShort(npc.rotateRightAnimation); } if (npc.rotate180Animation != -1 || npc.rotate90LeftAnimation != -1 || npc.rotate90RightAnimation != -1) { out.writeByte(17); - out.writeShort(npc.walkAnimation); + out.writeShort(npc.walkingAnimation); out.writeShort(npc.rotate180Animation); out.writeShort(npc.rotate90RightAnimation); out.writeShort(npc.rotate90LeftAnimation); } for (int i = 0; i < 5; ++i) { - if (npc.options[i] != null) + if (npc.actions[i] != null) { out.writeByte(30 + i); - out.writeString(npc.options[i]); + out.writeString(npc.actions[i]); } } if (npc.recolorToFind != null && npc.recolorToReplace != null) @@ -108,16 +108,16 @@ public class NpcSaver out.writeShort(npc.retextureToReplace[i]); } } - if (npc.models_2 != null) + if (npc.chatheadModels != null) { out.writeByte(60); - out.writeByte(npc.models_2.length); - for (int modelId : npc.models_2) + out.writeByte(npc.chatheadModels.length); + for (int modelId : npc.chatheadModels) { out.writeShort(modelId); } } - if (!npc.renderOnMinimap) + if (!npc.isMinimapVisible) { out.writeByte(93); } @@ -127,9 +127,9 @@ public class NpcSaver out.writeShort(npc.combatLevel); } out.writeByte(97); - out.writeShort(npc.resizeX); + out.writeShort(npc.widthScale); out.writeByte(98); - out.writeShort(npc.resizeY); + out.writeShort(npc.heightScale); if (npc.hasRenderPriority) { out.writeByte(99); @@ -144,23 +144,23 @@ public class NpcSaver out.writeShort(npc.headIcon); } out.writeByte(103); - out.writeShort(npc.rotation); - if (!npc.isClickable) + out.writeShort(npc.rotationSpeed); + if (!npc.isInteractable) { out.writeByte(107); } - if (!npc.aBool2170) + if (!npc.rotationFlag) { out.writeByte(109); } - if (npc.aBool2190) + if (npc.isPet) { out.writeByte(111); } if (npc.configs != null) { out.writeByte(118); - out.writeShort(npc.varbitIndex); + out.writeShort(npc.varbitId); out.writeShort(npc.varpIndex); int[] c = npc.configs; diff --git a/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java b/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java index bbe8557d88..727620570f 100644 --- a/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java +++ b/http-service/src/main/java/net/runelite/http/service/config/ConfigService.java @@ -51,6 +51,7 @@ import net.runelite.http.api.config.ConfigEntry; import net.runelite.http.api.config.Configuration; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service @@ -66,11 +67,12 @@ public class ConfigService @Autowired public ConfigService( - MongoClient mongoClient + MongoClient mongoClient, + @Value("${mongo.database}") String databaseName ) { - MongoDatabase database = mongoClient.getDatabase("config"); + MongoDatabase database = mongoClient.getDatabase(databaseName); MongoCollection collection = database.getCollection("config"); this.mongoCollection = collection; diff --git a/http-service/src/main/resources/application.yaml b/http-service/src/main/resources/application.yaml index ce902b76cb..f5e1a799d9 100644 --- a/http-service/src/main/resources/application.yaml +++ b/http-service/src/main/resources/application.yaml @@ -32,6 +32,7 @@ redis: mongo: jndiName: java:comp/env/mongodb/runelite + database: runelite # Twitter client for feed runelite: diff --git a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java index 084ba26f73..13f76eab65 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java +++ b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java @@ -24,14 +24,25 @@ */ package net.runelite.api.events; +import javax.annotation.Nullable; import lombok.Data; +import net.runelite.api.Actor; @Data public class AreaSoundEffectPlayed implements Event { + @Nullable + private final Actor source; private int soundId; private int sceneX; private int sceneY; private int range; private int delay; + + private boolean consumed; + + public void consume() + { + consumed = true; + } } 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 index 640a5f1282..628ba5b58d 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java +++ b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java @@ -24,11 +24,22 @@ */ package net.runelite.api.events; +import javax.annotation.Nullable; import lombok.Data; +import net.runelite.api.Actor; @Data public class SoundEffectPlayed implements Event { + @Nullable + private final Actor source; private int soundId; private int delay; + + private boolean consumed; + + public void consume() + { + consumed = true; + } } diff --git a/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java index 7f846cd214..d5aa7da10e 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java @@ -1,15 +1,16 @@ /* - * Copyright (c) 2017, Adam + * Copyright (c) 2019, Adam + * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 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 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 @@ -24,12 +25,17 @@ */ package net.runelite.api.events; +import lombok.Value; + +@Value public class VolumeChanged implements Event { - public static final VolumeChanged INSTANCE = new VolumeChanged(); - - private VolumeChanged() + public enum Type { - // noop + MUSIC, + EFFECTS, + AREA } -} + + private final Type type; +} \ No newline at end of file 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 index e98e0ef01e..ea9f060ee6 100644 --- 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 @@ -110,6 +110,7 @@ class SoundEffectOverlay extends Overlay String text = "Id: " + event.getSoundId() + + " - S: " + (event.getSource() != null ? event.getSource().getName() : "") + " - L: " + event.getSceneX() + "," + event.getSceneY() + " - R: " + event.getRange() + " - D: " + event.getDelay(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java index 48b597c2c0..7c51d67e62 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GLUtil.java @@ -27,7 +27,9 @@ package net.runelite.client.plugins.gpu; import com.jogamp.opengl.GL4; import java.io.InputStream; import java.util.Scanner; +import lombok.extern.slf4j.Slf4j; +@Slf4j class GLUtil { private static final int ERR_LEN = 1024; @@ -197,6 +199,7 @@ class GLUtil else { String err = glGetShaderInfoLog(gl, shader); + log.info(String.valueOf(program)); throw new ShaderException(err); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java index fa2ebbcbbd..94f30fd07c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -31,6 +31,16 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("music") public interface MusicConfig extends Config { + @ConfigItem( + keyName = "muteOtherAreaSounds", + name = "Mute others' area sounds", + description = "Mute area sounds caused from other players" + ) + default boolean muteOtherAreaSounds() + { + return false; + } + @ConfigItem( keyName = "musicVolume", name = "", @@ -60,6 +70,7 @@ public interface MusicConfig extends Config { return 0; } + @ConfigItem( keyName = "soundEffectVolume", name = "", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 5d251e19ae..183e1deee7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -38,13 +38,16 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.Player; import net.runelite.api.ScriptID; import net.runelite.api.SoundEffectID; import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; import net.runelite.api.VarPlayer; +import net.runelite.api.events.AreaSoundEffectPlayed; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.ScriptCallbackEvent; @@ -138,6 +141,7 @@ public class MusicPlugin extends Plugin eventBus.subscribe(VarClientIntChanged.class, this, this::onVarClientIntChanged); eventBus.subscribe(VolumeChanged.class, this, this::onVolumeChanged); eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent); + eventBus.subscribe(AreaSoundEffectPlayed.class, this, this::onAreaSoundEffectPlayed); } private void onGameStateChanged(GameStateChanged gameStateChanged) @@ -216,6 +220,7 @@ public class MusicPlugin extends Plugin private void onVolumeChanged(VolumeChanged volumeChanged) { + log.info(volumeChanged.getType().toString()); applyMusicVolumeConfig(); } @@ -229,8 +234,6 @@ public class MusicPlugin extends Plugin private void applyMusicVolumeConfig() { - log.info("applyMusicVolumeConfig"); - int musicVolume = musicConfig.getMusicVolume(); if (musicVolume > 0) { @@ -546,4 +549,15 @@ public class MusicPlugin extends Plugin client.getIntStack()[client.getIntStackSize() - 1] = -1; } } + + private void onAreaSoundEffectPlayed(AreaSoundEffectPlayed areaSoundEffectPlayed) + { + Actor source = areaSoundEffectPlayed.getSource(); + if (source != client.getLocalPlayer() + && source instanceof Player + && musicConfig.muteOtherAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + } } \ No newline at end of file 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 b52e719b2b..419ec8cefb 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 @@ -203,7 +203,7 @@ public interface RaidsConfig extends Config ) default boolean displayLayoutMessage() { - return true; + return false; } @ConfigTitleSection( 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 c8c2d2bdd3..0288f106d9 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 @@ -41,6 +41,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import net.runelite.api.Client; +import static net.runelite.api.MenuOpcode.RUNELITE_OVERLAY; import static net.runelite.api.MenuOpcode.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.SpriteID; import net.runelite.api.widgets.WidgetInfo; @@ -72,6 +73,7 @@ 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; + static final String BROADCAST_ACTION = "Broadcast layout"; private final PanelComponent panelComponent = new PanelComponent(); private final ItemManager itemManager; private final SpriteManager spriteManager; @@ -101,6 +103,7 @@ public class RaidsOverlay extends Overlay this.itemManager = itemManager; this.spriteManager = spriteManager; getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids overlay")); + getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY, BROADCAST_ACTION, "Raids overlay")); } @Override 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 6e345fe977..b433251e6f 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 @@ -550,21 +550,27 @@ public class RaidsPlugin extends Plugin private void onOverlayMenuClicked(OverlayMenuClicked event) { OverlayMenuEntry entry = event.getEntry(); - if (entry.getMenuOpcode() == MenuOpcode.RUNELITE_OVERLAY && - entry.getTarget().equals("Raids party overlay")) + if (entry.getMenuOpcode() == MenuOpcode.RUNELITE_OVERLAY) { - switch (entry.getOption()) + if (entry.getTarget().equals("Raids party overlay")) { - case RaidsPartyOverlay.PARTY_OVERLAY_RESET: - startingPartyMembers.clear(); - updatePartyMembers(true); - missingPartyMembers.clear(); - break; - case RaidsPartyOverlay.PARTY_OVERLAY_REFRESH: - updatePartyMembers(true); - break; - default: - break; + switch (entry.getOption()) + { + case RaidsPartyOverlay.PARTY_OVERLAY_RESET: + startingPartyMembers.clear(); + updatePartyMembers(true); + missingPartyMembers.clear(); + break; + case RaidsPartyOverlay.PARTY_OVERLAY_REFRESH: + updatePartyMembers(true); + break; + default: + break; + } + } + else if (entry.getOption().equals(RaidsOverlay.BROADCAST_ACTION) && event.getOverlay() == overlay) + { + sendRaidLayoutMessage(); } } } @@ -670,7 +676,10 @@ public class RaidsPlugin extends Plugin raid.updateLayout(layout); RotationSolver.solve(raid.getCombatRooms()); setOverlayStatus(true); - sendRaidLayoutMessage(); + if (this.displayLayoutMessage) + { + sendRaidLayoutMessage(); + } Matcher puzzleMatch = PUZZLES.matcher(raid.getFullRotationString()); final List puzzles = new ArrayList<>(); while (puzzleMatch.find()) @@ -709,11 +718,6 @@ public class RaidsPlugin extends Plugin private void sendRaidLayoutMessage() { - if (!this.displayLayoutMessage) - { - return; - } - final String layout = getRaid().getLayout().toCodeString(); final String rooms = getRaid().toRoomString(); final String raidData = "[" + layout + "]: " + rooms; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java index 5991410161..3014e0f0b5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/QuestStartLocation.java @@ -58,7 +58,7 @@ enum QuestStartLocation //Members' Quests ANIMAL_MAGNETISM(Quest.ANIMAL_MAGNETISM, new WorldPoint(3094, 3360, 0)), ANOTHER_SLICE_OF_HAM(Quest.ANOTHER_SLICE_OF_HAM, new WorldPoint(2799, 5428, 0)), - THE_ASCENT_OF_ARCEUUS(Quest.THE_ASCENT_OF_ARCEUUS, new WorldPoint(1700, 3742, 0)), + THE_ASCENT_OF_ARCEUUS(Quest.THE_ASCENT_OF_ARCEUUS, new WorldPoint(1699, 3742, 0)), BETWEEN_A_ROCK(Quest.BETWEEN_A_ROCK, new WorldPoint(2823, 10168, 0)), BIG_CHOMPY_BIRD_HUNTING(Quest.BIG_CHOMPY_BIRD_HUNTING, new WorldPoint(2629, 2981, 0)), BIOHAZARD(Quest.BIOHAZARD, new WorldPoint(2591, 3335, 0)), @@ -72,7 +72,7 @@ enum QuestStartLocation DARKNESS_OF_HALLOWVALE(Quest.DARKNESS_OF_HALLOWVALE, new WorldPoint(3494, 9628, 0)), DEATH_PLATEAU_TROLL_STRONGHOLD(new Quest[]{Quest.DEATH_PLATEAU, Quest.TROLL_STRONGHOLD}, new WorldPoint(2895, 3528, 0)), DEATH_TO_THE_DORGESHUUN(Quest.DEATH_TO_THE_DORGESHUUN, new WorldPoint(3316, 9613, 0)), - THE_DEPTHS_OF_DESPAIR(Quest.THE_DEPTHS_OF_DESPAIR, new WorldPoint(1780, 3569, 0)), + THE_DEPTHS_OF_DESPAIR(Quest.THE_DEPTHS_OF_DESPAIR, new WorldPoint(1781, 3570, 0)), DESERT_TREASURE(Quest.DESERT_TREASURE, new WorldPoint(3177, 3043, 0)), DEVIOUS_MINDS(Quest.DEVIOUS_MINDS, new WorldPoint(3405, 3492, 0)), THE_DIG_SITE(Quest.THE_DIG_SITE, new WorldPoint(3363, 3337, 0)), diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl index 207e8300a1..55c3b9e6c3 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl @@ -74,9 +74,9 @@ bool face_visible(ivec4 vA, ivec4 vB, ivec4 vC, ivec4 position, int cameraYaw, i vB += position - cameraPos; vC += position - cameraPos; - ivec3 sA = toScreen(vA.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 sB = toScreen(vB.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 sC = toScreen(vC.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sA = toScreen(vA.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sB = toScreen(vB.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sC = toScreen(vC.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); return (sA.x - sB.x) * (sC.y - sB.y) - (sC.x - sB.x) * (sA.y - sB.y) > 0; } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl index 89b5231d3d..cde151872a 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common_func.glsl @@ -74,9 +74,9 @@ bool face_visible(ivec4 vA, ivec4 vB, ivec4 vC, ivec4 position, int cameraYaw, i vB += position - cameraPos; vC += position - cameraPos; - ivec3 sA = toScreen(vA.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 sB = toScreen(vB.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 sC = toScreen(vC.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sA = toScreen(vA.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sB = toScreen(vB.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 sC = toScreen(vC.xyz, cameraYaw, cameraPitch, centerX, centerY, zoom); return (sA.x - sB.x) * (sC.y - sB.y) - (sC.x - sB.x) * (sA.y - sB.y) > 0; } \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl index 28a339f788..0f7f1bad23 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/geom.glsl @@ -60,9 +60,9 @@ out float fogAmount; void main() { ivec3 cameraPos = ivec3(cameraX, cameraY, cameraZ); - ivec3 screenA = toScreen(vPosition[0] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 screenB = toScreen(vPosition[1] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); - ivec3 screenC = toScreen(vPosition[2] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 screenA = toScreen(vPosition[0] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 screenB = toScreen(vPosition[1] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); + vec3 screenC = toScreen(vPosition[2] - cameraPos, cameraYaw, cameraPitch, centerX, centerY, zoom); if (-screenA.z < 50 || -screenB.z < 50 || -screenC.z < 50) { // the client does not draw a triangle if any vertex distance is <50 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl index 612cf8fce8..1e9e63428d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/to_screen.glsl @@ -26,22 +26,22 @@ /* * Convert a vertex to screen space */ -ivec3 toScreen(ivec3 vertex, int cameraYaw, int cameraPitch, int centerX, int centerY, int zoom) { - int yawSin = int(65536.0f * sin(cameraYaw * UNIT)); - int yawCos = int(65536.0f * cos(cameraYaw * UNIT)); +vec3 toScreen(ivec3 vertex, int cameraYaw, int cameraPitch, int centerX, int centerY, int zoom) { + float yawSin = sin(cameraYaw * UNIT); + float yawCos = cos(cameraYaw * UNIT); - int pitchSin = int(65536.0f * sin(cameraPitch * UNIT)); - int pitchCos = int(65536.0f * cos(cameraPitch * UNIT)); + float pitchSin = sin(cameraPitch * UNIT); + float pitchCos = cos(cameraPitch * UNIT); - int rotatedX = ((vertex.z * yawSin) + (vertex.x * yawCos)) >> 16; - int rotatedZ = ((vertex.z * yawCos) - (vertex.x * yawSin)) >> 16; + float rotatedX = (vertex.z * yawSin) + (vertex.x * yawCos); + float rotatedZ = (vertex.z * yawCos) - (vertex.x * yawSin); - int var13 = ((vertex.y * pitchCos) - (rotatedZ * pitchSin)) >> 16; - int var12 = ((vertex.y * pitchSin) + (rotatedZ * pitchCos)) >> 16; + float var13 = (vertex.y * pitchCos) - (rotatedZ * pitchSin); + float var12 = (vertex.y * pitchSin) + (rotatedZ * pitchCos); - int x = rotatedX * zoom / var12 + centerX; - int y = var13 * zoom / var12 + centerY; - int z = -var12; // in OpenGL depth is negative + float x = rotatedX * zoom / var12 + centerX; + float y = var13 * zoom / var12 + centerY; + float z = -var12; // in OpenGL depth is negative - return ivec3(x, y, z); + return vec3(x, y, z); } 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 3886e59522..1df200fe01 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1798,7 +1798,8 @@ public abstract class RSClientMixin implements RSClient int type = client.getVarpDefinition(var0).getType(); if (type == 3 || type == 4 || type == 10) { - client.getCallbacks().post(VolumeChanged.class, VolumeChanged.INSTANCE); + VolumeChanged volumeChanged = new VolumeChanged(null); + client.getCallbacks().post(VolumeChanged.class, volumeChanged); } } } \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java index 92738df760..827b67e537 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java @@ -120,7 +120,7 @@ public abstract class SoundEffectMixin implements RSClient { // Regular sound effect - SoundEffectPlayed event = new SoundEffectPlayed(); + SoundEffectPlayed event = new SoundEffectPlayed(null); event.setSoundId(client.getQueuedSoundEffectIDs()[soundIndex]); event.setDelay(client.getQueuedSoundEffectDelays()[soundIndex]); client.getCallbacks().post(SoundEffectPlayed.class, event); @@ -133,7 +133,7 @@ public abstract class SoundEffectMixin implements RSClient int y = (packedLocation >> 8) & 0xFF; int range = (packedLocation) & 0xFF; - AreaSoundEffectPlayed event = new AreaSoundEffectPlayed(); + AreaSoundEffectPlayed event = new AreaSoundEffectPlayed(null); event.setSoundId(client.getQueuedSoundEffectIDs()[soundIndex]); event.setSceneX(x); event.setSceneY(y); diff --git a/wiki-scraper/src/main/java/net/runelite/data/dump/wiki/NpcStatsDumper.java b/wiki-scraper/src/main/java/net/runelite/data/dump/wiki/NpcStatsDumper.java index 746e41542b..31d6d47f43 100644 --- a/wiki-scraper/src/main/java/net/runelite/data/dump/wiki/NpcStatsDumper.java +++ b/wiki-scraper/src/main/java/net/runelite/data/dump/wiki/NpcStatsDumper.java @@ -260,7 +260,7 @@ public class NpcStatsDumper private static boolean isAttackableNpc(final NpcDefinition n) { - for (final String s : n.getOptions()) + for (final String s : n.getActions()) { if ("attack".equalsIgnoreCase(s)) { From b3991f219d99945ee67aab7aec90792514a47376 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 30 Oct 2019 05:46:45 +0100 Subject: [PATCH 107/185] project: music plugin --- .../client/plugins/music/MusicPlugin.java | 3 -- .../net/runelite/mixins/RSClientMixin.java | 20 ++++++++++- .../java/net/runelite/rs/api/RSClient.java | 18 ++++++++-- .../net/runelite/rs/api/RSMidiPcmStream.java | 33 +++++++++++++++++++ runescape-client/src/main/java/Client.java | 9 ++--- .../src/main/java/ClientPacket.java | 2 +- .../src/main/java/DynamicObject.java | 4 +-- .../src/main/java/HealthBarUpdate.java | 4 +-- .../src/main/java/MidiPcmStream.java | 3 +- .../src/main/java/MouseRecorder.java | 2 +- .../src/main/java/MusicPatchNode2.java | 6 ++-- runescape-client/src/main/java/NetSocket.java | 8 ++--- runescape-client/src/main/java/TileItem.java | 3 +- .../src/main/java/UserComparator4.java | 2 +- .../src/main/java/WorldMapData_0.java | 2 +- .../src/main/java/WorldMapSprite.java | 2 +- runescape-client/src/main/java/class83.java | 6 ++-- 17 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 2c23510a81..5c1b2d5b87 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -37,7 +37,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import lombok.extern.slf4j.Slf4j; import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -73,7 +72,6 @@ import net.runelite.client.plugins.PluginDescriptor; name = "Music", description = "Adds search and filter for the music list, and additional volume control" ) -@Slf4j public class MusicPlugin extends Plugin { @Inject @@ -220,7 +218,6 @@ public class MusicPlugin extends Plugin private void onVolumeChanged(VolumeChanged volumeChanged) { - log.info(volumeChanged.getType().toString()); applyMusicVolumeConfig(); } 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 1df200fe01..2cacebda23 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1784,6 +1784,24 @@ public abstract class RSClientMixin implements RSClient } } + @Inject + @Override + public void setMusicVolume(int volume) + { + if (volume > 0 && client.getMusicVolume() <= 0 && client.getcurrentTrackGroupId() != -1) + { + client.playMusicTrack(client.getMusicTracks(), client.getcurrentTrackGroupId(), 0, volume, false); + } + + client.setClientMusicVolume(volume); + client.setMusicTrackVolume(volume); + if (client.getMidiPcmStream() != null) + { + client.getMidiPcmStream().setPcmStreamVolume(volume); + } + } + + @Copy("changeGameOptions") public static void rs$changeGameOptions(int var0) { @@ -1798,7 +1816,7 @@ public abstract class RSClientMixin implements RSClient int type = client.getVarpDefinition(var0).getType(); if (type == 3 || type == 4 || type == 10) { - VolumeChanged volumeChanged = new VolumeChanged(null); + VolumeChanged volumeChanged = new VolumeChanged(type == 3 ? VolumeChanged.Type.MUSIC : type == 4 ? VolumeChanged.Type.EFFECTS : VolumeChanged.Type.AREA); client.getCallbacks().post(VolumeChanged.class, volumeChanged); } } 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 f863d9afbe..9220907d8c 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 @@ -449,6 +449,9 @@ public interface RSClient extends RSGameShell, Client @Import("SpriteBuffer_spritePalette") void setIndexedSpritePalette(int[] indexedSpritePalette); + @Import("archive6") + RSAbstractArchive getMusicTracks(); + @Import("archive8") @Override RSAbstractArchive getIndexSprites(); @@ -1047,8 +1050,7 @@ public interface RSClient extends RSGameShell, Client int getMusicVolume(); @Import("musicVolume") - @Override - void setMusicVolume(int volume); + void setClientMusicVolume(int volume); @Import("areaSoundEffectVolume") @Override @@ -1066,9 +1068,21 @@ public interface RSClient extends RSGameShell, Client @Override void setSoundEffectVolume(int volume); + @Import("musicTrackVolume") + void setMusicTrackVolume(int volume); + @Import("viewportWalking") void setViewportWalking(boolean viewportWalking); + @Import("playMusicTrack") + void playMusicTrack(RSAbstractArchive var0, int var1, int var2, int var3, boolean var4); + + @Import("midiPcmStream") + RSMidiPcmStream getMidiPcmStream(); + + @Import("currentTrackGroupId") + int getcurrentTrackGroupId(); + @Import("crossSprites") @Override RSSprite[] getCrossSprites(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java new file mode 100644 index 0000000000..596fed9c2a --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.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 RSMidiPcmStream +{ + @Import("setPcmStreamVolume") + void setPcmStreamVolume(int volume); +} diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index ed958509cf..b180621394 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -202,7 +202,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -910754411 ) - static int field666; + @Export("currentTrackGroupId") + static int currentTrackGroupId; @ObfuscatedName("mo") @ObfuscatedGetter( intValue = -1946560921 @@ -1511,7 +1512,7 @@ public final class Client extends GameShell implements Usernamed { destinationY = 0; minimapState = 0; musicVolume = 255; - field666 = -1; + currentTrackGroupId = -1; field759 = false; soundEffectVolume = 127; areaSoundEffectVolume = 127; @@ -1653,7 +1654,7 @@ public final class Client extends GameShell implements Usernamed { var5 = 0; } - class49.midiPcmStream.method3760(var5); + class49.midiPcmStream.setPcmStreamVolume(var5); } else { class49.midiPcmStream.clear(); class49.midiPcmStream.removeAll(); @@ -1765,7 +1766,7 @@ public final class Client extends GameShell implements Usernamed { if (class49.midiPcmStream.loadMusicTrack(class197.musicTrack, class197.musicPatchesArchive, FriendLoginUpdate.soundCache, 22050)) { class49.midiPcmStream.clearAll(); - class49.midiPcmStream.method3760(TileItem.field1223); + class49.midiPcmStream.setPcmStreamVolume(TileItem.musicTrackVolume); class49.midiPcmStream.setMusicTrack(class197.musicTrack, WorldMapSectionType.musicTrackBoolean); class197.field2386 = 0; class197.musicTrack = null; diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index 1aa118148e..0a4c2d67e8 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -705,7 +705,7 @@ public class ClientPacket implements class181 { @Export("playSoundJingle") static void playSoundJingle(int var0, int var1) { if (Client.musicVolume != 0 && var0 != -1) { - class83.method2068(ClanMate.archive11, var0, 0, Client.musicVolume, false); + class83.playMusicTrack(ClanMate.archive11, var0, 0, Client.musicVolume, false); Client.field759 = true; } diff --git a/runescape-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java index 4fca28b6c8..70af692726 100644 --- a/runescape-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -213,10 +213,10 @@ public class DynamicObject extends Entity { class197.musicTrackArchive = null; class188.musicTrackGroupId = -1; class49.musicTrackFileId = -1; - TileItem.field1223 = 0; + TileItem.musicTrackVolume = 0; WorldMapSectionType.musicTrackBoolean = false; MusicPatchNode2.field2382 = 2; - Client.field666 = -1; + Client.currentTrackGroupId = -1; Client.field759 = false; ClientPacket.method3581(); MouseRecorder.updateGameState(10); diff --git a/runescape-client/src/main/java/HealthBarUpdate.java b/runescape-client/src/main/java/HealthBarUpdate.java index f708052a85..9ee52efe8e 100644 --- a/runescape-client/src/main/java/HealthBarUpdate.java +++ b/runescape-client/src/main/java/HealthBarUpdate.java @@ -151,8 +151,8 @@ public class HealthBarUpdate extends Node { } if (!var12) { - if (Client.musicVolume != 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, Client.musicVolume, false); + if (Client.musicVolume != 0 && Client.currentTrackGroupId != -1) { + class83.playMusicTrack(class225.archive6, Client.currentTrackGroupId, 0, Client.musicVolume, false); } Client.field759 = false; diff --git a/runescape-client/src/main/java/MidiPcmStream.java b/runescape-client/src/main/java/MidiPcmStream.java index 8517ab3ad0..1328296848 100644 --- a/runescape-client/src/main/java/MidiPcmStream.java +++ b/runescape-client/src/main/java/MidiPcmStream.java @@ -131,7 +131,8 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-1812413582" ) - public synchronized void method3760(int var1) { + @Export("setPcmStreamVolume") + public synchronized void setPcmStreamVolume(int var1) { this.field2393 = var1; } diff --git a/runescape-client/src/main/java/MouseRecorder.java b/runescape-client/src/main/java/MouseRecorder.java index 27b34c85d8..e4c96908da 100644 --- a/runescape-client/src/main/java/MouseRecorder.java +++ b/runescape-client/src/main/java/MouseRecorder.java @@ -205,7 +205,7 @@ public class MouseRecorder implements Runnable { class197.musicTrackArchive = null; class188.musicTrackGroupId = -1; class49.musicTrackFileId = -1; - TileItem.field1223 = 0; + TileItem.musicTrackVolume = 0; WorldMapSectionType.musicTrackBoolean = false; MusicPatchNode2.field2382 = 2; DirectByteArrayCopier.method3924(true); diff --git a/runescape-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java index a5e9bec39c..b8d9652cc8 100644 --- a/runescape-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -64,19 +64,19 @@ public class MusicPatchNode2 { static void playSong(int var0) { if (var0 == -1 && !Client.field759) { VertexNormal.method2960(); - } else if (var0 != -1 && var0 != Client.field666 && Client.musicVolume != 0 && !Client.field759) { + } else if (var0 != -1 && var0 != Client.currentTrackGroupId && Client.musicVolume != 0 && !Client.field759) { Archive var1 = class225.archive6; int var2 = Client.musicVolume; class197.field2386 = 1; class197.musicTrackArchive = var1; class188.musicTrackGroupId = var0; class49.musicTrackFileId = 0; - TileItem.field1223 = var2; + TileItem.musicTrackVolume = var2; WorldMapSectionType.musicTrackBoolean = false; field2382 = 2; } - Client.field666 = var0; + Client.currentTrackGroupId = var0; } @ObfuscatedName("ic") diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index 9207e17a34..91bd0f9c49 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -438,16 +438,16 @@ public final class NetSocket extends AbstractSocket implements Runnable { } if (var3 != Client.musicVolume) { - if (Client.musicVolume == 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, var3, false); + if (Client.musicVolume == 0 && Client.currentTrackGroupId != -1) { + class83.playMusicTrack(class225.archive6, Client.currentTrackGroupId, 0, var3, false); Client.field759 = false; } else if (var3 == 0) { VertexNormal.method2960(); Client.field759 = false; } else if (class197.field2386 != 0) { - TileItem.field1223 = var3; + TileItem.musicTrackVolume = var3; } else { - class49.midiPcmStream.method3760(var3); + class49.midiPcmStream.setPcmStreamVolume(var3); } Client.musicVolume = var3; diff --git a/runescape-client/src/main/java/TileItem.java b/runescape-client/src/main/java/TileItem.java index 434cb090cf..ed26f437dc 100644 --- a/runescape-client/src/main/java/TileItem.java +++ b/runescape-client/src/main/java/TileItem.java @@ -17,7 +17,8 @@ public final class TileItem extends Entity { @ObfuscatedGetter( intValue = 1727946021 ) - public static int field1223; + @Export("musicTrackVolume") + public static int musicTrackVolume; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1488876063 diff --git a/runescape-client/src/main/java/UserComparator4.java b/runescape-client/src/main/java/UserComparator4.java index b378fd8030..57a91245ec 100644 --- a/runescape-client/src/main/java/UserComparator4.java +++ b/runescape-client/src/main/java/UserComparator4.java @@ -43,7 +43,7 @@ public class UserComparator4 implements Comparator { public static void method3349(AbstractArchive var0, String var1, String var2, int var3, boolean var4) { int var5 = var0.getGroupId(var1); int var6 = var0.getFileId(var5, var2); - class83.method2068(var0, var5, var6, var3, var4); + class83.playMusicTrack(var0, var5, var6, var3, var4); } @ObfuscatedName("ka") diff --git a/runescape-client/src/main/java/WorldMapData_0.java b/runescape-client/src/main/java/WorldMapData_0.java index e53aa1e1bd..4ad065e0e8 100644 --- a/runescape-client/src/main/java/WorldMapData_0.java +++ b/runescape-client/src/main/java/WorldMapData_0.java @@ -263,7 +263,7 @@ public class WorldMapData_0 extends AbstractWorldMapData { class197.musicTrackArchive = var1; class188.musicTrackGroupId = var6; class49.musicTrackFileId = var7; - TileItem.field1223 = var4; + TileItem.musicTrackVolume = var4; WorldMapSectionType.musicTrackBoolean = var5; MusicPatchNode2.field2382 = var0; } diff --git a/runescape-client/src/main/java/WorldMapSprite.java b/runescape-client/src/main/java/WorldMapSprite.java index 8b9b430622..ead6c24039 100644 --- a/runescape-client/src/main/java/WorldMapSprite.java +++ b/runescape-client/src/main/java/WorldMapSprite.java @@ -107,7 +107,7 @@ public final class WorldMapSprite { class197.musicTrackArchive = null; class188.musicTrackGroupId = -1; class49.musicTrackFileId = -1; - TileItem.field1223 = 0; + TileItem.musicTrackVolume = 0; WorldMapSectionType.musicTrackBoolean = false; MusicPatchNode2.field2382 = 2; } diff --git a/runescape-client/src/main/java/class83.java b/runescape-client/src/main/java/class83.java index 029b7c87e1..7f501cdb88 100644 --- a/runescape-client/src/main/java/class83.java +++ b/runescape-client/src/main/java/class83.java @@ -1,5 +1,6 @@ import java.awt.Component; import java.math.BigInteger; +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -37,12 +38,13 @@ public class class83 { signature = "(Lhp;IIIZI)V", garbageValue = "-476776598" ) - public static void method2068(AbstractArchive var0, int var1, int var2, int var3, boolean var4) { + @Export("playMusicTrack") + public static void playMusicTrack(AbstractArchive var0, int var1, int var2, int var3, boolean var4) { class197.field2386 = 1; class197.musicTrackArchive = var0; class188.musicTrackGroupId = var1; class49.musicTrackFileId = var2; - TileItem.field1223 = var3; + TileItem.musicTrackVolume = var3; WorldMapSectionType.musicTrackBoolean = var4; MusicPatchNode2.field2382 = 10000; } From 169f305707fa4be132e25ed6063ff5967645379e Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 29 Oct 2019 21:26:57 -0600 Subject: [PATCH 108/185] runelite-client/chat: Be more thread safe --- .../net/runelite/client/chat/ChatCommandManager.java | 4 ++-- .../net/runelite/client/chat/ChatMessageManager.java | 11 ++--------- .../java/net/runelite/client/chat/CommandManager.java | 4 ++-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java index f930992d08..1000ba641c 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java @@ -24,8 +24,8 @@ */ package net.runelite.client.chat; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; import java.util.function.BiConsumer; import java.util.function.BiPredicate; @@ -43,7 +43,7 @@ import net.runelite.client.events.PrivateMessageInput; @Singleton public class ChatCommandManager implements ChatboxInputListener { - private final Map commands = new HashMap<>(); + private final Map commands = new ConcurrentHashMap<>(); private final Client client; private final ScheduledExecutorService scheduledExecutorService; diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index fe0bfe0851..991cce5a88 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -556,16 +556,9 @@ public class ChatMessageManager public void process() { - if (!queuedMessages.isEmpty()) + for (QueuedMessage msg; (msg = queuedMessages.poll()) != null; ) { - try - { - queuedMessages.forEach(this::add); - } - finally - { - queuedMessages.clear(); - } + add(msg); } } diff --git a/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java b/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java index c066d47681..6c725df06c 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java @@ -25,9 +25,9 @@ */ package net.runelite.client.chat; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -55,7 +55,7 @@ public class CommandManager private final ClientThread clientThread; private boolean sending; - private final List chatboxInputListenerList = new ArrayList<>(); + private final List chatboxInputListenerList = new CopyOnWriteArrayList<>(); @Inject private CommandManager(Client client, EventBus eventBus, ClientThread clientThread) From 55346c7d2be388edbe16e3527e0567b724ae13e2 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Wed, 30 Oct 2019 16:45:22 +0000 Subject: [PATCH 109/185] Release 1.5.37 --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 6a683c0e03..e355391bfe 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index ca731fa5a2..d8ed86bfd6 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 95fcd5d703..6f32c3c191 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 3e232bdfa2..52bc773799 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 16b8e5144e..b4deda4435 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 Web Service diff --git a/pom.xml b/pom.xml index 916d842e82..fbe2464789 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 pom RuneLite @@ -59,7 +59,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - HEAD + runelite-parent-1.5.37 diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index c10f81c453..08d3f7c90b 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index b687358a57..620355d3a2 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 021c41e297..4e5dd0dd4e 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index ebf7d9280f..9dd0bf267a 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index e6219a3749..957e7b6d6d 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37-SNAPSHOT + 1.5.37 script-assembler-plugin From ca58d24c7fe8c946465374d2ff8f3e2e240bd043 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Wed, 30 Oct 2019 16:45:29 +0000 Subject: [PATCH 110/185] Bump for 1.5.38-SNAPSHOT --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index e355391bfe..8abbbf789c 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index d8ed86bfd6..56849519e9 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 6f32c3c191..ac77ad1b00 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 52bc773799..cc418be40b 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index b4deda4435..49a3c8e21c 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index fbe2464789..e0932e7c09 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT pom RuneLite @@ -59,7 +59,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - runelite-parent-1.5.37 + HEAD diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index 08d3f7c90b..4a6e08e602 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index 620355d3a2..9c42616649 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 4e5dd0dd4e..f09264a9c0 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 9dd0bf267a..1dae652ba0 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 957e7b6d6d..51dec4da8a 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.37 + 1.5.38-SNAPSHOT script-assembler-plugin From 8f8d831a164fbd9d7105161192abff215e4ee520 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Thu, 31 Oct 2019 05:17:04 +0100 Subject: [PATCH 111/185] infoplugin: Fix info panel --- .../client/plugins/info/InfoPanel.java | 72 +------------------ .../client/plugins/info/InfoPlugin.java | 14 +--- 2 files changed, 3 insertions(+), 83 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java index 632f9f248f..5b36fb0afa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java @@ -34,23 +34,17 @@ import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; -import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; import javax.inject.Singleton; -import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; -import javax.swing.event.HyperlinkEvent; import net.runelite.api.Client; import static net.runelite.client.RuneLite.LOGS_DIR; import net.runelite.client.RuneLiteProperties; -import net.runelite.client.account.SessionManager; import net.runelite.client.config.ConfigManager; -import net.runelite.client.events.SessionClose; -import net.runelite.client.events.SessionOpen; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; @@ -58,10 +52,8 @@ import net.runelite.client.util.ImageUtil; import net.runelite.client.util.LinkBrowser; @Singleton -public class InfoPanel extends PluginPanel +class InfoPanel extends PluginPanel { - private static final String RUNELITE_LOGIN = "https://runelite_login/"; - private static final ImageIcon ARROW_RIGHT_ICON; private static final ImageIcon GITHUB_ICON; private static final ImageIcon FOLDER_ICON; @@ -69,21 +61,12 @@ public class InfoPanel extends PluginPanel private static final ImageIcon PATREON_ICON; private static final ImageIcon IMPORT_ICON; - private final JLabel loggedLabel = new JLabel(); - private final JRichTextPane emailLabel = new JRichTextPane(); private JPanel syncPanel; - private JPanel actionsContainer; @Inject @Nullable private Client client; - @Inject - private SessionManager sessionManager; - - @Inject - private ScheduledExecutorService executor; - @Inject private ConfigManager configManager; @@ -127,28 +110,11 @@ public class InfoPanel extends PluginPanel revision.setText(htmlLabel("Oldschool revision: ", engineVer)); - loggedLabel.setForeground(ColorScheme.LIGHT_GRAY_COLOR); - loggedLabel.setFont(smallFont); - - emailLabel.setForeground(Color.WHITE); - emailLabel.setFont(smallFont); - emailLabel.enableAutoLinkHandler(false); - emailLabel.addHyperlinkListener(e -> - { - if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType()) && e.getURL() != null && e.getURL().toString().equals(RUNELITE_LOGIN)) - { - executor.execute(sessionManager::login); - } - }); - versionPanel.add(version); versionPanel.add(plusVersion); versionPanel.add(revision); - versionPanel.add(Box.createGlue()); - versionPanel.add(loggedLabel); - versionPanel.add(emailLabel); - actionsContainer = new JPanel(); + JPanel actionsContainer = new JPanel(); actionsContainer.setBorder(new EmptyBorder(10, 0, 0, 0)); actionsContainer.setLayout(new GridLayout(5, 1, 0, 10)); @@ -173,8 +139,6 @@ public class InfoPanel extends PluginPanel add(versionPanel, BorderLayout.NORTH); add(actionsContainer, BorderLayout.CENTER); - - updateLoggedIn(); } /** @@ -267,40 +231,8 @@ public class InfoPanel extends PluginPanel return container; } - private void updateLoggedIn() - { - final String name = sessionManager.getAccountSession() != null - ? sessionManager.getAccountSession().getUsername() - : null; - - if (name != null) - { - emailLabel.setContentType("text/plain"); - emailLabel.setText(name); - loggedLabel.setText("Logged in as"); - actionsContainer.add(syncPanel, 0); - } - else - { - //emailLabel.setContentType("text/html"); - //emailLabel.setText("Login to sync settings to the cloud."); - //loggedLabel.setText("Not logged in"); - actionsContainer.remove(syncPanel); - } - } - private static String htmlLabel(String key, String value) { return "" + key + "" + value + ""; } - - public void onSessionOpen(SessionOpen sessionOpen) - { - updateLoggedIn(); - } - - public void onSessionClose(SessionClose e) - { - updateLoggedIn(); - } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java index 79fd350150..26e4bcfbbc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java @@ -28,8 +28,6 @@ import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.client.eventbus.EventBus; -import net.runelite.client.events.SessionClose; -import net.runelite.client.events.SessionOpen; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.ClientToolbar; @@ -53,12 +51,10 @@ public class InfoPlugin extends Plugin private NavigationButton navButton; - private InfoPanel panel; - @Override protected void startUp() throws Exception { - panel = injector.getInstance(InfoPanel.class); + InfoPanel panel = injector.getInstance(InfoPanel.class); panel.init(); final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "info_icon.png"); @@ -71,8 +67,6 @@ public class InfoPlugin extends Plugin .build(); clientToolbar.addNavigation(navButton); - - addSubscriptions(); } @Override @@ -82,10 +76,4 @@ public class InfoPlugin extends Plugin clientToolbar.removeNavigation(navButton); } - - private void addSubscriptions() - { - eventbus.subscribe(SessionOpen.class, this, event -> panel.onSessionOpen(event)); - eventbus.subscribe(SessionClose.class, this, event -> panel.onSessionClose(event)); - } } From 6f35d4ba472cc3d09bcc15b3c0a8aa66c99a9ca0 Mon Sep 17 00:00:00 2001 From: David Henshaw <31974655+drahenshaw@users.noreply.github.com> Date: Thu, 31 Oct 2019 00:19:39 -0700 Subject: [PATCH 112/185] Add item mappings for rune and tzhaar ornament kits (#10161) --- .../java/net/runelite/client/game/ItemMapping.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java index 47cb63556e..82b71a5720 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java @@ -85,6 +85,16 @@ public enum ItemMapping ITEM_DRAGON_BOOTS(DRAGON_BOOTS, DRAGON_BOOTS_G), ITEM_DRAGON_BOOTS_ORNAMENT_KIT(DRAGON_BOOTS_ORNAMENT_KIT, DRAGON_BOOTS_G), + // Rune ornament kits + ITEM_RUNE_SCIMITAR_GUTHIX(RUNE_SCIMITAR, RUNE_SCIMITAR_23330), + ITEM_RUNE_SCIMITAR_ORNAMENT_KIT_GUTHIX(RUNE_SCIMITAR_ORNAMENT_KIT_GUTHIX, RUNE_SCIMITAR_23330), + ITEM_RUNE_SCIMITAR_SARADOMIN(RUNE_SCIMITAR, RUNE_SCIMITAR_23332), + ITEM_RUNE_SCIMITAR_ORNAMENT_KIT_SARADOMIN(RUNE_SCIMITAR_ORNAMENT_KIT_SARADOMIN, RUNE_SCIMITAR_23332), + ITEM_RUNE_SCIMITAR_ZAMORAK(RUNE_SCIMITAR, RUNE_SCIMITAR_23334), + ITEM_RUNE_SCIMITAR_ORNAMENT_KIT_ZAMORAK(RUNE_SCIMITAR_ORNAMENT_KIT_ZAMORAK, RUNE_SCIMITAR_23334), + ITEM_RUNE_DEFENDER(RUNE_DEFENDER, RUNE_DEFENDER_T), + ITEM_RUNE_DEFENDER_ORNAMENT_KIT(RUNE_DEFENDER_ORNAMENT_KIT, RUNE_DEFENDER_T), + // Godsword ornament kits ITEM_ARMADYL_GODSWORD(ARMADYL_GODSWORD, ARMADYL_GODSWORD_OR), ITEM_ARMADYL_GODSWORD_ORNAMENT_KIT(ARMADYL_GODSWORD_ORNAMENT_KIT, ARMADYL_GODSWORD_OR), @@ -196,6 +206,8 @@ public enum ItemMapping ITEM_MALEDICTION_WARD(MALEDICTION_WARD, MALEDICTION_WARD_12806), ITEM_STEAM_BATTLESTAFF(STEAM_BATTLESTAFF, STEAM_BATTLESTAFF_12795), ITEM_LAVA_BATTLESTAFF(LAVA_BATTLESTAFF, LAVA_BATTLESTAFF_21198), + ITEM_TZHAARKETOM(TZHAARKETOM, TZHAARKETOM_T), + ITEM_TZHAARKETOM_ORNAMENT_KIT(TZHAARKETOM_ORNAMENT_KIT, TZHAARKETOM_T), // Slayer helm/black mask ITEM_BLACK_MASK( From 7d912c4de7d1d8fff581dab48da470a242c19110 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Mon, 28 Oct 2019 23:00:33 -0400 Subject: [PATCH 113/185] Correct medium Western diary requirement You only need 29 cooking to complete the Gnome Restaurant tutorial. You can cancel tasks if you do not have the level required to cook the requested food. --- .../achievementdiary/diaries/WesternDiaryRequirement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java index 6f27f9f5b1..133ef6903a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java @@ -78,7 +78,7 @@ public class WesternDiaryRequirement extends GenericDiaryRequirement add("Make a Chocolate Bomb at the Grand Tree.", new SkillRequirement(Skill.COOKING, 42)); add("Complete a delivery for the Gnome Restaurant.", - new SkillRequirement(Skill.COOKING, 42)); + new SkillRequirement(Skill.COOKING, 29)); add("Turn your small crystal seed into a Crystal saw.", new QuestRequirement(Quest.THE_EYES_OF_GLOUPHRIE)); add("Mine some Gold ore underneath the Grand Tree.", From cf3899fb12143cbf58fea3c3bba8b36fd4fc21e1 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 31 Oct 2019 11:33:13 +0000 Subject: [PATCH 114/185] Update Item IDs to 2019-10-31-rev182 --- .../main/java/net/runelite/api/ItemID.java | 27 ++++++++++++++++++- .../java/net/runelite/api/NullItemID.java | 20 ++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/ItemID.java b/runelite-api/src/main/java/net/runelite/api/ItemID.java index 64547c8d49..796ac084b7 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemID.java @@ -9155,7 +9155,7 @@ public final class ItemID public static final int ANKOU_MASK = 20095; public static final int ANKOU_TOP = 20098; public static final int ANKOU_GLOVES = 20101; - public static final int ANKOUS_LEGGINGS = 20104; + public static final int ANKOU_LEGGINGS = 20104; public static final int ANKOU_SOCKS = 20107; public static final int BOWL_WIG = 20110; public static final int ARCEUUS_HOOD = 20113; @@ -11291,5 +11291,30 @@ public final class ItemID public static final int MYSTERIOUS_EMBLEM_TIER_4 = 24283; public static final int MYSTERIOUS_EMBLEM_TIER_5 = 24285; public static final int DECORATIVE_EMBLEM = 24287; + public static final int DAGONHAI_HAT = 24288; + public static final int DAGONHAI_ROBE_TOP = 24291; + public static final int DAGONHAI_ROBE_BOTTOM = 24294; + public static final int WHITE_BED_SHEETS = 24297; + public static final int SMOKE_POWDER = 24298; + public static final int SHINY_GLASS = 24299; + public static final int SPOOKY_HOOD = 24300; + public static final int SPOOKY_ROBE = 24301; + public static final int SPOOKY_SKIRT = 24302; + public static final int SPOOKY_GLOVES = 24303; + public static final int SPOOKY_BOOTS = 24304; + public static final int SPOOKY_HOOD_24305 = 24305; + public static final int SPOOKY_ROBE_24307 = 24307; + public static final int SPOOKY_SKIRT_24309 = 24309; + public static final int SPOOKY_GLOVES_24311 = 24311; + public static final int SPOOKY_BOOTS_24313 = 24313; + public static final int SPOOKIER_HOOD = 24315; + public static final int SPOOKIER_ROBE = 24317; + public static final int SPOOKIER_SKIRT = 24319; + public static final int SPOOKIER_GLOVES = 24321; + public static final int SPOOKIER_BOOTS = 24323; + public static final int PUMPKIN_LANTERN = 24325; + public static final int SKELETON_LANTERN = 24327; + public static final int BOUNTY_CRATE = 24329; + public static final int BIRTHDAY_CAKE_24331 = 24331; /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/NullItemID.java b/runelite-api/src/main/java/net/runelite/api/NullItemID.java index 28ddf86d69..84d3c356a0 100644 --- a/runelite-api/src/main/java/net/runelite/api/NullItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullItemID.java @@ -12786,5 +12786,25 @@ public final class NullItemID public static final int NULL_24282 = 24282; public static final int NULL_24284 = 24284; public static final int NULL_24286 = 24286; + public static final int NULL_24289 = 24289; + public static final int NULL_24290 = 24290; + public static final int NULL_24292 = 24292; + public static final int NULL_24293 = 24293; + public static final int NULL_24295 = 24295; + public static final int NULL_24296 = 24296; + public static final int NULL_24306 = 24306; + public static final int NULL_24308 = 24308; + public static final int NULL_24310 = 24310; + public static final int NULL_24312 = 24312; + public static final int NULL_24314 = 24314; + public static final int NULL_24316 = 24316; + public static final int NULL_24318 = 24318; + public static final int NULL_24320 = 24320; + public static final int NULL_24322 = 24322; + public static final int NULL_24324 = 24324; + public static final int NULL_24326 = 24326; + public static final int NULL_24328 = 24328; + public static final int NULL_24330 = 24330; + public static final int NULL_24332 = 24332; /* This file is automatically generated. Do not edit. */ } From ef2b38c277ebe096599ecafb57557612a5aa3cff Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 31 Oct 2019 11:33:14 +0000 Subject: [PATCH 115/185] Update Item variations to 2019-10-31-rev182 --- .../src/main/resources/item_variations.json | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/runelite-client/src/main/resources/item_variations.json b/runelite-client/src/main/resources/item_variations.json index 59493b2e79..850e21fb7a 100644 --- a/runelite-client/src/main/resources/item_variations.json +++ b/runelite-client/src/main/resources/item_variations.json @@ -9373,6 +9373,10 @@ 23068, 23070 ], + "birthday cake": [ + 23108, + 24331 + ], "mystic set": [ 23110, 23113, @@ -9605,5 +9609,25 @@ 24281, 24283, 24285 + ], + "spooky hood": [ + 24300, + 24305 + ], + "spooky robe": [ + 24301, + 24307 + ], + "spooky skirt": [ + 24302, + 24309 + ], + "spooky gloves": [ + 24303, + 24311 + ], + "spooky boots": [ + 24304, + 24313 ] } \ No newline at end of file From 45cab3b8b91c2c4f3f9d47163401294a623a2cd0 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 31 Oct 2019 11:33:15 +0000 Subject: [PATCH 116/185] Update Object IDs to 2019-10-31-rev182 --- .../java/net/runelite/api/NullObjectID.java | 18 ++++++++++++++++++ .../main/java/net/runelite/api/ObjectID.java | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/NullObjectID.java b/runelite-api/src/main/java/net/runelite/api/NullObjectID.java index 8d06a4ab7f..71a515302f 100644 --- a/runelite-api/src/main/java/net/runelite/api/NullObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullObjectID.java @@ -18038,5 +18038,23 @@ public final class NullObjectID public static final int NULL_37430 = 37430; public static final int NULL_37432 = 37432; public static final int NULL_37433 = 37433; + public static final int NULL_37439 = 37439; + public static final int NULL_37441 = 37441; + public static final int NULL_37442 = 37442; + public static final int NULL_37443 = 37443; + public static final int NULL_37446 = 37446; + public static final int NULL_37447 = 37447; + public static final int NULL_37448 = 37448; + public static final int NULL_37449 = 37449; + public static final int NULL_37450 = 37450; + public static final int NULL_37451 = 37451; + public static final int NULL_37452 = 37452; + public static final int NULL_37453 = 37453; + public static final int NULL_37454 = 37454; + public static final int NULL_37455 = 37455; + public static final int NULL_37456 = 37456; + public static final int NULL_37457 = 37457; + public static final int NULL_37458 = 37458; + public static final int NULL_37460 = 37460; /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectID.java b/runelite-api/src/main/java/net/runelite/api/ObjectID.java index 33a53e5f75..34a477f996 100644 --- a/runelite-api/src/main/java/net/runelite/api/ObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectID.java @@ -19384,5 +19384,13 @@ public final class ObjectID public static final int THE_JORMUNGAND = 37424; public static final int ROUGH_WALL_37431 = 37431; public static final int STREAK_INFO = 37434; + public static final int SWAMPY_SINK = 37435; + public static final int BED_37436 = 37436; + public static final int BED_37437 = 37437; + public static final int BLACK_POWDER = 37438; + public static final int SMOKE_BOMB = 37440; + public static final int LOG_PILE_37444 = 37444; + public static final int HOTSPOT_MARKER = 37445; + public static final int FOUNTAIN_37459 = 37459; /* This file is automatically generated. Do not edit. */ } From 24a1b16237c262612c3572c3045adcde018bea7c Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 31 Oct 2019 11:33:15 +0000 Subject: [PATCH 117/185] Update NPC IDs to 2019-10-31-rev182 --- runelite-api/src/main/java/net/runelite/api/NpcID.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/NpcID.java b/runelite-api/src/main/java/net/runelite/api/NpcID.java index 66e02eea3a..57dbfb59f2 100644 --- a/runelite-api/src/main/java/net/runelite/api/NpcID.java +++ b/runelite-api/src/main/java/net/runelite/api/NpcID.java @@ -286,6 +286,7 @@ public final class NpcID public static final int DWARF = 290; public static final int CHAOS_DWARF = 291; public static final int DWARF_292 = 292; + public static final int SNAILNECK = 293; public static final int DWARF_294 = 294; public static final int DWARF_295 = 295; public static final int DWARF_296 = 296; @@ -307,6 +308,7 @@ public final class NpcID public static final int FROG = 312; public static final int REACHER_313 = 313; public static final int DR_JEKYLL_314 = 314; + public static final int GRASSLEGS = 315; public static final int PAUL = 317; public static final int DARK_CORE = 318; public static final int CORPOREAL_BEAST = 319; @@ -7159,6 +7161,8 @@ public final class NpcID public static final int REVENANT_DARK_BEAST = 7938; public static final int REVENANT_KNIGHT = 7939; public static final int REVENANT_DRAGON = 7940; + public static final int EPIC_MAGER34 = 7941; + public static final int EPIC_MAGER34_7942 = 7942; public static final int EMBLEM_TRADER_7943 = 7943; public static final int FISHING_SPOT_7946 = 7946; public static final int FISHING_SPOT_7947 = 7947; @@ -8315,5 +8319,8 @@ public final class NpcID public static final int TYPHOR_9296 = 9296; public static final int VRITRA = 9297; public static final int MAZ = 9298; + public static final int MAD_MELVIN96 = 9299; + public static final int GOBLIN_9300 = 9300; + public static final int BUTTERFLY_9301 = 9301; /* This file is automatically generated. Do not edit. */ } From 6712984978b5c5c07701d3d9195090c7dfb23534 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 31 Oct 2019 11:33:20 +0000 Subject: [PATCH 118/185] Update Widget IDs to 2019-10-31-rev182 --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 a0a6c4bf62..b2d321d827 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 @@ -740,10 +740,10 @@ public class WidgetID static class Pvp { static final int BOUNTY_HUNTER_INFO = 6; - static final int KILLDEATH_RATIO = 33; - static final int SKULL_CONTAINER = 53; - static final int SAFE_ZONE = 55; - static final int WILDERNESS_LEVEL = 58; // this can also be the Deadman Mode "Protection" text + static final int KILLDEATH_RATIO = 34; + static final int SKULL_CONTAINER = 54; + static final int SAFE_ZONE = 56; + static final int WILDERNESS_LEVEL = 59; // this can also be the Deadman Mode "Protection" text } static class KourendFavour From 497b26c79f7c7c38d62c54061b7786f9794cb38e Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 31 Oct 2019 11:34:47 +0000 Subject: [PATCH 119/185] Update 185 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e0932e7c09..1f2ad608b2 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ true true - 184 + 185 From 1b487fc64bc1bf3468191974a0801d1f70c83c93 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 31 Oct 2019 12:07:52 +0000 Subject: [PATCH 120/185] Release 1.5.38 --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 8abbbf789c..57718f970c 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 56849519e9..24167ef06e 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index ac77ad1b00..41193cdf30 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index cc418be40b..08b767710f 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 49a3c8e21c..e6725f0f51 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 Web Service diff --git a/pom.xml b/pom.xml index 1f2ad608b2..8e153bbc58 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 pom RuneLite @@ -59,7 +59,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - HEAD + runelite-parent-1.5.38 diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index 4a6e08e602..7e2480561d 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index 9c42616649..49c6410fe6 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index f09264a9c0..c3946b49cd 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 1dae652ba0..e5145f8411 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 51dec4da8a..177289aac0 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38-SNAPSHOT + 1.5.38 script-assembler-plugin From ddd95dc7a481ca8ce29e4dcb55e606896ba320c3 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 31 Oct 2019 12:07:59 +0000 Subject: [PATCH 121/185] Bump for 1.5.39-SNAPSHOT --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 57718f970c..99f673e687 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 24167ef06e..5a13d4a289 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 41193cdf30..96590752c7 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 08b767710f..b83402c6b2 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index e6725f0f51..2ec6ab458e 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index 8e153bbc58..62a9ef7c65 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT pom RuneLite @@ -59,7 +59,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - runelite-parent-1.5.38 + HEAD diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index 7e2480561d..ef6536519b 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index 49c6410fe6..78e91bf008 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index c3946b49cd..cab9512783 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index e5145f8411..a09c4fbea5 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 177289aac0..cc1091adc3 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.38 + 1.5.39-SNAPSHOT script-assembler-plugin From e7a1983158fd318ab478c76af32fe5b7cdbcadb6 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 31 Oct 2019 16:57:45 +0100 Subject: [PATCH 122/185] rev185 --- buildSrc/src/main/kotlin/Dependencies.kt | 4 +- .../java/net/runelite/rs/api/RSClient.java | 2 +- .../src/main/java/AbstractArchive.java | 498 +- .../main/java/AbstractByteArrayCopier.java | 125 +- .../src/main/java/AbstractFont.java | 138 +- .../src/main/java/AbstractRasterProvider.java | 32 +- .../src/main/java/AbstractSocket.java | 659 +- .../src/main/java/AbstractSound.java | 4 +- .../src/main/java/AbstractUserComparator.java | 22 +- .../src/main/java/AbstractWorldMapData.java | 459 +- .../src/main/java/AbstractWorldMapIcon.java | 198 +- .../src/main/java/AccessFile.java | 44 +- runescape-client/src/main/java/Actor.java | 450 +- runescape-client/src/main/java/Animation.java | 70 +- runescape-client/src/main/java/Archive.java | 390 +- .../src/main/java/ArchiveDisk.java | 171 +- .../src/main/java/ArchiveDiskAction.java | 375 +- .../main/java/ArchiveDiskActionHandler.java | 76 +- .../src/main/java/ArchiveLoader.java | 873 +- .../src/main/java/AttackOption.java | 237 +- .../src/main/java/AudioFilter.java | 114 +- .../src/main/java/BZip2Decompressor.java | 80 +- .../src/main/java/BZip2State.java | 158 +- .../src/main/java/BoundaryObject.java | 153 +- runescape-client/src/main/java/Bounds.java | 92 +- runescape-client/src/main/java/Buddy.java | 475 +- .../src/main/java/BuddyRankComparator.java | 75 +- runescape-client/src/main/java/Buffer.java | 595 +- .../src/main/java/BufferedFile.java | 120 +- .../src/main/java/BufferedNetSocket.java | 92 +- .../src/main/java/BufferedSink.java | 114 +- .../src/main/java/BufferedSource.java | 70 +- .../src/main/java/ByteArrayNode.java | 4 +- .../src/main/java/ByteArrayPool.java | 90 +- runescape-client/src/main/java/Calendar.java | 106 +- runescape-client/src/main/java/Canvas.java | 153 +- .../src/main/java/ChatChannel.java | 243 +- runescape-client/src/main/java/ClanChat.java | 202 +- runescape-client/src/main/java/ClanMate.java | 64 +- runescape-client/src/main/java/Client.java | 7419 ++++++++++------- .../src/main/java/ClientPacket.java | 1541 ++-- .../src/main/java/ClientPreferences.java | 191 +- .../src/main/java/ClientType.java | 16 - runescape-client/src/main/java/Clock.java | 187 +- .../src/main/java/CollisionMap.java | 149 +- runescape-client/src/main/java/Coord.java | 112 +- runescape-client/src/main/java/Decimator.java | 214 +- .../src/main/java/DefaultsGroup.java | 14 +- .../src/main/java/DemotingHashTable.java | 38 +- .../java/DesktopPlatformInfoProvider.java | 91 +- .../src/main/java/DevicePcmPlayer.java | 65 +- .../main/java/DevicePcmPlayerProvider.java | 357 +- .../src/main/java/DirectByteArrayCopier.java | 90 +- .../src/main/java/DirectWrapper.java | 8 +- runescape-client/src/main/java/DualNode.java | 14 +- .../src/main/java/DualNodeDeque.java | 18 +- .../src/main/java/DynamicObject.java | 166 +- runescape-client/src/main/java/Entity.java | 237 +- .../src/main/java/EnumDefinition.java | 80 +- .../src/main/java/Enumerated.java | 8 +- .../main/java/EvictingDualNodeHashTable.java | 38 +- .../src/main/java/FaceNormal.java | 142 +- .../src/main/java/FileSystem.java | 12 +- runescape-client/src/main/java/FillMode.java | 64 +- .../src/main/java/FloorDecoration.java | 95 +- .../src/main/java/FloorOverlayDefinition.java | 129 +- .../main/java/FloorUnderlayDefinition.java | 124 +- runescape-client/src/main/java/Font.java | 6 +- runescape-client/src/main/java/FontName.java | 208 +- runescape-client/src/main/java/Fonts.java | 40 +- runescape-client/src/main/java/Frames.java | 79 +- runescape-client/src/main/java/Friend.java | 338 +- .../src/main/java/FriendLoginUpdate.java | 83 +- .../src/main/java/FriendSystem.java | 253 +- .../src/main/java/FriendsList.java | 66 +- .../src/main/java/GZipDecompressor.java | 22 +- .../src/main/java/GameObject.java | 119 +- runescape-client/src/main/java/GameShell.java | 619 +- .../src/main/java/GrandExchangeEvent.java | 192 +- .../src/main/java/GrandExchangeEvents.java | 168 +- .../src/main/java/GrandExchangeOffer.java | 237 +- .../java/GrandExchangeOfferAgeComparator.java | 897 +- .../GrandExchangeOfferNameComparator.java | 399 +- .../GrandExchangeOfferOwnWorldComparator.java | 959 ++- ...dExchangeOfferTotalQuantityComparator.java | 527 +- ...GrandExchangeOfferUnitPriceComparator.java | 403 +- .../GrandExchangeOfferWorldComparator.java | 247 +- .../src/main/java/GraphicsDefaults.java | 143 +- .../src/main/java/GraphicsObject.java | 116 +- runescape-client/src/main/java/HealthBar.java | 130 +- .../src/main/java/HealthBarDefinition.java | 161 +- .../src/main/java/HealthBarUpdate.java | 147 +- .../src/main/java/HitSplatDefinition.java | 546 +- .../src/main/java/HorizontalAlignment.java | 29 +- runescape-client/src/main/java/Huffman.java | 52 +- .../src/main/java/IgnoreList.java | 665 +- runescape-client/src/main/java/Ignored.java | 44 +- .../src/main/java/IndexedSprite.java | 32 +- .../src/main/java/Instrument.java | 80 +- .../src/main/java/IntHashTable.java | 8 +- .../src/main/java/IntegerNode.java | 4 +- .../src/main/java/InterfaceParent.java | 473 +- .../src/main/java/Interpreter.java | 173 +- .../src/main/java/InvDefinition.java | 792 +- .../src/main/java/IsaacCipher.java | 50 +- .../src/main/java/ItemContainer.java | 87 +- .../src/main/java/ItemDefinition.java | 352 +- .../src/main/java/IterableDualNodeQueue.java | 36 +- .../java/IterableDualNodeQueueIterator.java | 24 +- .../src/main/java/IterableNodeDeque.java | 120 +- .../IterableNodeDequeDescendingIterator.java | 42 +- .../src/main/java/IterableNodeHashTable.java | 36 +- .../java/IterableNodeHashTableIterator.java | 38 +- .../src/main/java/JagexCache.java | 66 +- .../src/main/java/KeyHandler.java | 1528 +--- .../src/main/java/KitDefinition.java | 83 +- runescape-client/src/main/java/Language.java | 158 +- runescape-client/src/main/java/Link.java | 12 +- runescape-client/src/main/java/LinkDeque.java | 22 +- runescape-client/src/main/java/Login.java | 240 +- .../src/main/java/LoginPacket.java | 744 +- .../src/main/java/LoginScreenAnimation.java | 467 +- runescape-client/src/main/java/LoginType.java | 94 +- .../src/main/java/MenuAction.java | 128 +- runescape-client/src/main/java/Message.java | 625 +- runescape-client/src/main/java/Messages.java | 379 +- .../src/main/java/MidiFileReader.java | 96 +- .../src/main/java/MidiPcmStream.java | 957 ++- .../src/main/java/MilliClock.java | 167 +- runescape-client/src/main/java/Model.java | 902 +- runescape-client/src/main/java/ModelData.java | 354 +- .../src/main/java/ModelData0.java | 272 +- .../src/main/java/MouseHandler.java | 320 +- .../src/main/java/MouseRecorder.java | 274 +- .../src/main/java/MouseWheel.java | 8 +- .../src/main/java/MouseWheelHandler.java | 24 +- .../src/main/java/MusicPatch.java | 377 +- .../src/main/java/MusicPatchNode.java | 926 +- .../src/main/java/MusicPatchNode2.java | 138 +- .../src/main/java/MusicPatchPcmStream.java | 183 +- .../src/main/java/MusicTrack.java | 28 +- runescape-client/src/main/java/NPC.java | 78 +- .../src/main/java/NPCDefinition.java | 289 +- runescape-client/src/main/java/NanoClock.java | 58 +- runescape-client/src/main/java/NetCache.java | 582 +- .../src/main/java/NetFileRequest.java | 45 +- runescape-client/src/main/java/NetSocket.java | 331 +- runescape-client/src/main/java/Node.java | 16 +- runescape-client/src/main/java/NodeDeque.java | 48 +- .../src/main/java/NodeHashTable.java | 34 +- .../src/main/java/ObjectDefinition.java | 352 +- .../src/main/java/ObjectNode.java | 4 +- .../src/main/java/ObjectSound.java | 125 +- runescape-client/src/main/java/Occluder.java | 263 +- .../src/main/java/PacketBuffer.java | 162 +- .../src/main/java/PacketBufferNode.java | 210 +- .../src/main/java/PacketWriter.java | 188 +- .../src/main/java/ParamDefinition.java | 89 +- runescape-client/src/main/java/PcmPlayer.java | 364 +- .../src/main/java/PcmPlayerProvider.java | 16 - runescape-client/src/main/java/PcmStream.java | 42 +- .../src/main/java/PcmStreamMixer.java | 134 +- .../src/main/java/PcmStreamMixerListener.java | 12 +- .../src/main/java/PendingSpawn.java | 176 +- .../src/main/java/PlatformInfo.java | 268 +- .../src/main/java/PlatformInfoProvider.java | 8 +- runescape-client/src/main/java/Player.java | 295 +- .../src/main/java/PlayerAppearance.java | 517 +- .../src/main/java/PlayerType.java | 217 +- runescape-client/src/main/java/Players.java | 106 +- .../src/main/java/PrivateChatMode.java | 36 +- .../src/main/java/Projectile.java | 168 +- .../src/main/java/RasterProvider.java | 30 +- .../src/main/java/Rasterizer2D.java | 62 +- .../src/main/java/Rasterizer3D.java | 602 +- .../src/main/java/RawPcmStream.java | 1066 +-- runescape-client/src/main/java/RawSound.java | 20 +- .../src/main/java/ReflectionCheck.java | 77 +- .../src/main/java/RouteStrategy.java | 223 +- .../src/main/java/RunException.java | 20 +- runescape-client/src/main/java/Scene.java | 783 +- runescape-client/src/main/java/Script.java | 184 +- .../src/main/java/ScriptEvent.java | 1051 +-- .../src/main/java/ScriptFrame.java | 382 +- .../src/main/java/SecureRandomCallable.java | 417 +- .../src/main/java/SecureRandomFuture.java | 64 +- .../src/main/java/SequenceDefinition.java | 223 +- .../src/main/java/ServerBuild.java | 113 +- .../src/main/java/ServerPacket.java | 1128 ++- runescape-client/src/main/java/Skeleton.java | 55 +- runescape-client/src/main/java/Skills.java | 58 +- .../src/main/java/SoftWrapper.java | 8 +- .../src/main/java/SoundCache.java | 137 +- .../src/main/java/SoundEffect.java | 26 +- .../src/main/java/SoundEnvelope.java | 38 +- .../src/main/java/SoundSystem.java | 64 +- .../main/java/SpotAnimationDefinition.java | 97 +- runescape-client/src/main/java/Sprite.java | 402 +- .../src/main/java/SpriteMask.java | 29 +- runescape-client/src/main/java/Strings.java | 58 +- .../src/main/java/StructDefinition.java | 67 +- .../src/main/java/StudioGame.java | 73 +- runescape-client/src/main/java/Task.java | 18 +- .../src/main/java/TaskHandler.java | 233 +- runescape-client/src/main/java/Texture.java | 153 +- .../src/main/java/TextureLoader.java | 24 +- .../src/main/java/TextureProvider.java | 189 +- runescape-client/src/main/java/Tile.java | 240 +- runescape-client/src/main/java/TileItem.java | 212 +- .../src/main/java/TileItemPile.java | 57 +- runescape-client/src/main/java/TileModel.java | 72 +- runescape-client/src/main/java/TilePaint.java | 96 +- runescape-client/src/main/java/Tiles.java | 615 +- runescape-client/src/main/java/Timer.java | 259 +- runescape-client/src/main/java/TriBool.java | 66 +- .../src/main/java/UrlRequest.java | 306 +- .../src/main/java/UrlRequester.java | 375 +- runescape-client/src/main/java/User.java | 132 +- .../src/main/java/UserComparator1.java | 19 +- .../src/main/java/UserComparator10.java | 64 +- .../src/main/java/UserComparator2.java | 18 +- .../src/main/java/UserComparator3.java | 125 +- .../src/main/java/UserComparator4.java | 41 +- .../src/main/java/UserComparator5.java | 59 +- .../src/main/java/UserComparator6.java | 573 +- .../src/main/java/UserComparator7.java | 80 +- .../src/main/java/UserComparator8.java | 105 +- .../src/main/java/UserComparator9.java | 68 +- runescape-client/src/main/java/UserList.java | 148 +- runescape-client/src/main/java/Username.java | 108 +- runescape-client/src/main/java/Usernamed.java | 8 +- .../src/main/java/VarbitDefinition.java | 671 +- runescape-client/src/main/java/VarcInt.java | 57 +- runescape-client/src/main/java/Varcs.java | 239 +- .../src/main/java/VarpDefinition.java | 57 +- runescape-client/src/main/java/Varps.java | 15 +- .../src/main/java/VertexNormal.java | 258 +- .../src/main/java/VerticalAlignment.java | 120 +- .../src/main/java/ViewportMouse.java | 236 +- .../src/main/java/VorbisCodebook.java | 73 +- .../src/main/java/VorbisFloor.java | 158 +- .../src/main/java/VorbisMapping.java | 10 +- .../src/main/java/VorbisResidue.java | 26 +- .../src/main/java/VorbisSample.java | 273 +- .../src/main/java/WallDecoration.java | 546 +- runescape-client/src/main/java/Widget.java | 658 +- runescape-client/src/main/java/World.java | 204 +- runescape-client/src/main/java/WorldMap.java | 741 +- .../src/main/java/WorldMapArchiveLoader.java | 42 +- .../src/main/java/WorldMapArea.java | 206 +- .../src/main/java/WorldMapAreaData.java | 271 +- .../src/main/java/WorldMapCacheName.java | 222 +- .../src/main/java/WorldMapData_0.java | 455 +- .../src/main/java/WorldMapData_1.java | 252 +- .../src/main/java/WorldMapDecoration.java | 413 +- .../src/main/java/WorldMapDecorationType.java | 270 +- .../src/main/java/WorldMapElement.java | 260 +- .../src/main/java/WorldMapEvent.java | 103 +- .../src/main/java/WorldMapID.java | 194 +- .../src/main/java/WorldMapIcon_0.java | 240 +- .../src/main/java/WorldMapIcon_1.java | 305 +- .../src/main/java/WorldMapLabel.java | 274 +- .../src/main/java/WorldMapLabelSize.java | 379 +- .../src/main/java/WorldMapManager.java | 777 +- .../src/main/java/WorldMapRectangle.java | 89 +- .../src/main/java/WorldMapRegion.java | 922 +- .../src/main/java/WorldMapSection.java | 32 +- .../src/main/java/WorldMapSection0.java | 206 +- .../src/main/java/WorldMapSection1.java | 313 +- .../src/main/java/WorldMapSection2.java | 255 +- .../src/main/java/WorldMapSectionType.java | 266 +- .../src/main/java/WorldMapSprite.java | 517 +- runescape-client/src/main/java/Wrapper.java | 8 +- runescape-client/src/main/java/class0.java | 18 +- runescape-client/src/main/java/class1.java | 598 +- runescape-client/src/main/java/class13.java | 132 +- runescape-client/src/main/java/class14.java | 333 +- runescape-client/src/main/java/class146.java | 6 +- runescape-client/src/main/java/class16.java | 47 +- runescape-client/src/main/java/class160.java | 312 +- runescape-client/src/main/java/class161.java | 2 +- runescape-client/src/main/java/class162.java | 48 +- runescape-client/src/main/java/class173.java | 55 +- runescape-client/src/main/java/class181.java | 2 +- runescape-client/src/main/java/class185.java | 477 +- runescape-client/src/main/java/class186.java | 166 +- runescape-client/src/main/java/class188.java | 43 +- runescape-client/src/main/java/class189.java | 1729 ++-- runescape-client/src/main/java/class191.java | 72 +- runescape-client/src/main/java/class192.java | 550 +- runescape-client/src/main/java/class195.java | 32 +- runescape-client/src/main/java/class197.java | 92 +- runescape-client/src/main/java/class2.java | 240 +- runescape-client/src/main/java/class208.java | 64 +- runescape-client/src/main/java/class210.java | 31 +- runescape-client/src/main/java/class215.java | 35 +- runescape-client/src/main/java/class216.java | 307 +- runescape-client/src/main/java/class218.java | 100 + runescape-client/src/main/java/class219.java | 239 - runescape-client/src/main/java/class222.java | 218 +- runescape-client/src/main/java/class223.java | 20 - runescape-client/src/main/java/class225.java | 19 - runescape-client/src/main/java/class226.java | 102 +- runescape-client/src/main/java/class227.java | 50 +- runescape-client/src/main/java/class237.java | 151 +- runescape-client/src/main/java/class247.java | 520 +- runescape-client/src/main/java/class266.java | 17 +- runescape-client/src/main/java/class267.java | 24 - runescape-client/src/main/java/class268.java | 15 +- runescape-client/src/main/java/class269.java | 13 +- runescape-client/src/main/java/class286.java | 10 +- runescape-client/src/main/java/class287.java | 137 +- runescape-client/src/main/java/class288.java | 38 +- runescape-client/src/main/java/class289.java | 190 +- runescape-client/src/main/java/class290.java | 122 - runescape-client/src/main/java/class296.java | 37 +- runescape-client/src/main/java/class297.java | 36 +- runescape-client/src/main/java/class3.java | 581 +- runescape-client/src/main/java/class30.java | 620 +- runescape-client/src/main/java/class300.java | 6 +- runescape-client/src/main/java/class312.java | 783 +- runescape-client/src/main/java/class319.java | 22 + runescape-client/src/main/java/class32.java | 499 +- runescape-client/src/main/java/class325.java | 416 +- runescape-client/src/main/java/class326.java | 21 + runescape-client/src/main/java/class335.java | 30 + runescape-client/src/main/java/class336.java | 18 +- runescape-client/src/main/java/class338.java | 14 +- runescape-client/src/main/java/class339.java | 11 + runescape-client/src/main/java/class4.java | 826 +- runescape-client/src/main/java/class40.java | 616 +- runescape-client/src/main/java/class42.java | 516 +- runescape-client/src/main/java/class43.java | 514 +- runescape-client/src/main/java/class47.java | 16 +- runescape-client/src/main/java/class49.java | 105 +- runescape-client/src/main/java/class51.java | 117 +- runescape-client/src/main/java/class60.java | 87 +- runescape-client/src/main/java/class65.java | 168 +- runescape-client/src/main/java/class80.java | 396 +- runescape-client/src/main/java/class81.java | 229 +- runescape-client/src/main/java/class83.java | 95 +- runescape-client/src/main/java/class96.java | 62 +- runescape-client/src/main/java/class99.java | 14 + .../java/net/runelite/rs/ScriptOpcodes.java | 1 + 344 files changed, 41280 insertions(+), 41078 deletions(-) delete mode 100644 runescape-client/src/main/java/ClientType.java delete mode 100644 runescape-client/src/main/java/PcmPlayerProvider.java create mode 100644 runescape-client/src/main/java/class218.java delete mode 100644 runescape-client/src/main/java/class219.java delete mode 100644 runescape-client/src/main/java/class223.java delete mode 100644 runescape-client/src/main/java/class225.java delete mode 100644 runescape-client/src/main/java/class267.java delete mode 100644 runescape-client/src/main/java/class290.java create mode 100644 runescape-client/src/main/java/class319.java create mode 100644 runescape-client/src/main/java/class326.java create mode 100644 runescape-client/src/main/java/class335.java create mode 100644 runescape-client/src/main/java/class339.java create mode 100644 runescape-client/src/main/java/class99.java diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index fac83295bf..4f77bbb293 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -27,11 +27,11 @@ const val kotlinVersion = "1.3.50" object ProjectVersions { const val launcherVersion = "2.0.3" - const val rlVersion = "1.5.37-SNAPSHOT" + const val rlVersion = "1.5.38-SNAPSHOT" const val openosrsVersion = "2.1.8.0" - const val rsversion = 184 + const val rsversion = 185 const val cacheversion = 165 } 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 b1561e7439..a71e222efa 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 @@ -63,7 +63,7 @@ public interface RSClient extends RSGameShell, Client @Override int getCameraZ2(); - @Import("plane") + @Import("Scene_plane") @Override int getPlane(); diff --git a/runescape-client/src/main/java/AbstractArchive.java b/runescape-client/src/main/java/AbstractArchive.java index db91852025..a26ec86f73 100644 --- a/runescape-client/src/main/java/AbstractArchive.java +++ b/runescape-client/src/main/java/AbstractArchive.java @@ -4,87 +4,87 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hp") +@ObfuscatedName("hq") @Implements("AbstractArchive") public abstract class AbstractArchive { - @ObfuscatedName("so") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lbl;" - ) - @Export("clientPreferences") - static ClientPreferences clientPreferences; - @ObfuscatedName("a") - @ObfuscatedSignature( - signature = "Llr;" + signature = "Llj;" ) @Export("gzipDecompressor") static GZipDecompressor gzipDecompressor; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 949229889 + intValue = -1159865063 ) - static int field3122; - @ObfuscatedName("n") + static int field3128; + @ObfuscatedName("hs") @ObfuscatedGetter( - intValue = -2001153217 + intValue = 906312301 + ) + @Export("oculusOrbFocalPointY") + static int oculusOrbFocalPointY; + @ObfuscatedName("t") + @ObfuscatedGetter( + intValue = -869416099 ) @Export("groupCount") int groupCount; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("groupIds") int[] groupIds; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("groupNameHashes") int[] groupNameHashes; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Llk;" + signature = "Lle;" ) @Export("groupNameHashTable") IntHashTable groupNameHashTable; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("groupCrcs") int[] groupCrcs; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("groupVersions") int[] groupVersions; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("fileCounts") int[] fileCounts; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("fileIds") int[][] fileIds; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("fileNameHashes") int[][] fileNameHashes; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "[Llk;" + signature = "[Lle;" ) @Export("fileNameHashTables") IntHashTable[] fileNameHashTables; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("groups") Object[] groups; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("files") Object[][] files; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = 194523033 + intValue = -514507625 ) @Export("hash") public int hash; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("releaseGroups") boolean releaseGroups; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("shallowFiles") boolean shallowFiles; static { gzipDecompressor = new GZipDecompressor(); - field3122 = 0; + field3128 = 0; } AbstractArchive(boolean var1, boolean var2) { @@ -92,131 +92,133 @@ public abstract class AbstractArchive { this.shallowFiles = var2; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([BS)V", - garbageValue = "4095" + signature = "([BI)V", + garbageValue = "-702728253" ) @Export("decodeIndex") void decodeIndex(byte[] var1) { - this.hash = Username.method5147(var1, var1.length); - Buffer var2 = new Buffer(MusicPatch.decompressBytes(var1)); - int var3 = var2.readUnsignedByte(); - if (var3 >= 5 && var3 <= 7) { - if (var3 >= 6) { - var2.readInt(); + int var3 = var1.length; + int var2 = class3.method50(var1, 0, var3); + this.hash = var2; + Buffer var4 = new Buffer(ArchiveLoader.decompressBytes(var1)); + int var5 = var4.readUnsignedByte(); + if (var5 >= 5 && var5 <= 7) { + if (var5 >= 6) { + var4.readInt(); } - int var4 = var2.readUnsignedByte(); - if (var3 >= 7) { - this.groupCount = var2.method5458(); + int var6 = var4.readUnsignedByte(); + if (var5 >= 7) { + this.groupCount = var4.method5624(); } else { - this.groupCount = var2.readUnsignedShort(); + this.groupCount = var4.readUnsignedShort(); } - int var5 = 0; - int var6 = -1; + int var7 = 0; + int var8 = -1; this.groupIds = new int[this.groupCount]; - int var7; - if (var3 >= 7) { - for (var7 = 0; var7 < this.groupCount; ++var7) { - this.groupIds[var7] = var5 += var2.method5458(); - if (this.groupIds[var7] > var6) { - var6 = this.groupIds[var7]; + int var9; + if (var5 >= 7) { + for (var9 = 0; var9 < this.groupCount; ++var9) { + this.groupIds[var9] = var7 += var4.method5624(); + if (this.groupIds[var9] > var8) { + var8 = this.groupIds[var9]; } } } else { - for (var7 = 0; var7 < this.groupCount; ++var7) { - this.groupIds[var7] = var5 += var2.readUnsignedShort(); - if (this.groupIds[var7] > var6) { - var6 = this.groupIds[var7]; + for (var9 = 0; var9 < this.groupCount; ++var9) { + this.groupIds[var9] = var7 += var4.readUnsignedShort(); + if (this.groupIds[var9] > var8) { + var8 = this.groupIds[var9]; } } } - this.groupCrcs = new int[var6 + 1]; - this.groupVersions = new int[var6 + 1]; - this.fileCounts = new int[var6 + 1]; - this.fileIds = new int[var6 + 1][]; - this.groups = new Object[var6 + 1]; - this.files = new Object[var6 + 1][]; - if (var4 != 0) { - this.groupNameHashes = new int[var6 + 1]; + this.groupCrcs = new int[var8 + 1]; + this.groupVersions = new int[var8 + 1]; + this.fileCounts = new int[var8 + 1]; + this.fileIds = new int[var8 + 1][]; + this.groups = new Object[var8 + 1]; + this.files = new Object[var8 + 1][]; + if (var6 != 0) { + this.groupNameHashes = new int[var8 + 1]; - for (var7 = 0; var7 < this.groupCount; ++var7) { - this.groupNameHashes[this.groupIds[var7]] = var2.readInt(); + for (var9 = 0; var9 < this.groupCount; ++var9) { + this.groupNameHashes[this.groupIds[var9]] = var4.readInt(); } this.groupNameHashTable = new IntHashTable(this.groupNameHashes); } - for (var7 = 0; var7 < this.groupCount; ++var7) { - this.groupCrcs[this.groupIds[var7]] = var2.readInt(); + for (var9 = 0; var9 < this.groupCount; ++var9) { + this.groupCrcs[this.groupIds[var9]] = var4.readInt(); } - for (var7 = 0; var7 < this.groupCount; ++var7) { - this.groupVersions[this.groupIds[var7]] = var2.readInt(); + for (var9 = 0; var9 < this.groupCount; ++var9) { + this.groupVersions[this.groupIds[var9]] = var4.readInt(); } - for (var7 = 0; var7 < this.groupCount; ++var7) { - this.fileCounts[this.groupIds[var7]] = var2.readUnsignedShort(); + for (var9 = 0; var9 < this.groupCount; ++var9) { + this.fileCounts[this.groupIds[var9]] = var4.readUnsignedShort(); } - int var8; - int var9; int var10; int var11; int var12; - if (var3 >= 7) { - for (var7 = 0; var7 < this.groupCount; ++var7) { - var8 = this.groupIds[var7]; - var9 = this.fileCounts[var8]; - var5 = 0; - var10 = -1; - this.fileIds[var8] = new int[var9]; + int var13; + int var14; + if (var5 >= 7) { + for (var9 = 0; var9 < this.groupCount; ++var9) { + var10 = this.groupIds[var9]; + var11 = this.fileCounts[var10]; + var7 = 0; + var12 = -1; + this.fileIds[var10] = new int[var11]; - for (var11 = 0; var11 < var9; ++var11) { - var12 = this.fileIds[var8][var11] = var5 += var2.method5458(); - if (var12 > var10) { - var10 = var12; + for (var13 = 0; var13 < var11; ++var13) { + var14 = this.fileIds[var10][var13] = var7 += var4.method5624(); + if (var14 > var12) { + var12 = var14; } } - this.files[var8] = new Object[var10 + 1]; + this.files[var10] = new Object[var12 + 1]; } } else { - for (var7 = 0; var7 < this.groupCount; ++var7) { - var8 = this.groupIds[var7]; - var9 = this.fileCounts[var8]; - var5 = 0; - var10 = -1; - this.fileIds[var8] = new int[var9]; + for (var9 = 0; var9 < this.groupCount; ++var9) { + var10 = this.groupIds[var9]; + var11 = this.fileCounts[var10]; + var7 = 0; + var12 = -1; + this.fileIds[var10] = new int[var11]; - for (var11 = 0; var11 < var9; ++var11) { - var12 = this.fileIds[var8][var11] = var5 += var2.readUnsignedShort(); - if (var12 > var10) { - var10 = var12; + for (var13 = 0; var13 < var11; ++var13) { + var14 = this.fileIds[var10][var13] = var7 += var4.readUnsignedShort(); + if (var14 > var12) { + var12 = var14; } } - this.files[var8] = new Object[var10 + 1]; + this.files[var10] = new Object[var12 + 1]; } } - if (var4 != 0) { - this.fileNameHashes = new int[var6 + 1][]; - this.fileNameHashTables = new IntHashTable[var6 + 1]; + if (var6 != 0) { + this.fileNameHashes = new int[var8 + 1][]; + this.fileNameHashTables = new IntHashTable[var8 + 1]; - for (var7 = 0; var7 < this.groupCount; ++var7) { - var8 = this.groupIds[var7]; - var9 = this.fileCounts[var8]; - this.fileNameHashes[var8] = new int[this.files[var8].length]; + for (var9 = 0; var9 < this.groupCount; ++var9) { + var10 = this.groupIds[var9]; + var11 = this.fileCounts[var10]; + this.fileNameHashes[var10] = new int[this.files[var10].length]; - for (var10 = 0; var10 < var9; ++var10) { - this.fileNameHashes[var8][this.fileIds[var8][var10]] = var2.readInt(); + for (var12 = 0; var12 < var11; ++var12) { + this.fileNameHashes[var10][this.fileIds[var10][var12]] = var4.readInt(); } - this.fileNameHashTables[var8] = new IntHashTable(this.fileNameHashes[var8]); + this.fileNameHashTables[var10] = new IntHashTable(this.fileNameHashes[var10]); } } @@ -225,29 +227,29 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IB)V", - garbageValue = "15" + garbageValue = "117" ) @Export("loadRegionFromGroup") void loadRegionFromGroup(int var1) { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IIS)[B", - garbageValue = "3526" + signature = "(III)[B", + garbageValue = "-1573138603" ) @Export("takeFile") public byte[] takeFile(int var1, int var2) { return this.takeFileEncrypted(var1, var2, (int[])null); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(II[II)[B", - garbageValue = "726476664" + signature = "(II[IB)[B", + garbageValue = "0" ) @Export("takeFileEncrypted") public byte[] takeFileEncrypted(int var1, int var2, int[] var3) { @@ -263,7 +265,7 @@ public abstract class AbstractArchive { } } - byte[] var5 = GrandExchangeOfferUnitPriceComparator.serialize(this.files[var1][var2], false); + byte[] var5 = Decimator.serialize(this.files[var1][var2], false); if (this.shallowFiles) { this.files[var1][var2] = null; } @@ -274,10 +276,10 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "1834518299" + garbageValue = "2054202524" ) @Export("tryLoadFile") public boolean tryLoadFile(int var1, int var2) { @@ -295,12 +297,12 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "-812316387" + signature = "(IS)Z", + garbageValue = "-31796" ) - public boolean method4127(int var1) { + public boolean method4327(int var1) { if (this.files.length == 1) { return this.tryLoadFile(0, var1); } else if (this.files[var1].length == 1) { @@ -310,10 +312,10 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-1731378181" + garbageValue = "-1781242235" ) @Export("tryLoadGroup") public boolean tryLoadGroup(int var1) { @@ -325,10 +327,10 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "304263263" + garbageValue = "-2109708107" ) @Export("isFullyLoaded") public boolean isFullyLoaded() { @@ -347,20 +349,20 @@ public abstract class AbstractArchive { return var1; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(II)I", - garbageValue = "-2030453035" + garbageValue = "-778670663" ) @Export("groupLoadPercent") int groupLoadPercent(int var1) { return this.groups[var1] != null ? 100 : 0; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(II)[B", - garbageValue = "1500956982" + signature = "(IB)[B", + garbageValue = "-112" ) @Export("takeFileFlat") public byte[] takeFileFlat(int var1) { @@ -373,10 +375,10 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( signature = "(III)[B", - garbageValue = "1923776823" + garbageValue = "-315309482" ) @Export("getFile") public byte[] getFile(int var1, int var2) { @@ -392,17 +394,17 @@ public abstract class AbstractArchive { } } - byte[] var4 = GrandExchangeOfferUnitPriceComparator.serialize(this.files[var1][var2], false); + byte[] var4 = Decimator.serialize(this.files[var1][var2], false); return var4; } else { return null; } } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(IB)[B", - garbageValue = "96" + signature = "(II)[B", + garbageValue = "-2080975442" ) @Export("getFileFlat") public byte[] getFileFlat(int var1) { @@ -415,49 +417,49 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "848617854" + garbageValue = "664192835" ) @Export("loadGroup") void loadGroup(int var1) { } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(IB)[I", - garbageValue = "-61" + signature = "(II)[I", + garbageValue = "1547416359" ) @Export("getGroupFileIds") public int[] getGroupFileIds(int var1) { return var1 >= 0 && var1 < this.fileIds.length ? this.fileIds[var1] : null; } - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( signature = "(II)I", - garbageValue = "-1937840631" + garbageValue = "-829743673" ) @Export("getGroupFileCount") public int getGroupFileCount(int var1) { return this.files[var1].length; } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "-101" + garbageValue = "107" ) @Export("getGroupCount") public int getGroupCount() { return this.files.length; } - @ObfuscatedName("h") + @ObfuscatedName("r") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1193777199" + garbageValue = "77380292" ) @Export("clearGroups") public void clearGroups() { @@ -467,10 +469,10 @@ public abstract class AbstractArchive { } - @ObfuscatedName("s") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1926198322" + signature = "(IB)V", + garbageValue = "17" ) @Export("clearFilesGroup") public void clearFilesGroup(int var1) { @@ -480,10 +482,10 @@ public abstract class AbstractArchive { } - @ObfuscatedName("f") + @ObfuscatedName("s") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1263344370" + garbageValue = "1828023605" ) @Export("clearFiles") public void clearFiles() { @@ -497,10 +499,10 @@ public abstract class AbstractArchive { } - @ObfuscatedName("j") + @ObfuscatedName("b") @ObfuscatedSignature( signature = "(I[II)Z", - garbageValue = "1408640769" + garbageValue = "1853690533" ) @Export("buildFiles") boolean buildFiles(int var1, int[] var2) { @@ -523,15 +525,15 @@ public abstract class AbstractArchive { return true; } else { byte[] var18; - if (var2 != null && (var2[0] != 0 || var2[1] != 0 || var2[2] != 0 || var2[3] != 0)) { - var18 = GrandExchangeOfferUnitPriceComparator.serialize(this.groups[var1], true); + if (var2 == null || var2[0] == 0 && var2[1] == 0 && var2[2] == 0 && var2[3] == 0) { + var18 = Decimator.serialize(this.groups[var1], false); + } else { + var18 = Decimator.serialize(this.groups[var1], true); Buffer var8 = new Buffer(var18); var8.xteaDecrypt(var2, 5, var8.array.length); - } else { - var18 = GrandExchangeOfferUnitPriceComparator.serialize(this.groups[var1], false); } - byte[] var20 = MusicPatch.decompressBytes(var18); + byte[] var20 = ArchiveLoader.decompressBytes(var18); if (this.releaseGroups) { this.groups[var1] = null; } @@ -579,13 +581,13 @@ public abstract class AbstractArchive { for (var15 = 0; var15 < var3; ++var15) { if (!this.shallowFiles) { - var5[var4[var15]] = GrandExchangeEvents.method76(var19[var15], false); + var5[var4[var15]] = MusicPatchPcmStream.method4064(var19[var15], false); } else { var5[var4[var15]] = var19[var15]; } } } else if (!this.shallowFiles) { - var5[var4[0]] = GrandExchangeEvents.method76(var20, false); + var5[var4[0]] = MusicPatchPcmStream.method4064(var20, false); } else { var5[var4[0]] = var20; } @@ -595,95 +597,95 @@ public abstract class AbstractArchive { } } - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)I", - garbageValue = "-276996300" + garbageValue = "-568803871" ) @Export("getGroupId") public int getGroupId(String var1) { var1 = var1.toLowerCase(); - return this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); + return this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); } - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "(ILjava/lang/String;I)I", - garbageValue = "-1445606076" + signature = "(ILjava/lang/String;B)I", + garbageValue = "1" ) @Export("getFileId") public int getFileId(int var1, String var2) { var2 = var2.toLowerCase(); - return this.fileNameHashTables[var1].get(WorldMapData_0.hashString(var2)); + return this.fileNameHashTables[var1].get(WorldMapIcon_0.hashString(var2)); } - @ObfuscatedName("k") + @ObfuscatedName("ad") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;S)Z", - garbageValue = "8717" + signature = "(Ljava/lang/String;Ljava/lang/String;B)Z", + garbageValue = "-1" ) @Export("isValidFileName") public boolean isValidFileName(String var1, String var2) { var1 = var1.toLowerCase(); var2 = var2.toLowerCase(); - int var3 = this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); + int var3 = this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); if (var3 < 0) { return false; } else { - int var4 = this.fileNameHashTables[var3].get(WorldMapData_0.hashString(var2)); + int var4 = this.fileNameHashTables[var3].get(WorldMapIcon_0.hashString(var2)); return var4 >= 0; } } - @ObfuscatedName("ac") + @ObfuscatedName("ag") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;B)[B", - garbageValue = "0" + signature = "(Ljava/lang/String;Ljava/lang/String;I)[B", + garbageValue = "1996624784" ) @Export("takeFileByNames") public byte[] takeFileByNames(String var1, String var2) { var1 = var1.toLowerCase(); var2 = var2.toLowerCase(); - int var3 = this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); - int var4 = this.fileNameHashTables[var3].get(WorldMapData_0.hashString(var2)); + int var3 = this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); + int var4 = this.fileNameHashTables[var3].get(WorldMapIcon_0.hashString(var2)); return this.takeFile(var3, var4); } - @ObfuscatedName("aa") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;B)Z", - garbageValue = "-68" + signature = "(Ljava/lang/String;Ljava/lang/String;I)Z", + garbageValue = "1453372171" ) @Export("tryLoadFileByNames") public boolean tryLoadFileByNames(String var1, String var2) { var1 = var1.toLowerCase(); var2 = var2.toLowerCase(); - int var3 = this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); - int var4 = this.fileNameHashTables[var3].get(WorldMapData_0.hashString(var2)); + int var3 = this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); + int var4 = this.fileNameHashTables[var3].get(WorldMapIcon_0.hashString(var2)); return this.tryLoadFile(var3, var4); } - @ObfuscatedName("ap") + @ObfuscatedName("av") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)Z", - garbageValue = "1601927711" + garbageValue = "1150520386" ) @Export("tryLoadGroupByName") public boolean tryLoadGroupByName(String var1) { var1 = var1.toLowerCase(); - int var2 = this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); + int var2 = this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); return this.tryLoadGroup(var2); } - @ObfuscatedName("ar") + @ObfuscatedName("am") @ObfuscatedSignature( signature = "(Ljava/lang/String;B)V", - garbageValue = "-63" + garbageValue = "-94" ) @Export("loadRegionFromName") public void loadRegionFromName(String var1) { var1 = var1.toLowerCase(); - int var2 = this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); + int var2 = this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); if (var2 >= 0) { this.loadRegionFromGroup(var2); } @@ -691,23 +693,119 @@ public abstract class AbstractArchive { @ObfuscatedName("ab") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)I", - garbageValue = "-2026426136" + signature = "(Ljava/lang/String;B)I", + garbageValue = "125" ) @Export("groupLoadPercentByName") public int groupLoadPercentByName(String var1) { var1 = var1.toLowerCase(); - int var2 = this.groupNameHashTable.get(WorldMapData_0.hashString(var1)); + int var2 = this.groupNameHashTable.get(WorldMapIcon_0.hashString(var1)); return this.groupLoadPercent(var2); } - @ObfuscatedName("b") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(CI)Z", - garbageValue = "-715141816" + signature = "(II)Ljava/lang/String;", + garbageValue = "-1378160996" ) - @Export("isAlphaNumeric") - public static boolean isAlphaNumeric(char var0) { - return var0 >= '0' && var0 <= '9' || var0 >= 'A' && var0 <= 'Z' || var0 >= 'a' && var0 <= 'z'; + @Export("colorStartTag") + static String colorStartTag(int var0) { + return ""; + } + + @ObfuscatedName("fm") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-1166291616" + ) + @Export("getLoginError") + static void getLoginError(int var0) { + if (var0 == -3) { + GrandExchangeOffer.setLoginResponseString("Connection timed out.", "Please try using a different world.", ""); + } else if (var0 == -2) { + GrandExchangeOffer.setLoginResponseString("", "Error connecting to server.", ""); + } else if (var0 == -1) { + GrandExchangeOffer.setLoginResponseString("No response from server.", "Please try using a different world.", ""); + } else if (var0 == 3) { + Login.loginIndex = 3; + Login.field1166 = 1; + } else if (var0 == 4) { + Login.loginIndex = 12; + Login.field1156 = 0; + } else if (var0 == 5) { + Login.field1166 = 2; + GrandExchangeOffer.setLoginResponseString("Your account has not logged out from its last", "session or the server is too busy right now.", "Please try again in a few minutes."); + } else if (var0 == 68 || !Client.onMobile && var0 == 6) { + GrandExchangeOffer.setLoginResponseString("RuneScape has been updated!", "Please reload this page.", ""); + } else if (var0 == 7) { + GrandExchangeOffer.setLoginResponseString("This world is full.", "Please use a different world.", ""); + } else if (var0 == 8) { + GrandExchangeOffer.setLoginResponseString("Unable to connect.", "Login server offline.", ""); + } else if (var0 == 9) { + GrandExchangeOffer.setLoginResponseString("Login limit exceeded.", "Too many connections from your address.", ""); + } else if (var0 == 10) { + GrandExchangeOffer.setLoginResponseString("Unable to connect.", "Bad session id.", ""); + } else if (var0 == 11) { + GrandExchangeOffer.setLoginResponseString("We suspect someone knows your password.", "Press 'change your password' on front page.", ""); + } else if (var0 == 12) { + GrandExchangeOffer.setLoginResponseString("You need a members account to login to this world.", "Please subscribe, or use a different world.", ""); + } else if (var0 == 13) { + GrandExchangeOffer.setLoginResponseString("Could not complete login.", "Please try using a different world.", ""); + } else if (var0 == 14) { + GrandExchangeOffer.setLoginResponseString("The server is being updated.", "Please wait 1 minute and try again.", ""); + } else if (var0 == 16) { + GrandExchangeOffer.setLoginResponseString("Too many login attempts.", "Please wait a few minutes before trying again.", ""); + } else if (var0 == 17) { + GrandExchangeOffer.setLoginResponseString("You are standing in a members-only area.", "To play on this world move to a free area first", ""); + } else if (var0 == 18) { + Login.loginIndex = 12; + Login.field1156 = 1; + } else if (var0 == 19) { + GrandExchangeOffer.setLoginResponseString("This world is running a closed Beta.", "Sorry invited players only.", "Please use a different world."); + } else if (var0 == 20) { + GrandExchangeOffer.setLoginResponseString("Invalid loginserver requested.", "Please try using a different world.", ""); + } else if (var0 == 22) { + GrandExchangeOffer.setLoginResponseString("Malformed login packet.", "Please try again.", ""); + } else if (var0 == 23) { + GrandExchangeOffer.setLoginResponseString("No reply from loginserver.", "Please wait 1 minute and try again.", ""); + } else if (var0 == 24) { + GrandExchangeOffer.setLoginResponseString("Error loading your profile.", "Please contact customer support.", ""); + } else if (var0 == 25) { + GrandExchangeOffer.setLoginResponseString("Unexpected loginserver response.", "Please try using a different world.", ""); + } else if (var0 == 26) { + GrandExchangeOffer.setLoginResponseString("This computers address has been blocked", "as it was used to break our rules.", ""); + } else if (var0 == 27) { + GrandExchangeOffer.setLoginResponseString("", "Service unavailable.", ""); + } else if (var0 == 31) { + GrandExchangeOffer.setLoginResponseString("Your account must have a displayname set", "in order to play the game. Please set it", "via the website, or the main game."); + } else if (var0 == 32) { + GrandExchangeOffer.setLoginResponseString("Your attempt to log into your account was", "unsuccessful. Don't worry, you can sort", "this out by visiting the billing system."); + } else if (var0 == 37) { + GrandExchangeOffer.setLoginResponseString("Your account is currently inaccessible.", "Please try again in a few minutes.", ""); + } else if (var0 == 38) { + GrandExchangeOffer.setLoginResponseString("You need to vote to play!", "Visit runescape.com and vote,", "and then come back here!"); + } else if (var0 == 55) { + Login.loginIndex = 8; + } else { + if (var0 == 56) { + GrandExchangeOffer.setLoginResponseString("Enter the 6-digit code generated by your", "authenticator app.", ""); + Tile.updateGameState(11); + return; + } + + if (var0 == 57) { + GrandExchangeOffer.setLoginResponseString("The code you entered was incorrect.", "Please try again.", ""); + Tile.updateGameState(11); + return; + } + + if (var0 == 61) { + Login.loginIndex = 7; + } else { + GrandExchangeOffer.setLoginResponseString("Unexpected server response", "Please try using a different world.", ""); + } + } + + Tile.updateGameState(10); } } diff --git a/runescape-client/src/main/java/AbstractByteArrayCopier.java b/runescape-client/src/main/java/AbstractByteArrayCopier.java index 8b8de35837..b6d21bd8ae 100644 --- a/runescape-client/src/main/java/AbstractByteArrayCopier.java +++ b/runescape-client/src/main/java/AbstractByteArrayCopier.java @@ -1,111 +1,72 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("gx") +@ObfuscatedName("gc") @Implements("AbstractByteArrayCopier") public abstract class AbstractByteArrayCopier { + @ObfuscatedName("n") + @ObfuscatedGetter( + intValue = 977117713 + ) + @Export("WorldMapElement_count") + public static int WorldMapElement_count; + AbstractByteArrayCopier() { } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(B)[B", - garbageValue = "-37" + garbageValue = "19" ) @Export("get") abstract byte[] get(); - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "([BI)V", - garbageValue = "-793496359" + signature = "([BB)V", + garbageValue = "-93" ) @Export("set") abstract void set(byte[] var1); - @ObfuscatedName("y") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(I)Lbo;", - garbageValue = "1470103686" + signature = "(ILcj;ZI)I", + garbageValue = "2005076338" ) - @Export("getNextWorldListWorld") - static World getNextWorldListWorld() { - return World.World_listCount < World.World_count ? World.World_worlds[++World.World_listCount - 1] : null; + static int method4093(int var0, Script var1, boolean var2) { + Widget var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + if (var0 == ScriptOpcodes.CC_GETINVOBJECT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemId; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETINVCOUNT) { + if (var3.itemId != -1) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemQuantity; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CC_GETID) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.childIndex; + return 1; + } else { + return 2; + } } - @ObfuscatedName("gv") + @ObfuscatedName("kb") @ObfuscatedSignature( - signature = "(IIIIZI)V", - garbageValue = "949599509" + signature = "(B)V", + garbageValue = "-66" ) - @Export("setViewportShape") - static final void setViewportShape(int var0, int var1, int var2, int var3, boolean var4) { - if (var2 < 1) { - var2 = 1; - } - - if (var3 < 1) { - var3 = 1; - } - - int var5 = var3 - 334; - int var6; - if (var5 < 0) { - var6 = Client.field880; - } else if (var5 >= 100) { - var6 = Client.field887; - } else { - var6 = (Client.field887 - Client.field880) * var5 / 100 + Client.field880; - } - - int var7 = var3 * var6 * 512 / (var2 * 334); - int var8; - int var9; - short var10; - if (var7 < Client.field892) { - var10 = Client.field892; - var6 = var10 * var2 * 334 / (var3 * 512); - if (var6 > Client.field891) { - var6 = Client.field891; - var8 = var3 * var6 * 512 / (var10 * 334); - var9 = (var2 - var8) / 2; - if (var4) { - Rasterizer2D.Rasterizer2D_resetClip(); - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var9, var3, -16777216); - Rasterizer2D.Rasterizer2D_fillRectangle(var0 + var2 - var9, var1, var9, var3, -16777216); - } - - var0 += var9; - var2 -= var9 * 2; - } - } else if (var7 > Client.field893) { - var10 = Client.field893; - var6 = var10 * var2 * 334 / (var3 * 512); - if (var6 < Client.field686) { - var6 = Client.field686; - var8 = var10 * var2 * 334 / (var6 * 512); - var9 = (var3 - var8) / 2; - if (var4) { - Rasterizer2D.Rasterizer2D_resetClip(); - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var9, -16777216); - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var3 + var1 - var9, var2, var9, -16777216); - } - - var1 += var9; - var3 -= var9 * 2; - } - } - - Client.viewportZoom = var3 * var6 / 334; - if (var2 != Client.viewportWidth || var3 != Client.viewportHeight) { - GrandExchangeOfferTotalQuantityComparator.method91(var2, var3); - } - - Client.viewportOffsetX = var0; - Client.viewportOffsetY = var1; - Client.viewportWidth = var2; - Client.viewportHeight = var3; + static final void method4092() { + Client.field825 = Client.cycleCntr; + Ignored.ClanChat_inClanChat = true; } } diff --git a/runescape-client/src/main/java/AbstractFont.java b/runescape-client/src/main/java/AbstractFont.java index 5b351460cc..fcae714b6a 100644 --- a/runescape-client/src/main/java/AbstractFont.java +++ b/runescape-client/src/main/java/AbstractFont.java @@ -4,76 +4,76 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kh") +@ObfuscatedName("kx") @Implements("AbstractFont") public abstract class AbstractFont extends Rasterizer2D { - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "[Llp;" + signature = "[Llw;" ) @Export("AbstractFont_modIconSprites") public static IndexedSprite[] AbstractFont_modIconSprites; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("AbstractFont_strike") static int AbstractFont_strike; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("AbstractFont_underline") static int AbstractFont_underline; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("AbstractFont_previousShadow") static int AbstractFont_previousShadow; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("AbstractFont_shadow") static int AbstractFont_shadow; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("AbstractFont_previousColor") static int AbstractFont_previousColor; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("AbstractFont_color") static int AbstractFont_color; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("AbstractFont_alpha") static int AbstractFont_alpha; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("AbstractFont_justificationTotal") static int AbstractFont_justificationTotal; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("AbstractFont_justificationCurrent") static int AbstractFont_justificationCurrent; - @ObfuscatedName("s") + @ObfuscatedName("z") @Export("AbstractFont_random") static Random AbstractFont_random; @ObfuscatedName("f") @Export("AbstractFont_lines") static String[] AbstractFont_lines; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("pixels") byte[][] pixels; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("advances") int[] advances; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("widths") int[] widths; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("heights") int[] heights; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("leftBearings") int[] leftBearings; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("topBearings") int[] topBearings; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("ascent") public int ascent; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("maxAscent") public int maxAscent; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("maxDescent") public int maxDescent; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("kerning") byte[] kerning; @@ -123,15 +123,15 @@ public abstract class AbstractFont extends Rasterizer2D { this.readMetrics(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("drawGlyph") abstract void drawGlyph(byte[] var1, int var2, int var3, int var4, int var5, int var6); - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("drawGlyphAlpha") abstract void drawGlyphAlpha(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7); - @ObfuscatedName("y") + @ObfuscatedName("o") @Export("readMetrics") void readMetrics(byte[] var1) { this.advances = new int[256]; @@ -193,7 +193,7 @@ public abstract class AbstractFont extends Rasterizer2D { if (var13 != 32 && var13 != 160) { for (var8 = 0; var8 < 256; ++var8) { if (var8 != 32 && var8 != 160) { - this.kerning[var8 + (var13 << 8)] = (byte)method5290(var11, var12, var4, this.advances, var10, var13, var8); + this.kerning[var8 + (var13 << 8)] = (byte)method5506(var11, var12, var4, this.advances, var10, var13, var8); } } } @@ -204,17 +204,17 @@ public abstract class AbstractFont extends Rasterizer2D { } - @ObfuscatedName("c") + @ObfuscatedName("d") @Export("charWidth") int charWidth(char var1) { if (var1 == 160) { var1 = ' '; } - return this.advances[Entity.charToByteCp1252(var1) & 255]; + return this.advances[WorldMapData_1.charToByteCp1252(var1) & 255]; } - @ObfuscatedName("b") + @ObfuscatedName("m") @Export("stringWidth") public int stringWidth(String var1) { if (var1 == null) { @@ -238,7 +238,7 @@ public abstract class AbstractFont extends Rasterizer2D { if (!var7.equals("gt")) { if (var7.startsWith("img=")) { try { - int var8 = TilePaint.parseInt(var7.substring(4)); + int var8 = ClientPreferences.parseInt(var7.substring(4)); var4 += AbstractFont_modIconSprites[var8].width; var3 = -1; } catch (Exception var10) { @@ -256,7 +256,7 @@ public abstract class AbstractFont extends Rasterizer2D { } if (var2 == -1) { - var4 += this.advances[(char)(Entity.charToByteCp1252(var6) & 255)]; + var4 += this.advances[(char)(WorldMapData_1.charToByteCp1252(var6) & 255)]; if (this.kerning != null && var3 != -1) { var4 += this.kerning[var6 + (var3 << 8)]; } @@ -270,7 +270,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("o") + @ObfuscatedName("p") @Export("breakLines") public int breakLines(String var1, int[] var2, String[] var3) { if (var1 == null) { @@ -321,7 +321,7 @@ public abstract class AbstractFont extends Rasterizer2D { var11 = '>'; } else if (var16.startsWith("img=")) { try { - int var17 = TilePaint.parseInt(var16.substring(4)); + int var17 = ClientPreferences.parseInt(var16.substring(4)); var4 += AbstractFont_modIconSprites[var17].width; var11 = 0; } catch (Exception var20) { @@ -375,7 +375,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("a") + @ObfuscatedName("h") @Export("lineWidth") public int lineWidth(String var1, int var2) { int var3 = this.breakLines(var1, new int[]{var2}, AbstractFont_lines); @@ -391,13 +391,13 @@ public abstract class AbstractFont extends Rasterizer2D { return var4; } - @ObfuscatedName("e") + @ObfuscatedName("k") @Export("lineCount") public int lineCount(String var1, int var2) { return this.breakLines(var1, new int[]{var2}, AbstractFont_lines); } - @ObfuscatedName("h") + @ObfuscatedName("j") @Export("draw") public void draw(String var1, int var2, int var3, int var4, int var5) { if (var1 != null) { @@ -406,7 +406,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("s") + @ObfuscatedName("r") @Export("drawAlpha") public void drawAlpha(String var1, int var2, int var3, int var4, int var5, int var6) { if (var1 != null) { @@ -416,7 +416,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("f") + @ObfuscatedName("e") @Export("drawRightAligned") public void drawRightAligned(String var1, int var2, int var3, int var4, int var5) { if (var1 != null) { @@ -425,7 +425,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("j") + @ObfuscatedName("s") @Export("drawCentered") public void drawCentered(String var1, int var2, int var3, int var4, int var5) { if (var1 != null) { @@ -434,7 +434,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("d") + @ObfuscatedName("b") @Export("drawLines") public int drawLines(String var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { if (var1 == null) { @@ -495,7 +495,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("l") + @ObfuscatedName("w") @Export("drawCenteredWave") public void drawCenteredWave(String var1, int var2, int var3, int var4, int var5, int var6) { if (var1 != null) { @@ -510,7 +510,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("k") + @ObfuscatedName("u") @Export("drawCenteredWave2") public void drawCenteredWave2(String var1, int var2, int var3, int var4, int var5, int var6) { if (var1 != null) { @@ -527,7 +527,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("ac") + @ObfuscatedName("ad") @Export("drawCenteredShake") public void drawCenteredShake(String var1, int var2, int var3, int var4, int var5, int var6, int var7) { if (var1 != null) { @@ -547,7 +547,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("aa") + @ObfuscatedName("ag") @Export("drawRandomAlphaAndSpacing") public void drawRandomAlphaAndSpacing(String var1, int var2, int var3, int var4, int var5, int var6) { if (var1 != null) { @@ -568,7 +568,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("ap") + @ObfuscatedName("ak") @Export("reset") void reset(int var1, int var2) { AbstractFont_strike = -1; @@ -582,28 +582,38 @@ public abstract class AbstractFont extends Rasterizer2D { AbstractFont_justificationCurrent = 0; } - @ObfuscatedName("ar") + @ObfuscatedName("av") @Export("decodeTag") void decodeTag(String var1) { try { + int var2; + String var3; if (var1.startsWith("col=")) { - AbstractFont_color = class2.method29(var1.substring(4), 16); + var3 = var1.substring(4); + var2 = class192.parseIntCustomRadix(var3, 16, true); + AbstractFont_color = var2; } else if (var1.equals("/col")) { AbstractFont_color = AbstractFont_previousColor; } else if (var1.startsWith("str=")) { - AbstractFont_strike = class2.method29(var1.substring(4), 16); + var3 = var1.substring(4); + var2 = class192.parseIntCustomRadix(var3, 16, true); + AbstractFont_strike = var2; } else if (var1.equals("str")) { AbstractFont_strike = 8388608; } else if (var1.equals("/str")) { AbstractFont_strike = -1; } else if (var1.startsWith("u=")) { - AbstractFont_underline = class2.method29(var1.substring(2), 16); + var3 = var1.substring(2); + var2 = class192.parseIntCustomRadix(var3, 16, true); + AbstractFont_underline = var2; } else if (var1.equals("u")) { AbstractFont_underline = 0; } else if (var1.equals("/u")) { AbstractFont_underline = -1; } else if (var1.startsWith("shad=")) { - AbstractFont_shadow = class2.method29(var1.substring(5), 16); + var3 = var1.substring(5); + var2 = class192.parseIntCustomRadix(var3, 16, true); + AbstractFont_shadow = var2; } else if (var1.equals("shad")) { AbstractFont_shadow = 0; } else if (var1.equals("/shad")) { @@ -611,12 +621,12 @@ public abstract class AbstractFont extends Rasterizer2D { } else if (var1.equals("br")) { this.reset(AbstractFont_previousColor, AbstractFont_previousShadow); } - } catch (Exception var3) { + } catch (Exception var5) { } } - @ObfuscatedName("ab") + @ObfuscatedName("am") @Export("calculateLineJustification") void calculateLineJustification(String var1, int var2) { int var3 = 0; @@ -639,7 +649,7 @@ public abstract class AbstractFont extends Rasterizer2D { } - @ObfuscatedName("ax") + @ObfuscatedName("ab") @Export("draw0") void draw0(String var1, int var2, int var3) { var3 -= this.ascent; @@ -648,7 +658,7 @@ public abstract class AbstractFont extends Rasterizer2D { for (int var6 = 0; var6 < var1.length(); ++var6) { if (var1.charAt(var6) != 0) { - char var7 = (char)(Entity.charToByteCp1252(var1.charAt(var6)) & 255); + char var7 = (char)(WorldMapData_1.charToByteCp1252(var1.charAt(var6)) & 255); if (var7 == '<') { var4 = var6; } else { @@ -662,7 +672,7 @@ public abstract class AbstractFont extends Rasterizer2D { if (!var8.equals("gt")) { if (var8.startsWith("img=")) { try { - var9 = TilePaint.parseInt(var8.substring(4)); + var9 = ClientPreferences.parseInt(var8.substring(4)); IndexedSprite var10 = AbstractFont_modIconSprites[var9]; var10.drawAt(var2, var3 + this.ascent - var10.height); var2 += var10.width; @@ -728,7 +738,7 @@ public abstract class AbstractFont extends Rasterizer2D { } - @ObfuscatedName("as") + @ObfuscatedName("ax") @Export("drawWithOffsets0") void drawWithOffsets0(String var1, int var2, int var3, int[] var4, int[] var5) { var3 -= this.ascent; @@ -738,7 +748,7 @@ public abstract class AbstractFont extends Rasterizer2D { for (int var9 = 0; var9 < var1.length(); ++var9) { if (var1.charAt(var9) != 0) { - char var10 = (char)(Entity.charToByteCp1252(var1.charAt(var9)) & 255); + char var10 = (char)(WorldMapData_1.charToByteCp1252(var1.charAt(var9)) & 255); if (var10 == '<') { var6 = var9; } else { @@ -767,7 +777,7 @@ public abstract class AbstractFont extends Rasterizer2D { } ++var8; - var14 = TilePaint.parseInt(var11.substring(4)); + var14 = ClientPreferences.parseInt(var11.substring(4)); IndexedSprite var15 = AbstractFont_modIconSprites[var14]; var15.drawAt(var12 + var2, var13 + (var3 + this.ascent - var15.height)); var2 += var15.width; @@ -847,7 +857,7 @@ public abstract class AbstractFont extends Rasterizer2D { } @ObfuscatedName("i") - static int method5290(byte[][] var0, byte[][] var1, int[] var2, int[] var3, int[] var4, int var5, int var6) { + static int method5506(byte[][] var0, byte[][] var1, int[] var2, int[] var3, int[] var4, int var5, int var6) { int var7 = var2[var5]; int var8 = var7 + var4[var5]; int var9 = var2[var6]; @@ -911,7 +921,7 @@ public abstract class AbstractFont extends Rasterizer2D { return var6.toString(); } - @ObfuscatedName("ao") + @ObfuscatedName("al") @Export("AbstractFont_drawGlyph") static void AbstractFont_drawGlyph(byte[] var0, int var1, int var2, int var3, int var4, int var5) { int var6 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; @@ -953,7 +963,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("al") + @ObfuscatedName("ap") @Export("AbstractFont_placeGlyph") static void AbstractFont_placeGlyph(int[] var0, byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { int var9 = -(var5 >> 2); @@ -1001,7 +1011,7 @@ public abstract class AbstractFont extends Rasterizer2D { } - @ObfuscatedName("ad") + @ObfuscatedName("aj") @Export("AbstractFont_drawGlyphAlpha") static void AbstractFont_drawGlyphAlpha(byte[] var0, int var1, int var2, int var3, int var4, int var5, int var6) { int var7 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; @@ -1043,7 +1053,7 @@ public abstract class AbstractFont extends Rasterizer2D { } } - @ObfuscatedName("an") + @ObfuscatedName("ae") @Export("AbstractFont_placeGlyphAlpha") static void AbstractFont_placeGlyphAlpha(int[] var0, byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9) { var2 = ((var2 & 65280) * var9 & 16711680) + (var9 * (var2 & 16711935) & -16711936) >> 8; diff --git a/runescape-client/src/main/java/AbstractRasterProvider.java b/runescape-client/src/main/java/AbstractRasterProvider.java index dc315f86fd..bf05333521 100644 --- a/runescape-client/src/main/java/AbstractRasterProvider.java +++ b/runescape-client/src/main/java/AbstractRasterProvider.java @@ -4,27 +4,21 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lm") +@ObfuscatedName("lu") @Implements("AbstractRasterProvider") public abstract class AbstractRasterProvider { - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Llp;" - ) - @Export("titlebuttonSprite") - static IndexedSprite titlebuttonSprite; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("pixels") public int[] pixels; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1221954905 + intValue = -1627177537 ) @Export("width") public int width; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 809652275 + intValue = -594636233 ) @Export("height") public int height; @@ -32,26 +26,26 @@ public abstract class AbstractRasterProvider { protected AbstractRasterProvider() { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "-1952064900" + signature = "(IIB)V", + garbageValue = "3" ) @Export("drawFull") public abstract void drawFull(int var1, int var2); - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(IIIII)V", - garbageValue = "-67564732" + garbageValue = "-2086134046" ) @Export("draw") public abstract void draw(int var1, int var2, int var3, int var4); - @ObfuscatedName("f") + @ObfuscatedName("s") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-997992638" + garbageValue = "-2129049965" ) @Export("apply") public final void apply() { diff --git a/runescape-client/src/main/java/AbstractSocket.java b/runescape-client/src/main/java/AbstractSocket.java index 6bb4bba393..7772084655 100644 --- a/runescape-client/src/main/java/AbstractSocket.java +++ b/runescape-client/src/main/java/AbstractSocket.java @@ -4,57 +4,684 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ky") +@ObfuscatedName("ku") @Implements("AbstractSocket") public abstract class AbstractSocket { protected AbstractSocket() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-119" + signature = "(I)V", + garbageValue = "1632517280" ) @Export("close") public abstract void close(); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1784126558" + signature = "(B)I", + garbageValue = "0" ) @Export("readUnsignedByte") public abstract int readUnsignedByte() throws IOException; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "3" + garbageValue = "-1" ) @Export("available") public abstract int available() throws IOException; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-336706705" + garbageValue = "1174929907" ) @Export("isAvailable") public abstract boolean isAvailable(int var1) throws IOException; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "([BIII)I", - garbageValue = "-2035668362" + garbageValue = "1681485484" ) @Export("read") public abstract int read(byte[] var1, int var2, int var3) throws IOException; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "-68" + signature = "([BIII)V", + garbageValue = "1989353375" ) @Export("write") public abstract void write(byte[] var1, int var2, int var3) throws IOException; + + @ObfuscatedName("hj") + @ObfuscatedSignature( + signature = "(Lbz;IIIIII)V", + garbageValue = "-453340900" + ) + @Export("drawActor2d") + static final void drawActor2d(Actor var0, int var1, int var2, int var3, int var4, int var5) { + if (var0 != null && var0.isVisible()) { + if (var0 instanceof NPC) { + NPCDefinition var6 = ((NPC)var0).definition; + if (var6.transforms != null) { + var6 = var6.transform(); + } + + if (var6 == null) { + return; + } + } + + int var75 = Players.Players_count; + int[] var7 = Players.Players_indices; + byte var8 = 0; + Player var10; + if (var1 < var75 && var0.playerCycle == Client.cycle) { + var10 = (Player)var0; + boolean var9; + if (Client.drawPlayerNames == 0) { + var9 = false; + } else { + boolean var77; + if (var10 != class215.localPlayer) { + var77 = (Client.drawPlayerNames & 4) != 0; + boolean var78 = var77; + boolean var13; + if (!var77) { + var13 = (Client.drawPlayerNames & 1) != 0; + var78 = var13 && var10.isFriend(); + } + + var13 = var78; + if (!var78) { + boolean var79 = (Client.drawPlayerNames & 2) != 0; + var13 = var79 && var10.isClanMember(); + } + + var9 = var13; + } else { + var77 = (Client.drawPlayerNames & 8) != 0; + var9 = var77; + } + } + + if (var9) { + Player var11 = (Player)var0; + if (var1 < var75) { + Entity.getActorScreenLocation(var0, var0.defaultHeight + 15); + AbstractFont var12 = (AbstractFont)Client.fontsMap.get(FontName.FontName_plain12); + byte var92 = 9; + var12.drawCentered(var11.username.getName(), var2 + Client.viewportTempX, var3 + Client.viewportTempY - var92, 16777215, 0); + var8 = 18; + } + } + } + + int var87 = -2; + int var15; + int var22; + int var23; + if (!var0.healthBars.method5004()) { + Entity.getActorScreenLocation(var0, var0.defaultHeight + 15); + + for (HealthBar var88 = (HealthBar)var0.healthBars.last(); var88 != null; var88 = (HealthBar)var0.healthBars.previous()) { + HealthBarUpdate var89 = var88.get(Client.cycle); + if (var89 == null) { + if (var88.isEmpty()) { + var88.remove(); + } + } else { + HealthBarDefinition var91 = var88.definition; + Sprite var76 = var91.getBackSprite(); + Sprite var14 = var91.getFrontSprite(); + int var16 = 0; + if (var76 != null && var14 != null) { + if (var91.widthPadding * 2 < var14.subWidth) { + var16 = var91.widthPadding; + } + + var15 = var14.subWidth - var16 * 2; + } else { + var15 = var91.width; + } + + int var17 = 255; + boolean var18 = true; + int var19 = Client.cycle - var89.cycle; + int var20 = var15 * var89.health2 / var91.width; + int var21; + int var93; + if (var89.cycleOffset > var19) { + var21 = var91.int4 == 0 ? 0 : var91.int4 * (var19 / var91.int4); + var22 = var15 * var89.health / var91.width; + var93 = var21 * (var20 - var22) / var89.cycleOffset + var22; + } else { + var93 = var20; + var21 = var89.cycleOffset + var91.int5 - var19; + if (var91.int3 >= 0) { + var17 = (var21 << 8) / (var91.int5 - var91.int3); + } + } + + if (var89.health2 > 0 && var93 < 1) { + var93 = 1; + } + + if (var76 != null && var14 != null) { + if (var93 == var15) { + var93 += var16 * 2; + } else { + var93 += var16; + } + + var21 = var76.subHeight; + var87 += var21; + var22 = var2 + Client.viewportTempX - (var15 >> 1); + var23 = var3 + Client.viewportTempY - var87; + var22 -= var16; + if (var17 >= 0 && var17 < 255) { + var76.drawTransAt(var22, var23, var17); + Rasterizer2D.Rasterizer2D_expandClip(var22, var23, var93 + var22, var23 + var21); + var14.drawTransAt(var22, var23, var17); + } else { + var76.drawTransBgAt(var22, var23); + Rasterizer2D.Rasterizer2D_expandClip(var22, var23, var22 + var93, var21 + var23); + var14.drawTransBgAt(var22, var23); + } + + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var2 + var4, var3 + var5); + var87 += 2; + } else { + var87 += 5; + if (Client.viewportTempX > -1) { + var21 = var2 + Client.viewportTempX - (var15 >> 1); + var22 = var3 + Client.viewportTempY - var87; + Rasterizer2D.Rasterizer2D_fillRectangle(var21, var22, var93, 5, 65280); + Rasterizer2D.Rasterizer2D_fillRectangle(var93 + var21, var22, var15 - var93, 5, 16711680); + } + + var87 += 2; + } + } + } + } + + if (var87 == -2) { + var87 += 7; + } + + var87 += var8; + if (var1 < var75) { + var10 = (Player)var0; + if (var10.isHidden) { + return; + } + + if (var10.headIconPk != -1 || var10.headIconPrayer != -1) { + Entity.getActorScreenLocation(var0, var0.defaultHeight + 15); + if (Client.viewportTempX > -1) { + if (var10.headIconPk != -1) { + var87 += 25; + FriendLoginUpdate.headIconPkSprites[var10.headIconPk].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); + } + + if (var10.headIconPrayer != -1) { + var87 += 25; + Login.headIconPrayerSprites[var10.headIconPrayer].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); + } + } + } + + if (var1 >= 0 && Client.hintArrowType == 10 && var7[var1] == Client.hintArrowPlayerIndex) { + Entity.getActorScreenLocation(var0, var0.defaultHeight + 15); + if (Client.viewportTempX > -1) { + var87 += class14.headIconHintSprites[1].subHeight; + class14.headIconHintSprites[1].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var87); + } + } + } else { + NPCDefinition var90 = ((NPC)var0).definition; + if (var90.transforms != null) { + var90 = var90.transform(); + } + + if (var90.headIconPrayer >= 0 && var90.headIconPrayer < Login.headIconPrayerSprites.length) { + Entity.getActorScreenLocation(var0, var0.defaultHeight + 15); + if (Client.viewportTempX > -1) { + Login.headIconPrayerSprites[var90.headIconPrayer].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 30); + } + } + + if (Client.hintArrowType == 1 && Client.npcIndices[var1 - var75] == Client.hintArrowNpcIndex && Client.cycle % 20 < 10) { + Entity.getActorScreenLocation(var0, var0.defaultHeight + 15); + if (Client.viewportTempX > -1) { + class14.headIconHintSprites[0].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 28); + } + } + } + + if (var0.overheadText != null && (var1 >= var75 || !var0.field939 && (Client.publicChatMode == 4 || !var0.isAutoChatting && (Client.publicChatMode == 0 || Client.publicChatMode == 3 || Client.publicChatMode == 1 && ((Player)var0).isFriend())))) { + Entity.getActorScreenLocation(var0, var0.defaultHeight); + if (Client.viewportTempX > -1 && Client.overheadTextCount < Client.overheadTextLimit) { + Client.overheadTextXOffsets[Client.overheadTextCount] = class43.fontBold12.stringWidth(var0.overheadText) / 2; + Client.overheadTextAscents[Client.overheadTextCount] = class43.fontBold12.ascent; + Client.overheadTextXs[Client.overheadTextCount] = Client.viewportTempX; + Client.overheadTextYs[Client.overheadTextCount] = Client.viewportTempY; + Client.overheadTextColors[Client.overheadTextCount] = var0.overheadTextColor; + Client.overheadTextEffects[Client.overheadTextCount] = var0.overheadTextEffect; + Client.overheadTextCyclesRemaining[Client.overheadTextCount] = var0.overheadTextCyclesRemaining; + Client.overheadText[Client.overheadTextCount] = var0.overheadText; + ++Client.overheadTextCount; + } + } + + for (int var80 = 0; var80 < 4; ++var80) { + int var96 = var0.hitSplatCycles[var80]; + int var97 = var0.hitSplatTypes[var80]; + HitSplatDefinition var95 = null; + int var98 = 0; + if (var97 >= 0) { + if (var96 <= Client.cycle) { + continue; + } + + var95 = NetFileRequest.method4298(var0.hitSplatTypes[var80]); + var98 = var95.field3314; + if (var95 != null && var95.transforms != null) { + var95 = var95.transform(); + if (var95 == null) { + var0.hitSplatCycles[var80] = -1; + continue; + } + } + } else if (var96 < 0) { + continue; + } + + var15 = var0.hitSplatTypes2[var80]; + HitSplatDefinition var81 = null; + if (var15 >= 0) { + var81 = NetFileRequest.method4298(var15); + if (var81 != null && var81.transforms != null) { + var81 = var81.transform(); + } + } + + if (var96 - var98 <= Client.cycle) { + if (var95 == null) { + var0.hitSplatCycles[var80] = -1; + } else { + Entity.getActorScreenLocation(var0, var0.defaultHeight / 2); + if (Client.viewportTempX > -1) { + if (var80 == 1) { + Client.viewportTempY -= 20; + } + + if (var80 == 2) { + Client.viewportTempX -= 15; + Client.viewportTempY -= 10; + } + + if (var80 == 3) { + Client.viewportTempX += 15; + Client.viewportTempY -= 10; + } + + Sprite var82 = null; + Sprite var83 = null; + Sprite var84 = null; + Sprite var85 = null; + var22 = 0; + var23 = 0; + int var24 = 0; + int var25 = 0; + int var26 = 0; + int var27 = 0; + int var28 = 0; + int var29 = 0; + Sprite var30 = null; + Sprite var31 = null; + Sprite var32 = null; + Sprite var33 = null; + int var34 = 0; + int var35 = 0; + int var36 = 0; + int var37 = 0; + int var38 = 0; + int var39 = 0; + int var40 = 0; + int var41 = 0; + int var42 = 0; + var82 = var95.method4719(); + int var43; + if (var82 != null) { + var22 = var82.subWidth; + var43 = var82.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var26 = var82.xOffset; + } + + var83 = var95.method4709(); + if (var83 != null) { + var23 = var83.subWidth; + var43 = var83.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var27 = var83.xOffset; + } + + var84 = var95.method4710(); + if (var84 != null) { + var24 = var84.subWidth; + var43 = var84.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var28 = var84.xOffset; + } + + var85 = var95.method4731(); + if (var85 != null) { + var25 = var85.subWidth; + var43 = var85.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var29 = var85.xOffset; + } + + if (var81 != null) { + var30 = var81.method4719(); + if (var30 != null) { + var34 = var30.subWidth; + var43 = var30.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var38 = var30.xOffset; + } + + var31 = var81.method4709(); + if (var31 != null) { + var35 = var31.subWidth; + var43 = var31.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var39 = var31.xOffset; + } + + var32 = var81.method4710(); + if (var32 != null) { + var36 = var32.subWidth; + var43 = var32.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var40 = var32.xOffset; + } + + var33 = var81.method4731(); + if (var33 != null) { + var37 = var33.subWidth; + var43 = var33.subHeight; + if (var43 > var42) { + var42 = var43; + } + + var41 = var33.xOffset; + } + } + + Font var86 = var95.getFont(); + if (var86 == null) { + var86 = class51.fontPlain11; + } + + Font var44; + if (var81 != null) { + var44 = var81.getFont(); + if (var44 == null) { + var44 = class51.fontPlain11; + } + } else { + var44 = class51.fontPlain11; + } + + String var45 = null; + String var46 = null; + boolean var47 = false; + int var48 = 0; + var45 = var95.getString(var0.hitSplatValues[var80]); + int var94 = var86.stringWidth(var45); + if (var81 != null) { + var46 = var81.getString(var0.hitSplatValues2[var80]); + var48 = var44.stringWidth(var46); + } + + int var49 = 0; + int var50 = 0; + if (var23 > 0) { + if (var84 == null && var85 == null) { + var49 = 1; + } else { + var49 = var94 / var23 + 1; + } + } + + if (var81 != null && var35 > 0) { + if (var32 == null && var33 == null) { + var50 = 1; + } else { + var50 = var48 / var35 + 1; + } + } + + int var51 = 0; + int var52 = var51; + if (var22 > 0) { + var51 += var22; + } + + var51 += 2; + int var53 = var51; + if (var24 > 0) { + var51 += var24; + } + + int var54 = var51; + int var55 = var51; + int var56; + if (var23 > 0) { + var56 = var49 * var23; + var51 += var56; + var55 += (var56 - var94) / 2; + } else { + var51 += var94; + } + + var56 = var51; + if (var25 > 0) { + var51 += var25; + } + + int var57 = 0; + int var58 = 0; + int var59 = 0; + int var60 = 0; + int var61 = 0; + int var62; + if (var81 != null) { + var51 += 2; + var57 = var51; + if (var34 > 0) { + var51 += var34; + } + + var51 += 2; + var58 = var51; + if (var36 > 0) { + var51 += var36; + } + + var59 = var51; + var61 = var51; + if (var35 > 0) { + var62 = var35 * var50; + var51 += var62; + var61 += (var62 - var48) / 2; + } else { + var51 += var48; + } + + var60 = var51; + if (var37 > 0) { + var51 += var37; + } + } + + var62 = var0.hitSplatCycles[var80] - Client.cycle; + int var63 = var95.field3329 - var62 * var95.field3329 / var95.field3314; + int var64 = var62 * var95.field3315 / var95.field3314 + -var95.field3315; + int var65 = var63 + (var2 + Client.viewportTempX - (var51 >> 1)); + int var66 = var3 + Client.viewportTempY - 12 + var64; + int var67 = var66; + int var68 = var42 + var66; + int var69 = var66 + var95.field3330 + 15; + int var70 = var69 - var86.maxAscent; + int var71 = var69 + var86.maxDescent; + if (var70 < var66) { + var67 = var70; + } + + if (var71 > var68) { + var68 = var71; + } + + int var72 = 0; + int var73; + int var74; + if (var81 != null) { + var72 = var66 + var81.field3330 + 15; + var73 = var72 - var44.maxAscent; + var74 = var72 + var44.maxDescent; + if (var73 < var67) { + ; + } + + if (var74 > var68) { + ; + } + } + + var73 = 255; + if (var95.field3327 >= 0) { + var73 = (var62 << 8) / (var95.field3314 - var95.field3327); + } + + if (var73 >= 0 && var73 < 255) { + if (var82 != null) { + var82.drawTransAt(var52 + var65 - var26, var66, var73); + } + + if (var84 != null) { + var84.drawTransAt(var65 + var53 - var28, var66, var73); + } + + if (var83 != null) { + for (var74 = 0; var74 < var49; ++var74) { + var83.drawTransAt(var74 * var23 + (var65 + var54 - var27), var66, var73); + } + } + + if (var85 != null) { + var85.drawTransAt(var65 + var56 - var29, var66, var73); + } + + var86.drawAlpha(var45, var55 + var65, var69, var95.textColor, 0, var73); + if (var81 != null) { + if (var30 != null) { + var30.drawTransAt(var65 + var57 - var38, var66, var73); + } + + if (var32 != null) { + var32.drawTransAt(var65 + var58 - var40, var66, var73); + } + + if (var31 != null) { + for (var74 = 0; var74 < var50; ++var74) { + var31.drawTransAt(var35 * var74 + (var65 + var59 - var39), var66, var73); + } + } + + if (var33 != null) { + var33.drawTransAt(var60 + var65 - var41, var66, var73); + } + + var44.drawAlpha(var46, var65 + var61, var72, var81.textColor, 0, var73); + } + } else { + if (var82 != null) { + var82.drawTransBgAt(var65 + var52 - var26, var66); + } + + if (var84 != null) { + var84.drawTransBgAt(var65 + var53 - var28, var66); + } + + if (var83 != null) { + for (var74 = 0; var74 < var49; ++var74) { + var83.drawTransBgAt(var23 * var74 + (var65 + var54 - var27), var66); + } + } + + if (var85 != null) { + var85.drawTransBgAt(var65 + var56 - var29, var66); + } + + var86.draw(var45, var55 + var65, var69, var95.textColor | -16777216, 0); + if (var81 != null) { + if (var30 != null) { + var30.drawTransBgAt(var57 + var65 - var38, var66); + } + + if (var32 != null) { + var32.drawTransBgAt(var58 + var65 - var40, var66); + } + + if (var31 != null) { + for (var74 = 0; var74 < var50; ++var74) { + var31.drawTransBgAt(var74 * var35 + (var65 + var59 - var39), var66); + } + } + + if (var33 != null) { + var33.drawTransBgAt(var60 + var65 - var41, var66); + } + + var44.draw(var46, var65 + var61, var72, var81.textColor | -16777216, 0); + } + } + } + } + } + } + + } + } } diff --git a/runescape-client/src/main/java/AbstractSound.java b/runescape-client/src/main/java/AbstractSound.java index e453ccb551..ad3fe1df6d 100644 --- a/runescape-client/src/main/java/AbstractSound.java +++ b/runescape-client/src/main/java/AbstractSound.java @@ -2,10 +2,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("dx") +@ObfuscatedName("dg") @Implements("AbstractSound") public abstract class AbstractSound extends Node { - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("position") int position; diff --git a/runescape-client/src/main/java/AbstractUserComparator.java b/runescape-client/src/main/java/AbstractUserComparator.java index 124bd1504b..3b1f96a183 100644 --- a/runescape-client/src/main/java/AbstractUserComparator.java +++ b/runescape-client/src/main/java/AbstractUserComparator.java @@ -1,27 +1,29 @@ -import java.lang.management.GarbageCollectorMXBean; import java.util.Comparator; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jr") @Implements("AbstractUserComparator") public abstract class AbstractUserComparator implements Comparator { - @ObfuscatedName("ag") - @Export("garbageCollector") - static GarbageCollectorMXBean garbageCollector; - @ObfuscatedName("n") + @ObfuscatedName("rb") + @ObfuscatedGetter( + intValue = -1217958016 + ) + static int field3583; + @ObfuscatedName("t") @Export("nextComparator") Comparator nextComparator; protected AbstractUserComparator() { } - @ObfuscatedName("m") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(Ljava/util/Comparator;B)V", - garbageValue = "0" + garbageValue = "115" ) @Export("addComparator") final void addComparator(Comparator var1) { @@ -33,10 +35,10 @@ public abstract class AbstractUserComparator implements Comparator { } - @ObfuscatedName("y") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(Ljh;Ljh;B)I", - garbageValue = "-78" + signature = "(Ljg;Ljg;B)I", + garbageValue = "124" ) @Export("compareUser") protected final int compareUser(User var1, User var2) { diff --git a/runescape-client/src/main/java/AbstractWorldMapData.java b/runescape-client/src/main/java/AbstractWorldMapData.java index efdefeec98..a718e063bc 100644 --- a/runescape-client/src/main/java/AbstractWorldMapData.java +++ b/runescape-client/src/main/java/AbstractWorldMapData.java @@ -4,116 +4,115 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; @ObfuscatedName("f") @Implements("AbstractWorldMapData") public abstract class AbstractWorldMapData { - @ObfuscatedName("iz") - @ObfuscatedGetter( - intValue = 742897815 + @ObfuscatedName("ae") + @ObfuscatedSignature( + signature = "Llu;" ) - @Export("selectedItemId") - static int selectedItemId; - @ObfuscatedName("z") + @Export("rasterProvider") + public static AbstractRasterProvider rasterProvider; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 461674944 + intValue = 1032040448 ) @Export("regionXLow") int regionXLow; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 278884352 + intValue = 2012131328 ) @Export("regionYLow") int regionYLow; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -317022193 + intValue = 1049638377 ) @Export("regionX") int regionX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 796055175 + intValue = 548799015 ) @Export("regionY") int regionY; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 804294653 + intValue = 974666319 ) @Export("minPlane") int minPlane; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 593055761 + intValue = 1744389767 ) @Export("planes") int planes; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1864196889 + intValue = -1592799997 ) @Export("groupId") int groupId; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -644572197 + intValue = -1573333695 ) @Export("fileId") int fileId; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("floorUnderlayIds") short[][][] floorUnderlayIds; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("floorOverlayIds") short[][][] floorOverlayIds; - @ObfuscatedName("c") - byte[][][] field164; - @ObfuscatedName("b") - byte[][][] field152; - @ObfuscatedName("o") + @ObfuscatedName("m") + byte[][][] field161; + @ObfuscatedName("p") + byte[][][] field157; + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "[[[[Lk;" + signature = "[[[[Ly;" ) @Export("decorations") WorldMapDecoration[][][][] decorations; - @ObfuscatedName("a") - boolean field165; - @ObfuscatedName("e") - boolean field166; + @ObfuscatedName("k") + boolean field159; + @ObfuscatedName("x") + boolean field151; AbstractWorldMapData() { this.groupId = -1; this.fileId = -1; new LinkedList(); - this.field165 = false; - this.field166 = false; + this.field159 = false; + this.field151 = false; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1549979331" + signature = "(Lkc;I)V", + garbageValue = "1045041620" ) @Export("readGeography") abstract void readGeography(Buffer var1); - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "1858482709" + garbageValue = "-992891082" ) @Export("isFullyLoaded") boolean isFullyLoaded() { - return this.field165 && this.field166; + return this.field159 && this.field151; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(Lhp;I)V", - garbageValue = "-1207518623" + signature = "(Lhq;I)V", + garbageValue = "126023316" ) @Export("loadGeography") void loadGeography(AbstractArchive var1) { @@ -121,53 +120,53 @@ public abstract class AbstractWorldMapData { byte[] var2 = var1.takeFile(this.groupId, this.fileId); if (var2 != null) { this.readGeography(new Buffer(var2)); - this.field165 = true; - this.field166 = true; + this.field159 = true; + this.field151 = true; } } } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1757437769" + signature = "(B)V", + garbageValue = "124" ) @Export("reset") void reset() { this.floorUnderlayIds = null; this.floorOverlayIds = null; - this.field164 = null; - this.field152 = null; + this.field161 = null; + this.field157 = null; this.decorations = null; - this.field165 = false; - this.field166 = false; + this.field159 = false; + this.field151 = false; } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(IILkl;B)V", - garbageValue = "10" + signature = "(IILkc;I)V", + garbageValue = "-2099963410" ) @Export("readTile") void readTile(int var1, int var2, Buffer var3) { int var4 = var3.readUnsignedByte(); if (var4 != 0) { if ((var4 & 1) != 0) { - this.method262(var1, var2, var3, var4); + this.method320(var1, var2, var3, var4); } else { - this.method268(var1, var2, var3, var4); + this.method302(var1, var2, var3, var4); } } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(IILkl;II)V", - garbageValue = "2059676399" + signature = "(IILkc;IB)V", + garbageValue = "-1" ) - void method262(int var1, int var2, Buffer var3, int var4) { + void method320(int var1, int var2, Buffer var3, int var4) { boolean var5 = (var4 & 2) != 0; if (var5) { this.floorOverlayIds[0][var1][var2] = (short)var3.readUnsignedByte(); @@ -176,12 +175,12 @@ public abstract class AbstractWorldMapData { this.floorUnderlayIds[0][var1][var2] = (short)var3.readUnsignedByte(); } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(IILkl;IB)V", - garbageValue = "-56" + signature = "(IILkc;IB)V", + garbageValue = "0" ) - void method268(int var1, int var2, Buffer var3, int var4) { + void method302(int var1, int var2, Buffer var3, int var4) { int var5 = ((var4 & 24) >> 3) + 1; boolean var6 = (var4 & 2) != 0; boolean var7 = (var4 & 4) != 0; @@ -197,8 +196,8 @@ public abstract class AbstractWorldMapData { if (var10 != 0) { this.floorOverlayIds[var9][var1][var2] = (short)var10; var11 = var3.readUnsignedByte(); - this.field164[var9][var1][var2] = (byte)(var11 >> 2); - this.field152[var9][var1][var2] = (byte)(var11 & 3); + this.field161[var9][var1][var2] = (byte)(var11 >> 2); + this.field157[var9][var1][var2] = (byte)(var11 & 3); } } } @@ -210,7 +209,7 @@ public abstract class AbstractWorldMapData { WorldMapDecoration[] var14 = this.decorations[var8][var1][var2] = new WorldMapDecoration[var9]; for (var11 = 0; var11 < var9; ++var11) { - int var12 = var3.method5453(); + int var12 = var3.method5638(); int var13 = var3.readUnsignedByte(); var14[var11] = new WorldMapDecoration(var12, var13 >> 2, var13 & 3); } @@ -220,232 +219,160 @@ public abstract class AbstractWorldMapData { } - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-929324026" + signature = "(B)I", + garbageValue = "80" ) @Export("getRegionX") int getRegionX() { return this.regionX; } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-2009466013" + signature = "(B)I", + garbageValue = "84" ) @Export("getRegionY") int getRegionY() { return this.regionY; } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IB)Liq;", - garbageValue = "1" + signature = "(Ljava/lang/CharSequence;I)Z", + garbageValue = "403966383" ) - public static VarpDefinition method288(int var0) { - VarpDefinition var1 = (VarpDefinition)VarpDefinition.VarpDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = VarpDefinition.VarpDefinition_archive.takeFile(16, var0); - var1 = new VarpDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); + @Export("isNumber") + public static boolean isNumber(CharSequence var0) { + boolean var2 = false; + boolean var3 = false; + int var4 = 0; + int var5 = var0.length(); + int var6 = 0; + + boolean var1; + while (true) { + if (var6 >= var5) { + var1 = var3; + break; } - VarpDefinition.VarpDefinition_cached.put(var1, (long)var0); - return var1; - } - } + label81: { + char var7 = var0.charAt(var6); + if (var6 == 0) { + if (var7 == '-') { + var2 = true; + break label81; + } - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(IIIZIZI)V", - garbageValue = "-1516072397" - ) - @Export("doWorldSorting") - static void doWorldSorting(int var0, int var1, int var2, boolean var3, int var4, boolean var5) { - if (var0 < var1) { - int var6 = (var0 + var1) / 2; - int var7 = var0; - World var8 = World.World_worlds[var6]; - World.World_worlds[var6] = World.World_worlds[var1]; - World.World_worlds[var1] = var8; - - for (int var9 = var0; var9 < var1; ++var9) { - if (ArchiveLoader.method1174(World.World_worlds[var9], var8, var2, var3, var4, var5) <= 0) { - World var10 = World.World_worlds[var9]; - World.World_worlds[var9] = World.World_worlds[var7]; - World.World_worlds[var7++] = var10; + if (var7 == '+') { + break label81; + } } - } - World.World_worlds[var1] = World.World_worlds[var7]; - World.World_worlds[var7] = var8; - doWorldSorting(var0, var7 - 1, var2, var3, var4, var5); - doWorldSorting(var7 + 1, var1, var2, var3, var4, var5); - } - - } - - @ObfuscatedName("ar") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1561238800" - ) - static int method289(int var0, Script var1, boolean var2) { - int var3; - if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERTYPE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].type(); - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERITEM) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].id; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERPRICE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].unitPrice; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERCOUNT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].totalQuantity; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERCOMPLETEDCOUNT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentQuantity; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERCOMPLETEDGOLD) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentPrice; - return 1; - } else { - int var12; - if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFEREMPTY) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 0 ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFERSTABLE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 2 ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFERFINISHED) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 5 ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFERADDING) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var12 = Client.grandExchangeOffers[var3].status(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 1 ? 1 : 0; - return 1; - } else { - boolean var13; - if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_NAME) { - var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (TileItem.grandExchangeEvents != null) { - TileItem.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_nameComparator, var13); - } - - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_PRICE) { - var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (TileItem.grandExchangeEvents != null) { - TileItem.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_priceComparator, var13); - } - - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTFILTERBY_WORLD) { - Interpreter.Interpreter_intStackSize -= 2; - var13 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] == 1; - boolean var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; - if (TileItem.grandExchangeEvents != null) { - Client.GrandExchangeEvents_worldComparator.filterWorlds = var4; - TileItem.grandExchangeEvents.sort(Client.GrandExchangeEvents_worldComparator, var13); - } - - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_AGE) { - var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (TileItem.grandExchangeEvents != null) { - TileItem.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_ageComparator, var13); - } - - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_COUNT) { - var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (TileItem.grandExchangeEvents != null) { - TileItem.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_quantityComparator, var13); - } - - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETTOTALOFFERS) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = TileItem.grandExchangeEvents == null ? 0 : TileItem.grandExchangeEvents.events.size(); - return 1; + int var9; + if (var7 >= '0' && var7 <= '9') { + var9 = var7 - '0'; + } else if (var7 >= 'A' && var7 <= 'Z') { + var9 = var7 - '7'; } else { - GrandExchangeEvent var11; - if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERWORLD) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.world; - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERNAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var11.getOfferName(); - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERPREVIOUSNAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var11.getPreviousOfferName(); - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERAGE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - long var5 = class30.currentTimeMillis() - class81.field1135 - var11.age; - int var7 = (int)(var5 / 3600000L); - int var8 = (int)((var5 - (long)(var7 * 3600000)) / 60000L); - int var9 = (int)((var5 - (long)(var7 * 3600000) - (long)(var8 * 60000)) / 1000L); - String var10 = var7 + ":" + var8 / 10 + var8 % 10 + ":" + var9 / 10 + var9 % 10; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var10; - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERCOUNT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.totalQuantity; - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERPRICE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.unitPrice; - return 1; - } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERITEM) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var11 = (GrandExchangeEvent)TileItem.grandExchangeEvents.events.get(var3); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.id; - return 1; - } else { - return 2; + if (var7 < 'a' || var7 > 'z') { + var1 = false; + break; } + + var9 = var7 - 'W'; + } + + if (var9 >= 10) { + var1 = false; + break; + } + + if (var2) { + var9 = -var9; + } + + int var8 = var4 * 10 + var9; + if (var4 != var8 / 10) { + var1 = false; + break; + } + + var4 = var8; + var3 = true; + } + + ++var6; + } + + return var1; + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(II)Z", + garbageValue = "693586906" + ) + public static boolean method327(int var0) { + return (var0 >> 21 & 1) != 0; + } + + @ObfuscatedName("hp") + @ObfuscatedSignature( + signature = "(ZLkf;I)V", + garbageValue = "1158282077" + ) + @Export("updateNpcs") + static final void updateNpcs(boolean var0, PacketBuffer var1) { + Client.field752 = 0; + Client.field676 = 0; + class30.method606(); + WorldMapManager.method710(var0, var1); + class160.method3586(var1); + + int var2; + for (var2 = 0; var2 < Client.field752; ++var2) { + int var3 = Client.field870[var2]; + if (Client.npcs[var3].npcCycle != Client.cycle) { + Client.npcs[var3].definition = null; + Client.npcs[var3] = null; + } + } + + if (var1.offset != Client.packetWriter.serverPacketLength) { + throw new RuntimeException(var1.offset + "," + Client.packetWriter.serverPacketLength); + } else { + for (var2 = 0; var2 < Client.npcCount; ++var2) { + if (Client.npcs[Client.npcIndices[var2]] == null) { + throw new RuntimeException(var2 + "," + Client.npcCount); } } + } } - @ObfuscatedName("ii") + @ObfuscatedName("kw") @ObfuscatedSignature( - signature = "(IIIIIIIB)V", - garbageValue = "35" + signature = "(III)V", + garbageValue = "2048365157" ) - @Export("updateRootInterface") - static final void updateRootInterface(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { - if (WorldMapData_0.loadInterface(var0)) { - MusicPatchNode.updateInterface(UserComparator5.Widget_interfaceComponents[var0], -1, var1, var2, var3, var4, var5, var6); + static void method325(int var0, int var1) { + MenuAction var2 = StudioGame.tempMenuAction; + GrandExchangeOfferOwnWorldComparator.menuAction(var2.argument1, var2.argument2, var2.opcode, var2.argument0, var2.action, var2.action, var0, var1); + StudioGame.tempMenuAction = null; + } + + @ObfuscatedName("kx") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "871169152" + ) + static final void method326(int var0) { + if (TextureProvider.loadInterface(var0)) { + HealthBarDefinition.drawModelComponents(Widget.Widget_interfaceComponents[var0], -1); } } } diff --git a/runescape-client/src/main/java/AbstractWorldMapIcon.java b/runescape-client/src/main/java/AbstractWorldMapIcon.java index 18132c4cb5..58fa18ca2d 100644 --- a/runescape-client/src/main/java/AbstractWorldMapIcon.java +++ b/runescape-client/src/main/java/AbstractWorldMapIcon.java @@ -4,84 +4,90 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("as") +@ObfuscatedName("am") @Implements("AbstractWorldMapIcon") public abstract class AbstractWorldMapIcon { - @ObfuscatedName("h") + @ObfuscatedName("qa") @ObfuscatedSignature( - signature = "Lkl;" + signature = "Ldo;" ) - @Export("NetCache_reference") - static Buffer NetCache_reference; - @ObfuscatedName("q") + @Export("decimator") + static Decimator decimator; + @ObfuscatedName("dz") @ObfuscatedSignature( - signature = "Lhb;" + signature = "Lij;" + ) + @Export("archive2") + static Archive archive2; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Lhf;" ) @Export("coord2") public final Coord coord2; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Lhb;" + signature = "Lhf;" ) @Export("coord1") public final Coord coord1; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -744946711 + intValue = 2101295301 ) @Export("screenX") int screenX; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 1215104535 + intValue = 1809390745 ) @Export("screenY") int screenY; @ObfuscatedSignature( - signature = "(Lhb;Lhb;)V" + signature = "(Lhf;Lhf;)V" ) AbstractWorldMapIcon(Coord var1, Coord var2) { this.coord1 = var1; this.coord2 = var2; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "16" + signature = "(I)I", + garbageValue = "-1878632225" ) @Export("getElement") public abstract int getElement(); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Law;", - garbageValue = "13348956" + signature = "(I)Lar;", + garbageValue = "-77909992" ) @Export("getLabel") abstract WorldMapLabel getLabel(); - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-175699296" + garbageValue = "60677286" ) @Export("getSubWidth") abstract int getSubWidth(); - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "806304417" + signature = "(B)I", + garbageValue = "-92" ) @Export("getSubHeight") abstract int getSubHeight(); - @ObfuscatedName("k") + @ObfuscatedName("e") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "1521252994" + garbageValue = "1408503186" ) @Export("fitsScreen") boolean fitsScreen(int var1, int var2) { @@ -92,44 +98,43 @@ public abstract class AbstractWorldMapIcon { } } - @ObfuscatedName("ac") + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "36" + signature = "(I)Z", + garbageValue = "1618081006" ) @Export("hasValidElement") boolean hasValidElement() { return this.getElement() >= 0; } - @ObfuscatedName("aa") + @ObfuscatedName("b") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-2112119378" + garbageValue = "471623513" ) @Export("elementFitsScreen") boolean elementFitsScreen(int var1, int var2) { if (!this.hasValidElement()) { return false; } else { - WorldMapElement var3 = Decimator.WorldMapElement_get(this.getElement()); + WorldMapElement var3 = class65.WorldMapElement_get(this.getElement()); int var4 = this.getSubWidth(); int var5 = this.getSubHeight(); switch(var3.horizontalAlignment.value) { case 0: - if (var1 >= this.screenX && var1 < var4 + this.screenX) { - break; + if (var1 <= this.screenX - var4 || var1 > this.screenX) { + return false; } - - return false; + break; case 1: - if (var1 > this.screenX - var4 && var1 <= this.screenX) { + if (var1 >= this.screenX - var4 / 2 && var1 <= var4 / 2 + this.screenX) { break; } return false; case 2: - if (var1 < this.screenX - var4 / 2 || var1 > var4 / 2 + this.screenX) { + if (var1 < this.screenX || var1 >= var4 + this.screenX) { return false; } } @@ -141,12 +146,12 @@ public abstract class AbstractWorldMapIcon { } break; case 1: - if (var2 < this.screenY || var2 >= var5 + this.screenY) { + if (var2 < this.screenY - var5 / 2 || var2 > var5 / 2 + this.screenY) { return false; } break; case 2: - if (var2 < this.screenY - var5 / 2 || var2 > var5 / 2 + this.screenY) { + if (var2 < this.screenY || var2 >= var5 + this.screenY) { return false; } } @@ -155,10 +160,10 @@ public abstract class AbstractWorldMapIcon { } } - @ObfuscatedName("ap") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(IIB)Z", - garbageValue = "122" + signature = "(III)Z", + garbageValue = "1082527847" ) @Export("labelFitsScreen") boolean labelFitsScreen(int var1, int var2) { @@ -166,79 +171,52 @@ public abstract class AbstractWorldMapIcon { if (var3 == null) { return false; } else if (var1 >= this.screenX - var3.width / 2 && var1 <= var3.width / 2 + this.screenX) { - return var2 >= this.screenY && var2 <= this.screenY + var3.height; + return var2 >= this.screenY && var2 <= var3.height + this.screenY; } else { return false; } } - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "([BILjava/lang/CharSequence;I)I", - garbageValue = "1746697865" - ) - public static int method640(byte[] var0, int var1, CharSequence var2) { - int var3 = var2.length(); - int var4 = var1; - - for (int var5 = 0; var5 < var3; ++var5) { - char var6 = var2.charAt(var5); - if (var6 <= 127) { - var0[var4++] = (byte)var6; - } else if (var6 <= 2047) { - var0[var4++] = (byte)(192 | var6 >> 6); - var0[var4++] = (byte)(128 | var6 & '?'); - } else { - var0[var4++] = (byte)(224 | var6 >> '\f'); - var0[var4++] = (byte)(128 | var6 >> 6 & 63); - var0[var4++] = (byte)(128 | var6 & '?'); - } - } - - return var4 - var1; - } - - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(I)[Llf;", - garbageValue = "-1750401163" - ) - static Sprite[] method642() { - Sprite[] var0 = new Sprite[class325.SpriteBuffer_spriteCount]; - - for (int var1 = 0; var1 < class325.SpriteBuffer_spriteCount; ++var1) { - Sprite var2 = var0[var1] = new Sprite(); - var2.width = class325.SpriteBuffer_spriteWidth; - var2.height = Frames.SpriteBuffer_spriteHeight; - var2.xOffset = class325.SpriteBuffer_xOffsets[var1]; - var2.yOffset = MusicPatchPcmStream.SpriteBuffer_yOffsets[var1]; - var2.subWidth = class325.SpriteBuffer_spriteWidths[var1]; - var2.subHeight = RunException.SpriteBuffer_spriteHeights[var1]; - int var3 = var2.subHeight * var2.subWidth; - byte[] var4 = PacketBufferNode.SpriteBuffer_pixels[var1]; - var2.pixels = new int[var3]; - - for (int var5 = 0; var5 < var3; ++var5) { - var2.pixels[var5] = class325.SpriteBuffer_spritePalette[var4[var5] & 255]; - } - } - - class325.SpriteBuffer_xOffsets = null; - MusicPatchPcmStream.SpriteBuffer_yOffsets = null; - class325.SpriteBuffer_spriteWidths = null; - RunException.SpriteBuffer_spriteHeights = null; - class325.SpriteBuffer_spritePalette = null; - PacketBufferNode.SpriteBuffer_pixels = null; - return var0; - } - - @ObfuscatedName("c") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(CI)Z", - garbageValue = "431385014" + garbageValue = "93178768" ) - @Export("isDigit") - public static boolean isDigit(char var0) { - return var0 >= '0' && var0 <= '9'; + static boolean method679(char var0) { + return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".indexOf(var0) != -1; + } + + @ObfuscatedName("fa") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "30161399" + ) + static final void method652() { + if (Client.logoutTimer > 0) { + class1.logOut(); + } else { + Client.timer.method5123(); + Tile.updateGameState(40); + Tiles.field499 = Client.packetWriter.getSocket(); + Client.packetWriter.removeSocket(); + } + } + + @ObfuscatedName("fo") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "542479713" + ) + @Export("playSong") + static void playSong(int var0) { + if (var0 == -1 && !Client.field855) { + class197.midiPcmStream.clear(); + class197.field2377 = 1; + class247.musicTrackArchive = null; + } else if (var0 != -1 && var0 != Client.field865 && Client.field864 != 0 && !Client.field855) { + WorldMapIcon_0.method253(2, class216.archive6, var0, 0, Client.field864, false); + } + + Client.field865 = var0; } } diff --git a/runescape-client/src/main/java/AccessFile.java b/runescape-client/src/main/java/AccessFile.java index 4ed1667a7f..06275123ba 100644 --- a/runescape-client/src/main/java/AccessFile.java +++ b/runescape-client/src/main/java/AccessFile.java @@ -12,24 +12,24 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("mh") @Implements("AccessFile") public final class AccessFile { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("file") RandomAccessFile file; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - longValue = 4557235660739599375L + longValue = 6718173947913803383L ) @Export("maxSize") final long maxSize; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - longValue = 2697348286360897637L + longValue = -8033630762525345541L ) @Export("offset") long offset; public AccessFile(File var1, String var2, long var3) throws IOException { - if (-1L == var3) { + if (var3 == -1L) { var3 = Long.MAX_VALUE; } @@ -49,21 +49,21 @@ public final class AccessFile { this.file.seek(0L); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("seek") final void seek(long var1) throws IOException { this.file.seek(var1); this.offset = var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "([BIII)V", - garbageValue = "988503907" + garbageValue = "-1742010354" ) @Export("write") public final void write(byte[] var1, int var2, int var3) throws IOException { - if ((long)var3 + this.offset > this.maxSize) { + if (this.offset + (long)var3 > this.maxSize) { this.file.seek(this.maxSize); this.file.write(1); throw new EOFException(); @@ -73,20 +73,20 @@ public final class AccessFile { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "546615303" + signature = "(B)V", + garbageValue = "-87" ) @Export("close") public final void close() throws IOException { this.closeSync(false); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(ZI)V", - garbageValue = "1331216421" + signature = "(ZS)V", + garbageValue = "26740" ) @Export("closeSync") public final void closeSync(boolean var1) throws IOException { @@ -104,20 +104,20 @@ public final class AccessFile { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(I)J", - garbageValue = "773958711" + signature = "(B)J", + garbageValue = "-60" ) @Export("length") public final long length() throws IOException { return this.file.length(); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "([BIII)I", - garbageValue = "-26512267" + signature = "([BIIB)I", + garbageValue = "2" ) @Export("read") public final int read(byte[] var1, int var2, int var3) throws IOException { diff --git a/runescape-client/src/main/java/Actor.java b/runescape-client/src/main/java/Actor.java index 12ee43e023..54a1ae94c7 100644 --- a/runescape-client/src/main/java/Actor.java +++ b/runescape-client/src/main/java/Actor.java @@ -4,319 +4,326 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("by") +@ObfuscatedName("bz") @Implements("Actor") public abstract class Actor extends Entity { - @ObfuscatedName("aa") + @ObfuscatedName("eu") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive20") + static Archive archive20; + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = -1124819045 + intValue = 1673440105 ) @Export("x") int x; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedGetter( - intValue = 682054857 + intValue = -86496457 ) @Export("y") int y; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @ObfuscatedGetter( - intValue = -1546716831 + intValue = -1022004991 ) @Export("rotation") int rotation; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("isWalking") boolean isWalking; - @ObfuscatedName("ax") - @Export("size") - int size; - @ObfuscatedName("as") + @ObfuscatedName("av") @ObfuscatedGetter( - intValue = -334562759 + intValue = 1414687121 + ) + int field927; + @ObfuscatedName("am") + @ObfuscatedGetter( + intValue = 222387089 ) @Export("playerCycle") int playerCycle; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = 1344678569 + intValue = -1677804381 ) @Export("readySequence") int readySequence; - @ObfuscatedName("al") + @ObfuscatedName("ax") @ObfuscatedGetter( - intValue = 1716804711 + intValue = 594336323 ) @Export("turnLeftSequence") int turnLeftSequence; - @ObfuscatedName("ad") + @ObfuscatedName("al") @ObfuscatedGetter( - intValue = 1564906087 + intValue = 1154441065 ) @Export("turnRightSequence") int turnRightSequence; - @ObfuscatedName("an") + @ObfuscatedName("ap") @ObfuscatedGetter( - intValue = 1786260681 + intValue = 83349541 ) @Export("walkSequence") int walkSequence; - @ObfuscatedName("ai") + @ObfuscatedName("aj") @ObfuscatedGetter( - intValue = 864493635 + intValue = 1700088935 ) @Export("walkBackSequence") int walkBackSequence; - @ObfuscatedName("ak") + @ObfuscatedName("ae") @ObfuscatedGetter( - intValue = 632813703 + intValue = -781057529 ) @Export("walkLeftSequence") int walkLeftSequence; - @ObfuscatedName("aq") + @ObfuscatedName("au") @ObfuscatedGetter( - intValue = -67215047 + intValue = -1829521957 ) @Export("walkRightSequence") int walkRightSequence; - @ObfuscatedName("am") + @ObfuscatedName("ah") @ObfuscatedGetter( - intValue = 1501032191 + intValue = -2016822393 ) @Export("runSequence") int runSequence; - @ObfuscatedName("ae") + @ObfuscatedName("an") @Export("overheadText") String overheadText; - @ObfuscatedName("av") + @ObfuscatedName("af") @Export("isAutoChatting") boolean isAutoChatting; - @ObfuscatedName("ah") - boolean field944; - @ObfuscatedName("ag") + @ObfuscatedName("ay") + boolean field939; + @ObfuscatedName("az") @ObfuscatedGetter( - intValue = -1435944093 + intValue = 1235378121 ) @Export("overheadTextCyclesRemaining") int overheadTextCyclesRemaining; - @ObfuscatedName("aj") + @ObfuscatedName("ao") @ObfuscatedGetter( - intValue = 402893763 + intValue = -696280171 ) @Export("overheadTextColor") int overheadTextColor; - @ObfuscatedName("ay") + @ObfuscatedName("ai") @ObfuscatedGetter( - intValue = 2008647289 + intValue = -1688504189 ) @Export("overheadTextEffect") int overheadTextEffect; - @ObfuscatedName("af") + @ObfuscatedName("at") @Export("hitSplatCount") byte hitSplatCount; - @ObfuscatedName("at") + @ObfuscatedName("as") @Export("hitSplatTypes") int[] hitSplatTypes; - @ObfuscatedName("bx") + @ObfuscatedName("ba") @Export("hitSplatValues") int[] hitSplatValues; - @ObfuscatedName("bh") + @ObfuscatedName("bg") @Export("hitSplatCycles") int[] hitSplatCycles; - @ObfuscatedName("bd") + @ObfuscatedName("bc") @Export("hitSplatTypes2") int[] hitSplatTypes2; - @ObfuscatedName("bm") + @ObfuscatedName("bd") @Export("hitSplatValues2") int[] hitSplatValues2; - @ObfuscatedName("bv") + @ObfuscatedName("bx") @ObfuscatedSignature( - signature = "Ljs;" + signature = "Ljm;" ) @Export("healthBars") IterableNodeDeque healthBars; - @ObfuscatedName("bj") + @ObfuscatedName("bl") @ObfuscatedGetter( - intValue = -173770189 + intValue = -2097579951 ) @Export("targetIndex") int targetIndex; - @ObfuscatedName("bs") + @ObfuscatedName("bh") @Export("false0") boolean false0; - @ObfuscatedName("bz") + @ObfuscatedName("bu") @ObfuscatedGetter( - intValue = -708767615 + intValue = -1107390821 ) - int field957; - @ObfuscatedName("bc") + int field934; + @ObfuscatedName("br") @ObfuscatedGetter( - intValue = 592854061 + intValue = -1581860297 ) @Export("movementSequence") int movementSequence; - @ObfuscatedName("bk") + @ObfuscatedName("bq") @ObfuscatedGetter( - intValue = 1334696243 + intValue = 1528888905 ) @Export("movementFrame") int movementFrame; - @ObfuscatedName("ba") + @ObfuscatedName("bi") @ObfuscatedGetter( - intValue = -1979514767 + intValue = -687202097 ) @Export("movementFrameCycle") int movementFrameCycle; - @ObfuscatedName("bn") + @ObfuscatedName("be") @ObfuscatedGetter( - intValue = -1879648645 + intValue = 805247977 ) @Export("sequence") int sequence; - @ObfuscatedName("be") + @ObfuscatedName("bt") @ObfuscatedGetter( - intValue = -1726927213 + intValue = 736502107 ) @Export("sequenceFrame") int sequenceFrame; - @ObfuscatedName("bu") + @ObfuscatedName("bs") @ObfuscatedGetter( - intValue = 1584241957 + intValue = -420296753 ) @Export("sequenceFrameCycle") int sequenceFrameCycle; - @ObfuscatedName("bi") + @ObfuscatedName("bj") @ObfuscatedGetter( - intValue = 1536092043 + intValue = 336768917 ) @Export("sequenceDelay") int sequenceDelay; - @ObfuscatedName("bb") + @ObfuscatedName("bm") @ObfuscatedGetter( - intValue = -807055771 + intValue = -1410322499 ) - int field965; - @ObfuscatedName("bt") + int field960; + @ObfuscatedName("bn") @ObfuscatedGetter( - intValue = -759724979 + intValue = 1228903613 ) @Export("spotAnimation") int spotAnimation; - @ObfuscatedName("by") + @ObfuscatedName("bz") @ObfuscatedGetter( - intValue = 1088352163 + intValue = 1265033073 ) @Export("spotAnimationFrame") int spotAnimationFrame; - @ObfuscatedName("bq") + @ObfuscatedName("bo") @ObfuscatedGetter( - intValue = -340493791 + intValue = -663316133 ) @Export("spotAnimationFrameCycle") int spotAnimationFrameCycle; - @ObfuscatedName("bo") + @ObfuscatedName("bk") @ObfuscatedGetter( - intValue = 2083696993 - ) - int field969; - @ObfuscatedName("br") - @ObfuscatedGetter( - intValue = 2099588065 - ) - @Export("heightOffset") - int heightOffset; - @ObfuscatedName("bl") - @ObfuscatedGetter( - intValue = 337038295 - ) - int field971; - @ObfuscatedName("bf") - @ObfuscatedGetter( - intValue = -1218021367 - ) - int field972; - @ObfuscatedName("bg") - @ObfuscatedGetter( - intValue = -1028826911 + intValue = -1273295849 ) int field973; + @ObfuscatedName("bv") + @ObfuscatedGetter( + intValue = 528591249 + ) + int field965; @ObfuscatedName("bw") @ObfuscatedGetter( - intValue = 682547279 + intValue = 1608804509 ) - int field974; + int field966; + @ObfuscatedName("bb") + @ObfuscatedGetter( + intValue = -164988469 + ) + int field967; + @ObfuscatedName("bf") + @ObfuscatedGetter( + intValue = -1333983147 + ) + int field979; + @ObfuscatedName("by") + @ObfuscatedGetter( + intValue = 105474701 + ) + int field969; @ObfuscatedName("bp") @ObfuscatedGetter( - intValue = 647023113 + intValue = 1769569101 ) - int field948; - @ObfuscatedName("cz") + int field925; + @ObfuscatedName("cx") @ObfuscatedGetter( - intValue = -521720929 + intValue = 1506809691 ) - int field976; - @ObfuscatedName("ck") - @ObfuscatedGetter( - intValue = 2050032535 - ) - int field977; + int field971; @ObfuscatedName("cv") @ObfuscatedGetter( - intValue = 1347834439 + intValue = 1295543135 + ) + int field972; + @ObfuscatedName("ce") + @ObfuscatedGetter( + intValue = 1559943605 ) @Export("npcCycle") int npcCycle; - @ObfuscatedName("co") + @ObfuscatedName("cw") @ObfuscatedGetter( - intValue = -1864995671 + intValue = 320863757 ) @Export("defaultHeight") int defaultHeight; - @ObfuscatedName("cs") + @ObfuscatedName("cd") @ObfuscatedGetter( - intValue = -459931913 + intValue = -1451956301 ) @Export("orientation") int orientation; - @ObfuscatedName("cg") - @ObfuscatedGetter( - intValue = -1988821201 - ) - int field981; @ObfuscatedName("cn") @ObfuscatedGetter( - intValue = -1277282795 + intValue = 477550871 ) - int field982; - @ObfuscatedName("cd") + int field948; + @ObfuscatedName("cr") @ObfuscatedGetter( - intValue = -948674291 + intValue = 1785171989 + ) + int field977; + @ObfuscatedName("ci") + @ObfuscatedGetter( + intValue = 2075263543 ) @Export("pathLength") int pathLength; @ObfuscatedName("cy") @Export("pathX") int[] pathX; - @ObfuscatedName("cj") + @ObfuscatedName("cl") @Export("pathY") int[] pathY; - @ObfuscatedName("cb") + @ObfuscatedName("co") @Export("pathTraversed") byte[] pathTraversed; - @ObfuscatedName("cr") + @ObfuscatedName("cu") @ObfuscatedGetter( - intValue = 2121676837 + intValue = -2083065961 ) - int field949; - @ObfuscatedName("ct") + int field982; + @ObfuscatedName("cz") @ObfuscatedGetter( - intValue = -207338457 + intValue = 1810694977 ) - int field988; + int field983; Actor() { this.isWalking = false; - this.size = 772175475; + this.field927 = 1; this.readySequence = -1; this.turnLeftSequence = -1; this.turnRightSequence = -1; @@ -326,7 +333,7 @@ public abstract class Actor extends Entity { this.walkRightSequence = -1; this.runSequence = -1; this.overheadText = null; - this.field944 = false; + this.field939 = false; this.overheadTextCyclesRemaining = 100; this.overheadTextColor = 0; this.overheadTextEffect = 0; @@ -339,7 +346,7 @@ public abstract class Actor extends Entity { this.healthBars = new IterableNodeDeque(); this.targetIndex = -1; this.false0 = false; - this.field957 = -1; + this.field934 = -1; this.movementSequence = -1; this.movementFrame = 0; this.movementFrameCycle = 0; @@ -347,46 +354,46 @@ public abstract class Actor extends Entity { this.sequenceFrame = 0; this.sequenceFrameCycle = 0; this.sequenceDelay = 0; - this.field965 = 0; + this.field960 = 0; this.spotAnimation = -1; this.spotAnimationFrame = 0; this.spotAnimationFrameCycle = 0; this.npcCycle = 0; this.defaultHeight = 200; - this.field981 = 0; - this.field982 = 32; + this.field948 = 0; + this.field977 = 32; this.pathLength = 0; this.pathX = new int[10]; this.pathY = new int[10]; this.pathTraversed = new byte[10]; - this.field949 = 0; - this.field988 = 0; + this.field982 = 0; + this.field983 = 0; } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(S)Z", - garbageValue = "180" + signature = "(B)Z", + garbageValue = "-25" ) @Export("isVisible") boolean isVisible() { return false; } - @ObfuscatedName("ag") + @ObfuscatedName("bu") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "4" + garbageValue = "0" ) - final void method1765() { + final void method1862() { this.pathLength = 0; - this.field988 = 0; + this.field983 = 0; } - @ObfuscatedName("aj") + @ObfuscatedName("br") @ObfuscatedSignature( signature = "(IIIIIII)V", - garbageValue = "341931021" + garbageValue = "-506913236" ) @Export("addHitSplat") final void addHitSplat(int var1, int var2, int var3, int var4, int var5, int var6) { @@ -406,52 +413,38 @@ public abstract class Actor extends Entity { int var10 = -1; int var11 = 0; if (var1 >= 0) { - HitSplatDefinition var13 = (HitSplatDefinition)HitSplatDefinition.HitSplatDefinition_cached.get((long)var1); - HitSplatDefinition var12; - if (var13 != null) { - var12 = var13; - } else { - byte[] var14 = HitSplatDefinition.HitSplatDefinition_archive.takeFile(32, var1); - var13 = new HitSplatDefinition(); - if (var14 != null) { - var13.decode(new Buffer(var14)); - } - - HitSplatDefinition.HitSplatDefinition_cached.put(var13, (long)var1); - var12 = var13; - } - - var10 = var12.field3327; - var11 = var12.field3318; + HitSplatDefinition var12 = NetFileRequest.method4298(var1); + var10 = var12.field3313; + var11 = var12.field3314; } - int var15; + int var14; if (var8) { if (var10 == -1) { return; } var9 = 0; - var15 = 0; + var14 = 0; if (var10 == 0) { - var15 = this.hitSplatCycles[0]; + var14 = this.hitSplatCycles[0]; } else if (var10 == 1) { - var15 = this.hitSplatValues[0]; + var14 = this.hitSplatValues[0]; } - for (int var16 = 1; var16 < 4; ++var16) { + for (int var13 = 1; var13 < 4; ++var13) { if (var10 == 0) { - if (this.hitSplatCycles[var16] < var15) { - var9 = var16; - var15 = this.hitSplatCycles[var16]; + if (this.hitSplatCycles[var13] < var14) { + var9 = var13; + var14 = this.hitSplatCycles[var13]; } - } else if (var10 == 1 && this.hitSplatValues[var16] < var15) { - var9 = var16; - var15 = this.hitSplatValues[var16]; + } else if (var10 == 1 && this.hitSplatValues[var13] < var14) { + var9 = var13; + var14 = this.hitSplatValues[var13]; } } - if (var10 == 1 && var15 >= var2) { + if (var10 == 1 && var14 >= var2) { return; } } else { @@ -459,11 +452,11 @@ public abstract class Actor extends Entity { this.hitSplatCount = 0; } - for (var15 = 0; var15 < 4; ++var15) { - byte var17 = this.hitSplatCount; + for (var14 = 0; var14 < 4; ++var14) { + byte var15 = this.hitSplatCount; this.hitSplatCount = (byte)((this.hitSplatCount + 1) % 4); - if (this.hitSplatCycles[var17] <= var5) { - var9 = var17; + if (this.hitSplatCycles[var15] <= var5) { + var9 = var15; break; } } @@ -478,10 +471,10 @@ public abstract class Actor extends Entity { } } - @ObfuscatedName("ay") + @ObfuscatedName("bq") @ObfuscatedSignature( signature = "(IIIIIIB)V", - garbageValue = "31" + garbageValue = "-38" ) @Export("addHealthBar") final void addHealthBar(int var1, int var2, int var3, int var4, int var5, int var6) { @@ -509,7 +502,7 @@ public abstract class Actor extends Entity { HealthBar var13; for (var13 = (HealthBar)this.healthBars.last(); var13 != null; var13 = (HealthBar)this.healthBars.previous()) { ++var12; - if (var13.definition.field3258 == var8.field3258) { + if (var13.definition.field3265 == var8.field3265) { var13.put(var2 + var4, var5, var6, var3); return; } @@ -540,10 +533,10 @@ public abstract class Actor extends Entity { } } - @ObfuscatedName("au") + @ObfuscatedName("bi") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1895868902" + garbageValue = "-1507831115" ) @Export("removeHealthBar") final void removeHealthBar(int var1) { @@ -572,4 +565,85 @@ public abstract class Actor extends Entity { } } + + @ObfuscatedName("gj") + @ObfuscatedSignature( + signature = "(Lbz;S)V", + garbageValue = "16384" + ) + static final void method1873(Actor var0) { + if (var0.field977 != 0) { + if (var0.targetIndex != -1) { + Object var1 = null; + if (var0.targetIndex < 32768) { + var1 = Client.npcs[var0.targetIndex]; + } else if (var0.targetIndex >= 32768) { + var1 = Client.players[var0.targetIndex - 32768]; + } + + if (var1 != null) { + int var2 = var0.x - ((Actor)var1).x; + int var3 = var0.y - ((Actor)var1).y; + if (var2 != 0 || var3 != 0) { + var0.orientation = (int)(Math.atan2((double)var2, (double)var3) * 325.949D) & 2047; + } + } else if (var0.false0) { + var0.targetIndex = -1; + var0.false0 = false; + } + } + + if (var0.field934 != -1 && (var0.pathLength == 0 || var0.field982 > 0)) { + var0.orientation = var0.field934; + var0.field934 = -1; + } + + int var4 = var0.orientation - var0.rotation & 2047; + if (var4 == 0 && var0.false0) { + var0.targetIndex = -1; + var0.false0 = false; + } + + if (var4 != 0) { + ++var0.field948; + boolean var6; + if (var4 > 1024) { + var0.rotation -= var0.field977; + var6 = true; + if (var4 < var0.field977 || var4 > 2048 - var0.field977) { + var0.rotation = var0.orientation; + var6 = false; + } + + if (var0.readySequence == var0.movementSequence && (var0.field948 > 25 || var6)) { + if (var0.turnLeftSequence != -1) { + var0.movementSequence = var0.turnLeftSequence; + } else { + var0.movementSequence = var0.walkSequence; + } + } + } else { + var0.rotation += var0.field977; + var6 = true; + if (var4 < var0.field977 || var4 > 2048 - var0.field977) { + var0.rotation = var0.orientation; + var6 = false; + } + + if (var0.readySequence == var0.movementSequence && (var0.field948 > 25 || var6)) { + if (var0.turnRightSequence != -1) { + var0.movementSequence = var0.turnRightSequence; + } else { + var0.movementSequence = var0.walkSequence; + } + } + } + + var0.rotation &= 2047; + } else { + var0.field948 = 0; + } + + } + } } diff --git a/runescape-client/src/main/java/Animation.java b/runescape-client/src/main/java/Animation.java index 6997bb7d51..e313d89071 100644 --- a/runescape-client/src/main/java/Animation.java +++ b/runescape-client/src/main/java/Animation.java @@ -3,51 +3,51 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("da") +@ObfuscatedName("dw") @Implements("Animation") public class Animation { - @ObfuscatedName("z") - static int[] field1607; + @ObfuscatedName("a") + static int[] field1609; + @ObfuscatedName("t") + static int[] field1611; @ObfuscatedName("n") - static int[] field1598; + static int[] field1618; + @ObfuscatedName("q") + static int[] field1610; @ObfuscatedName("v") - static int[] field1597; - @ObfuscatedName("u") - static int[] field1600; - @ObfuscatedName("r") @ObfuscatedSignature( - signature = "Lew;" + signature = "Lee;" ) @Export("skeleton") Skeleton skeleton; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("transformCount") int transformCount; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("transformSkeletonLabels") int[] transformSkeletonLabels; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("transformXs") int[] transformXs; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("transformYs") int[] transformYs; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("transformZs") int[] transformZs; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("hasAlphaTransform") boolean hasAlphaTransform; static { - field1607 = new int[500]; - field1598 = new int[500]; - field1597 = new int[500]; - field1600 = new int[500]; + field1609 = new int[500]; + field1611 = new int[500]; + field1618 = new int[500]; + field1610 = new int[500]; } @ObfuscatedSignature( - signature = "([BLew;)V" + signature = "([BLee;)V" ) Animation(byte[] var1, Skeleton var2) { this.skeleton = null; @@ -69,38 +69,38 @@ public class Animation { if (this.skeleton.transformTypes[var8] != 0) { for (int var10 = var8 - 1; var10 > var6; --var10) { if (this.skeleton.transformTypes[var10] == 0) { - field1607[var7] = var10; - field1598[var7] = 0; - field1597[var7] = 0; - field1600[var7] = 0; + field1609[var7] = var10; + field1611[var7] = 0; + field1618[var7] = 0; + field1610[var7] = 0; ++var7; break; } } } - field1607[var7] = var8; + field1609[var7] = var8; short var11 = 0; if (this.skeleton.transformTypes[var8] == 3) { var11 = 128; } if ((var9 & 1) != 0) { - field1598[var7] = var4.readShortSmart(); + field1611[var7] = var4.readShortSmart(); } else { - field1598[var7] = var11; + field1611[var7] = var11; } if ((var9 & 2) != 0) { - field1597[var7] = var4.readShortSmart(); + field1618[var7] = var4.readShortSmart(); } else { - field1597[var7] = var11; + field1618[var7] = var11; } if ((var9 & 4) != 0) { - field1600[var7] = var4.readShortSmart(); + field1610[var7] = var4.readShortSmart(); } else { - field1600[var7] = var11; + field1610[var7] = var11; } var6 = var8; @@ -121,10 +121,10 @@ public class Animation { this.transformZs = new int[var7]; for (var8 = 0; var8 < var7; ++var8) { - this.transformSkeletonLabels[var8] = field1607[var8]; - this.transformXs[var8] = field1598[var8]; - this.transformYs[var8] = field1597[var8]; - this.transformZs[var8] = field1600[var8]; + this.transformSkeletonLabels[var8] = field1609[var8]; + this.transformXs[var8] = field1611[var8]; + this.transformYs[var8] = field1618[var8]; + this.transformZs[var8] = field1610[var8]; } } diff --git a/runescape-client/src/main/java/Archive.java b/runescape-client/src/main/java/Archive.java index 794843f962..606e7f91ac 100644 --- a/runescape-client/src/main/java/Archive.java +++ b/runescape-client/src/main/java/Archive.java @@ -5,216 +5,228 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ie") +@ObfuscatedName("ij") @Implements("Archive") public class Archive extends AbstractArchive { - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("Archive_crc") static CRC32 Archive_crc; - @ObfuscatedName("jn") + @ObfuscatedName("g") @ObfuscatedSignature( - signature = "Ldz;" - ) - @Export("textureProvider") - static TextureProvider textureProvider; - @ObfuscatedName("j") - @ObfuscatedSignature( - signature = "Lkg;" + signature = "Lke;" ) @Export("archiveDisk") ArchiveDisk archiveDisk; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "Lkg;" + signature = "Lke;" ) @Export("masterDisk") ArchiveDisk masterDisk; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = -341991117 + intValue = -697196869 ) @Export("index") int index; - @ObfuscatedName("k") - volatile boolean field3131; - @ObfuscatedName("ac") - boolean field3129; - @ObfuscatedName("az") + @ObfuscatedName("y") + volatile boolean field3145; + @ObfuscatedName("aa") + boolean field3139; + @ObfuscatedName("aw") @Export("validGroups") volatile boolean[] validGroups; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = 2033402119 + intValue = 1007467833 ) @Export("indexCrc") int indexCrc; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedGetter( - intValue = -302073813 + intValue = -722952975 ) @Export("indexVersion") int indexVersion; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @ObfuscatedGetter( - intValue = -630367829 + intValue = 372476733 ) - int field3137; + int field3148; static { Archive_crc = new CRC32(); } @ObfuscatedSignature( - signature = "(Lkg;Lkg;IZZZ)V" + signature = "(Lke;Lke;IZZZ)V" ) public Archive(ArchiveDisk var1, ArchiveDisk var2, int var3, boolean var4, boolean var5, boolean var6) { super(var4, var5); - this.field3131 = false; - this.field3129 = false; - this.field3137 = -1; + this.field3145 = false; + this.field3139 = false; + this.field3148 = -1; this.archiveDisk = var1; this.masterDisk = var2; this.index = var3; - this.field3129 = var6; + this.field3139 = var6; int var8 = this.index; - if (AbstractWorldMapIcon.NetCache_reference != null) { - AbstractWorldMapIcon.NetCache_reference.offset = var8 * 8 + 5; - int var9 = AbstractWorldMapIcon.NetCache_reference.readInt(); - int var10 = AbstractWorldMapIcon.NetCache_reference.readInt(); + if (Calendar.NetCache_reference != null) { + Calendar.NetCache_reference.offset = var8 * 8 + 5; + int var9 = Calendar.NetCache_reference.readInt(); + int var10 = Calendar.NetCache_reference.readInt(); this.loadIndex(var9, var10); } else { - WorldMapDecoration.requestNetFile((Archive)null, 255, 255, 0, (byte)0, true); + BuddyRankComparator.requestNetFile((Archive)null, 255, 255, 0, (byte)0, true); NetCache.NetCache_archives[var8] = this; } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IB)V", - garbageValue = "15" + garbageValue = "117" ) @Export("loadRegionFromGroup") void loadRegionFromGroup(int var1) { - int var2 = this.index; - long var3 = (long)((var2 << 16) + var1); - NetFileRequest var5 = (NetFileRequest)NetCache.NetCache_pendingWrites.get(var3); - if (var5 != null) { - NetCache.NetCache_pendingWritesQueue.addLast(var5); - } - + Tile.method3021(this.index, var1); } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(II)I", - garbageValue = "-2030453035" + garbageValue = "-778670663" ) @Export("groupLoadPercent") int groupLoadPercent(int var1) { if (super.groups[var1] != null) { return 100; - } else if (this.validGroups[var1]) { - return 100; } else { - int var3 = this.index; - long var4 = (long)((var3 << 16) + var1); - int var2; - if (WorldMapEvent.NetCache_currentResponse != null && WorldMapEvent.NetCache_currentResponse.key == var4) { - var2 = FaceNormal.NetCache_responseArchiveBuffer.offset * 99 / (FaceNormal.NetCache_responseArchiveBuffer.array.length - WorldMapEvent.NetCache_currentResponse.padding) + 1; - } else { - var2 = 0; - } - - return var2; + return this.validGroups[var1] ? 100 : PcmPlayer.method2638(this.index, var1); } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "848617854" + garbageValue = "664192835" ) @Export("loadGroup") void loadGroup(int var1) { if (this.archiveDisk != null && this.validGroups != null && this.validGroups[var1]) { - WorldMapArea.method429(var1, this.archiveDisk, this); + ArchiveDisk var2 = this.archiveDisk; + byte[] var4 = null; + synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue) { + for (ArchiveDiskAction var6 = (ArchiveDiskAction)ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.last(); var6 != null; var6 = (ArchiveDiskAction)ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.previous()) { + if (var6.key == (long)var1 && var2 == var6.archiveDisk && var6.type == 0) { + var4 = var6.data; + break; + } + } + } + + if (var4 != null) { + this.load(var2, var1, var4, true); + } else { + byte[] var5 = var2.read(var1); + this.load(var2, var1, var5, true); + } } else { - WorldMapDecoration.requestNetFile(this, this.index, var1, super.groupCrcs[var1], (byte)2, true); + BuddyRankComparator.requestNetFile(this, this.index, var1, super.groupCrcs[var1], (byte)2, true); + } + + } + + @ObfuscatedName("dm") + @ObfuscatedSignature( + signature = "(I)Z", + garbageValue = "1944128769" + ) + public boolean method4409() { + return this.field3145; + } + + @ObfuscatedName("di") + @ObfuscatedSignature( + signature = "(I)I", + garbageValue = "1888934237" + ) + @Export("percentage") + public int percentage() { + if (this.field3145) { + return 100; + } else if (super.groups != null) { + return 99; + } else { + int var1 = PcmPlayer.method2638(255, this.index); + if (var1 >= 100) { + var1 = 99; + } + + return var1; + } + } + + @ObfuscatedName("dn") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "1627267757" + ) + @Export("loadIndex") + public void loadIndex(int var1, int var2) { + this.indexCrc = var1; + this.indexVersion = var2; + if (this.masterDisk != null) { + int var3 = this.index; + ArchiveDisk var4 = this.masterDisk; + byte[] var6 = null; + synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue) { + for (ArchiveDiskAction var8 = (ArchiveDiskAction)ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.last(); var8 != null; var8 = (ArchiveDiskAction)ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.previous()) { + if (var8.key == (long)var3 && var4 == var8.archiveDisk && var8.type == 0) { + var6 = var8.data; + break; + } + } + } + + if (var6 != null) { + this.load(var4, var3, var6, true); + } else { + byte[] var7 = var4.read(var3); + this.load(var4, var3, var7, true); + } + } else { + BuddyRankComparator.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); } } @ObfuscatedName("dr") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "2035998705" - ) - public boolean method4235() { - return this.field3131; - } - - @ObfuscatedName("du") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1744835603" - ) - @Export("percentage") - public int percentage() { - if (this.field3131) { - return 100; - } else if (super.groups != null) { - return 99; - } else { - int var2 = this.index; - long var3 = (long)(var2 + 16711680); - int var1; - if (WorldMapEvent.NetCache_currentResponse != null && WorldMapEvent.NetCache_currentResponse.key == var3) { - var1 = FaceNormal.NetCache_responseArchiveBuffer.offset * 99 / (FaceNormal.NetCache_responseArchiveBuffer.array.length - WorldMapEvent.NetCache_currentResponse.padding) + 1; - } else { - var1 = 0; - } - - int var5 = var1; - if (var1 >= 100) { - var5 = 99; - } - - return var5; - } - } - - @ObfuscatedName("ds") - @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "684167120" - ) - @Export("loadIndex") - void loadIndex(int var1, int var2) { - this.indexCrc = var1; - this.indexVersion = var2; - if (this.masterDisk != null) { - WorldMapArea.method429(this.index, this.masterDisk, this); - } else { - WorldMapDecoration.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); - } - - } - - @ObfuscatedName("dc") - @ObfuscatedSignature( - signature = "(I[BZZI)V", - garbageValue = "1316980907" + signature = "(I[BZZB)V", + garbageValue = "4" ) @Export("write") - void write(int var1, byte[] var2, boolean var3, boolean var4) { + public void write(int var1, byte[] var2, boolean var3, boolean var4) { if (var3) { - if (this.field3131) { + if (this.field3145) { throw new RuntimeException(); } if (this.masterDisk != null) { - CollisionMap.method3536(this.index, var2, this.masterDisk); + int var5 = this.index; + ArchiveDisk var6 = this.masterDisk; + ArchiveDiskAction var7 = new ArchiveDiskAction(); + var7.type = 0; + var7.key = (long)var5; + var7.data = var2; + var7.archiveDisk = var6; + synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue) { + ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.addFirst(var7); + } + + ItemContainer.method1250(); } this.decodeIndex(var2); @@ -223,32 +235,42 @@ public class Archive extends AbstractArchive { var2[var2.length - 2] = (byte)(super.groupVersions[var1] >> 8); var2[var2.length - 1] = (byte)super.groupVersions[var1]; if (this.archiveDisk != null) { - CollisionMap.method3536(var1, var2, this.archiveDisk); + ArchiveDisk var11 = this.archiveDisk; + ArchiveDiskAction var14 = new ArchiveDiskAction(); + var14.type = 0; + var14.key = (long)var1; + var14.data = var2; + var14.archiveDisk = var11; + synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue) { + ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.addFirst(var14); + } + + ItemContainer.method1250(); this.validGroups[var1] = true; } if (var4) { - super.groups[var1] = GrandExchangeEvents.method76(var2, false); + super.groups[var1] = MusicPatchPcmStream.method4064(var2, false); } } } - @ObfuscatedName("di") + @ObfuscatedName("do") @ObfuscatedSignature( - signature = "(Lkg;I[BZB)V", - garbageValue = "1" + signature = "(Lke;I[BZI)V", + garbageValue = "-1897627904" ) @Export("load") public void load(ArchiveDisk var1, int var2, byte[] var3, boolean var4) { int var5; if (var1 == this.masterDisk) { - if (this.field3131) { + if (this.field3145) { throw new RuntimeException(); } if (var3 == null) { - WorldMapDecoration.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); + BuddyRankComparator.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); return; } @@ -256,11 +278,11 @@ public class Archive extends AbstractArchive { Archive_crc.update(var3, 0, var3.length); var5 = (int)Archive_crc.getValue(); if (var5 != this.indexCrc) { - WorldMapDecoration.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); + BuddyRankComparator.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); return; } - Buffer var9 = new Buffer(MusicPatch.decompressBytes(var3)); + Buffer var9 = new Buffer(ArchiveLoader.decompressBytes(var3)); int var7 = var9.readUnsignedByte(); if (var7 != 5 && var7 != 6) { throw new RuntimeException(var7 + "," + this.index + "," + var2); @@ -272,21 +294,21 @@ public class Archive extends AbstractArchive { } if (var8 != this.indexVersion) { - WorldMapDecoration.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); + BuddyRankComparator.requestNetFile(this, 255, this.index, this.indexCrc, (byte)0, true); return; } this.decodeIndex(var3); this.loadAllLocal(); } else { - if (!var4 && var2 == this.field3137) { - this.field3131 = true; + if (!var4 && var2 == this.field3148) { + this.field3145 = true; } if (var3 == null || var3.length <= 2) { this.validGroups[var2] = false; - if (this.field3129 || var4) { - WorldMapDecoration.requestNetFile(this, this.index, var2, super.groupCrcs[var2], (byte)2, var4); + if (this.field3139 || var4) { + BuddyRankComparator.requestNetFile(this, this.index, var2, super.groupCrcs[var2], (byte)2, var4); } return; @@ -298,8 +320,8 @@ public class Archive extends AbstractArchive { int var6 = ((var3[var3.length - 2] & 255) << 8) + (var3[var3.length - 1] & 255); if (var5 != super.groupCrcs[var2] || var6 != super.groupVersions[var2]) { this.validGroups[var2] = false; - if (this.field3129 || var4) { - WorldMapDecoration.requestNetFile(this, this.index, var2, super.groupCrcs[var2], (byte)2, var4); + if (this.field3139 || var4) { + BuddyRankComparator.requestNetFile(this, this.index, var2, super.groupCrcs[var2], (byte)2, var4); } return; @@ -307,16 +329,16 @@ public class Archive extends AbstractArchive { this.validGroups[var2] = true; if (var4) { - super.groups[var2] = GrandExchangeEvents.method76(var3, false); + super.groups[var2] = MusicPatchPcmStream.method4064(var3, false); } } } - @ObfuscatedName("dk") + @ObfuscatedName("ds") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "8" + garbageValue = "0" ) @Export("loadAllLocal") void loadAllLocal() { @@ -328,9 +350,9 @@ public class Archive extends AbstractArchive { } if (this.archiveDisk == null) { - this.field3131 = true; + this.field3145 = true; } else { - this.field3137 = -1; + this.field3148 = -1; for (var1 = 0; var1 < this.validGroups.length; ++var1) { if (super.fileCounts[var1] > 0) { @@ -344,50 +366,40 @@ public class Archive extends AbstractArchive { ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.addFirst(var4); } - synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock) { - if (ArchiveDiskActionHandler.field3127 == 0) { - UserComparator5.ArchiveDiskActionHandler_thread = new Thread(new ArchiveDiskActionHandler()); - UserComparator5.ArchiveDiskActionHandler_thread.setDaemon(true); - UserComparator5.ArchiveDiskActionHandler_thread.start(); - UserComparator5.ArchiveDiskActionHandler_thread.setPriority(5); - } - - ArchiveDiskActionHandler.field3127 = 600; - } - - this.field3137 = var1; + ItemContainer.method1250(); + this.field3148 = var1; } } - if (this.field3137 == -1) { - this.field3131 = true; + if (this.field3148 == -1) { + this.field3145 = true; } } } - @ObfuscatedName("dx") - @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "-433634856" - ) - public boolean method4243(int var1) { - return this.validGroups[var1]; - } - @ObfuscatedName("dz") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "805361618" + garbageValue = "139739095" ) - public boolean method4244(int var1) { + public boolean method4417(int var1) { + return this.validGroups[var1]; + } + + @ObfuscatedName("dj") + @ObfuscatedSignature( + signature = "(II)Z", + garbageValue = "308980057" + ) + public boolean method4436(int var1) { return this.getGroupFileIds(var1) != null; } - @ObfuscatedName("do") + @ObfuscatedName("df") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "727894645" + signature = "(B)I", + garbageValue = "52" ) @Export("loadPercent") public int loadPercent() { @@ -409,36 +421,4 @@ public class Archive extends AbstractArchive { return var3; } } - - @ObfuscatedName("jq") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-212508230" - ) - static final void method4278() { - for (int var0 = 0; var0 < Players.Players_count; ++var0) { - Player var1 = Client.players[Players.Players_indices[var0]]; - var1.clearIsInClanChat(); - } - - } - - @ObfuscatedName("km") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "26372698" - ) - static void method4250() { - if (StudioGame.field3086 != null) { - Client.field905 = Client.cycle; - StudioGame.field3086.method4300(); - - for (int var0 = 0; var0 < Client.players.length; ++var0) { - if (Client.players[var0] != null) { - StudioGame.field3086.method4301(class223.baseX * 64 + (Client.players[var0].x >> 7), class286.baseY * 64 + (Client.players[var0].y >> 7)); - } - } - } - - } } diff --git a/runescape-client/src/main/java/ArchiveDisk.java b/runescape-client/src/main/java/ArchiveDisk.java index 04f403f2a6..5b11c78ddd 100644 --- a/runescape-client/src/main/java/ArchiveDisk.java +++ b/runescape-client/src/main/java/ArchiveDisk.java @@ -6,33 +6,33 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kg") +@ObfuscatedName("ke") @Implements("ArchiveDisk") public final class ArchiveDisk { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("ArchiveDisk_buffer") static byte[] ArchiveDisk_buffer; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lmm;" + signature = "Lmz;" ) @Export("datFile") BufferedFile datFile; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lmm;" + signature = "Lmz;" ) @Export("idxFile") BufferedFile idxFile; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 558641831 + intValue = 161703877 ) @Export("archive") int archive; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1322039527 + intValue = -1904076189 ) @Export("maxEntrySize") int maxEntrySize; @@ -42,7 +42,7 @@ public final class ArchiveDisk { } @ObfuscatedSignature( - signature = "(ILmm;Lmm;I)V" + signature = "(ILmz;Lmz;I)V" ) public ArchiveDisk(int var1, BufferedFile var2, BufferedFile var3, int var4) { this.datFile = null; @@ -54,10 +54,10 @@ public final class ArchiveDisk { this.maxEntrySize = var4; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IB)[B", - garbageValue = "1" + signature = "(II)[B", + garbageValue = "909989456" ) @Export("read") public byte[] read(int var1) { @@ -89,7 +89,7 @@ public final class ArchiveDisk { return (byte[])var10000; } - this.datFile.seek((long)var4 * 520L); + this.datFile.seek(520L * (long)var4); int var8 = var3 - var6; int var9; int var10; @@ -102,7 +102,7 @@ public final class ArchiveDisk { } var13 = 10; - this.datFile.read(ArchiveDisk_buffer, 0, var8 + var13); + this.datFile.read(ArchiveDisk_buffer, 0, var13 + var8); var9 = ((ArchiveDisk_buffer[1] & 255) << 16) + ((ArchiveDisk_buffer[0] & 255) << 24) + (ArchiveDisk_buffer[3] & 255) + ((ArchiveDisk_buffer[2] & 255) << 8); var10 = (ArchiveDisk_buffer[5] & 255) + ((ArchiveDisk_buffer[4] & 255) << 8); var11 = (ArchiveDisk_buffer[8] & 255) + ((ArchiveDisk_buffer[7] & 255) << 8) + ((ArchiveDisk_buffer[6] & 255) << 16); @@ -120,7 +120,7 @@ public final class ArchiveDisk { var12 = ArchiveDisk_buffer[7] & 255; } - if (var9 == var1 && var10 == var7 && var12 == this.archive) { + if (var9 == var1 && var7 == var10 && var12 == this.archive) { if (var11 >= 0 && (long)var11 <= this.datFile.length() / 520L) { int var14 = var13 + var8; @@ -151,10 +151,10 @@ public final class ArchiveDisk { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I[BII)Z", - garbageValue = "-1069570750" + garbageValue = "434454104" ) @Export("write") public boolean write(int var1, byte[] var2, int var3) { @@ -172,10 +172,10 @@ public final class ArchiveDisk { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I[BIZI)Z", - garbageValue = "1005578949" + garbageValue = "-498922457" ) @Export("write0") boolean write0(int var1, byte[] var2, int var3, boolean var4) { @@ -216,7 +216,7 @@ public final class ArchiveDisk { while (true) { if (var7 < var3) { - label171: { + label170: { int var9 = 0; int var10; if (var4) { @@ -227,7 +227,7 @@ public final class ArchiveDisk { try { this.datFile.read(ArchiveDisk_buffer, 0, 10); } catch (EOFException var17) { - break label171; + break label170; } var10 = ((ArchiveDisk_buffer[1] & 255) << 16) + ((ArchiveDisk_buffer[0] & 255) << 24) + (ArchiveDisk_buffer[3] & 255) + ((ArchiveDisk_buffer[2] & 255) << 8); @@ -238,7 +238,7 @@ public final class ArchiveDisk { try { this.datFile.read(ArchiveDisk_buffer, 0, 8); } catch (EOFException var16) { - break label171; + break label170; } var10 = (ArchiveDisk_buffer[1] & 255) + ((ArchiveDisk_buffer[0] & 255) << 8); @@ -265,7 +265,7 @@ public final class ArchiveDisk { ++var9; } - if (var9 == var6) { + if (var6 == var9) { ++var9; } } @@ -285,7 +285,7 @@ public final class ArchiveDisk { ArchiveDisk_buffer[7] = (byte)(var9 >> 8); ArchiveDisk_buffer[8] = (byte)var9; ArchiveDisk_buffer[9] = (byte)this.archive; - this.datFile.seek(520L * (long)var6); + this.datFile.seek((long)var6 * 520L); this.datFile.write(ArchiveDisk_buffer, 0, 10); var10 = var3 - var7; if (var10 > 510) { @@ -336,123 +336,4 @@ public final class ArchiveDisk { public String toString() { return "" + this.archive; } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lkl;Ljava/lang/String;I)I", - garbageValue = "1895940511" - ) - public static int method5796(Buffer var0, String var1) { - int var2 = var0.offset; - byte[] var3 = UserComparator3.method3394(var1); - var0.writeSmartByteShort(var3.length); - var0.offset += class210.huffman.compress(var3, 0, var3.length, var0.array, var0.offset); - return var0.offset - var2; - } - - @ObfuscatedName("el") - @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1355807172" - ) - @Export("getLoginError") - static void getLoginError(int var0) { - if (var0 == -3) { - PlayerType.setLoginResponseString("Connection timed out.", "Please try using a different world.", ""); - } else if (var0 == -2) { - PlayerType.setLoginResponseString("", "Error connecting to server.", ""); - } else if (var0 == -1) { - PlayerType.setLoginResponseString("No response from server.", "Please try using a different world.", ""); - } else if (var0 == 3) { - Login.loginIndex = 3; - Login.field1171 = 1; - } else if (var0 == 4) { - Login.loginIndex = 12; - Login.field1174 = 0; - } else if (var0 == 5) { - Login.field1171 = 2; - PlayerType.setLoginResponseString("Your account has not logged out from its last", "session or the server is too busy right now.", "Please try again in a few minutes."); - } else if (var0 == 68 || !Client.onMobile && var0 == 6) { - PlayerType.setLoginResponseString("RuneScape has been updated!", "Please reload this page.", ""); - } else if (var0 == 7) { - PlayerType.setLoginResponseString("This world is full.", "Please use a different world.", ""); - } else if (var0 == 8) { - PlayerType.setLoginResponseString("Unable to connect.", "Login server offline.", ""); - } else if (var0 == 9) { - PlayerType.setLoginResponseString("Login limit exceeded.", "Too many connections from your address.", ""); - } else if (var0 == 10) { - PlayerType.setLoginResponseString("Unable to connect.", "Bad session id.", ""); - } else if (var0 == 11) { - PlayerType.setLoginResponseString("We suspect someone knows your password.", "Press 'change your password' on front page.", ""); - } else if (var0 == 12) { - PlayerType.setLoginResponseString("You need a members account to login to this world.", "Please subscribe, or use a different world.", ""); - } else if (var0 == 13) { - PlayerType.setLoginResponseString("Could not complete login.", "Please try using a different world.", ""); - } else if (var0 == 14) { - PlayerType.setLoginResponseString("The server is being updated.", "Please wait 1 minute and try again.", ""); - } else if (var0 == 16) { - PlayerType.setLoginResponseString("Too many login attempts.", "Please wait a few minutes before trying again.", ""); - } else if (var0 == 17) { - PlayerType.setLoginResponseString("You are standing in a members-only area.", "To play on this world move to a free area first", ""); - } else if (var0 == 18) { - Login.loginIndex = 12; - Login.field1174 = 1; - } else if (var0 == 19) { - PlayerType.setLoginResponseString("This world is running a closed Beta.", "Sorry invited players only.", "Please use a different world."); - } else if (var0 == 20) { - PlayerType.setLoginResponseString("Invalid loginserver requested.", "Please try using a different world.", ""); - } else if (var0 == 22) { - PlayerType.setLoginResponseString("Malformed login packet.", "Please try again.", ""); - } else if (var0 == 23) { - PlayerType.setLoginResponseString("No reply from loginserver.", "Please wait 1 minute and try again.", ""); - } else if (var0 == 24) { - PlayerType.setLoginResponseString("Error loading your profile.", "Please contact customer support.", ""); - } else if (var0 == 25) { - PlayerType.setLoginResponseString("Unexpected loginserver response.", "Please try using a different world.", ""); - } else if (var0 == 26) { - PlayerType.setLoginResponseString("This computers address has been blocked", "as it was used to break our rules.", ""); - } else if (var0 == 27) { - PlayerType.setLoginResponseString("", "Service unavailable.", ""); - } else if (var0 == 31) { - PlayerType.setLoginResponseString("Your account must have a displayname set", "in order to play the game. Please set it", "via the website, or the main game."); - } else if (var0 == 32) { - PlayerType.setLoginResponseString("Your attempt to log into your account was", "unsuccessful. Don't worry, you can sort", "this out by visiting the billing system."); - } else if (var0 == 37) { - PlayerType.setLoginResponseString("Your account is currently inaccessible.", "Please try again in a few minutes.", ""); - } else if (var0 == 38) { - PlayerType.setLoginResponseString("You need to vote to play!", "Visit runescape.com and vote,", "and then come back here!"); - } else if (var0 == 55) { - Login.loginIndex = 8; - } else { - if (var0 == 56) { - PlayerType.setLoginResponseString("Enter the 6-digit code generated by your", "authenticator app.", ""); - MouseRecorder.updateGameState(11); - return; - } - - if (var0 == 57) { - PlayerType.setLoginResponseString("The code you entered was incorrect.", "Please try again.", ""); - MouseRecorder.updateGameState(11); - return; - } - - if (var0 == 61) { - Login.loginIndex = 7; - } else { - PlayerType.setLoginResponseString("Unexpected server response", "Please try using a different world.", ""); - } - } - - MouseRecorder.updateGameState(10); - } - - @ObfuscatedName("kb") - @ObfuscatedSignature( - signature = "(Lkl;IB)V", - garbageValue = "16" - ) - static void method5801(Buffer var0, int var1) { - LoginScreenAnimation.method1832(var0.array, var1); - SoundSystem.method2468(var0, var1); - } } diff --git a/runescape-client/src/main/java/ArchiveDiskAction.java b/runescape-client/src/main/java/ArchiveDiskAction.java index 131b19adad..82fedcc9e1 100644 --- a/runescape-client/src/main/java/ArchiveDiskAction.java +++ b/runescape-client/src/main/java/ArchiveDiskAction.java @@ -3,32 +3,391 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("hy") +@ObfuscatedName("hs") @Implements("ArchiveDiskAction") public class ArchiveDiskAction extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -1673038183 + intValue = -114474261 ) @Export("type") int type; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("data") public byte[] data; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lkg;" + signature = "Lke;" ) @Export("archiveDisk") public ArchiveDisk archiveDisk; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lij;" ) @Export("archive") public Archive archive; ArchiveDiskAction() { } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Lgw;B)I", + garbageValue = "2" + ) + @Export("compareStrings") + public static int compareStrings(CharSequence var0, CharSequence var1, Language var2) { + int var3 = var0.length(); + int var4 = var1.length(); + int var5 = 0; + int var6 = 0; + char var7 = 0; + char var8 = 0; + + while (var5 - var7 < var3 || var6 - var8 < var4) { + if (var5 - var7 >= var3) { + return -1; + } + + if (var6 - var8 >= var4) { + return 1; + } + + char var9; + if (var7 != 0) { + var9 = var7; + boolean var14 = false; + } else { + var9 = var0.charAt(var5++); + } + + char var10; + if (var8 != 0) { + var10 = var8; + boolean var15 = false; + } else { + var10 = var1.charAt(var6++); + } + + var7 = WorldMapSectionType.method296(var9); + var8 = WorldMapSectionType.method296(var10); + var9 = class80.standardizeChar(var9, var2); + var10 = class80.standardizeChar(var10, var2); + if (var10 != var9 && Character.toUpperCase(var9) != Character.toUpperCase(var10)) { + var9 = Character.toLowerCase(var9); + var10 = Character.toLowerCase(var10); + if (var10 != var9) { + return ScriptEvent.lowercaseChar(var9, var2) - ScriptEvent.lowercaseChar(var10, var2); + } + } + } + + int var16 = Math.min(var3, var4); + + char var12; + int var17; + for (var17 = 0; var17 < var16; ++var17) { + if (var2 == Language.Language_FR) { + var5 = var3 - 1 - var17; + var6 = var4 - 1 - var17; + } else { + var6 = var17; + var5 = var17; + } + + char var11 = var0.charAt(var5); + var12 = var1.charAt(var6); + if (var11 != var12 && Character.toUpperCase(var11) != Character.toUpperCase(var12)) { + var11 = Character.toLowerCase(var11); + var12 = Character.toLowerCase(var12); + if (var11 != var12) { + return ScriptEvent.lowercaseChar(var11, var2) - ScriptEvent.lowercaseChar(var12, var2); + } + } + } + + var17 = var3 - var4; + if (var17 != 0) { + return var17; + } else { + for (int var18 = 0; var18 < var16; ++var18) { + var12 = var0.charAt(var18); + char var13 = var1.charAt(var18); + if (var12 != var13) { + return ScriptEvent.lowercaseChar(var12, var2) - ScriptEvent.lowercaseChar(var13, var2); + } + } + + return 0; + } + } + + @ObfuscatedName("ay") + @ObfuscatedSignature( + signature = "(ILcj;ZB)I", + garbageValue = "1" + ) + static int method4296(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.WORLDLIST_FETCH) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class43.loadWorlds() ? 1 : 0; + return 1; + } else { + World var3; + if (var0 == ScriptOpcodes.WORLDLIST_START) { + var3 = WorldMapData_0.worldListStart(); + if (var3 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.id; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.properties; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.activity; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.location; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.population; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.host; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDLIST_NEXT) { + var3 = class1.getNextWorldListWorld(); + if (var3 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.id; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.properties; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.activity; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.location; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.population; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.host; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else { + World var4; + int var5; + int var7; + if (var0 == ScriptOpcodes.WORLDLIST_SPECIFIC) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var4 = null; + + for (var5 = 0; var5 < World.World_count; ++var5) { + if (var7 == Username.World_worlds[var5].id) { + var4 = Username.World_worlds[var5]; + break; + } + } + + if (var4 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.id; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.properties; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var4.activity; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.location; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.population; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var4.host; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDLIST_SORT) { + Interpreter.Interpreter_intStackSize -= 4; + var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + boolean var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; + var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + boolean var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3] == 1; + class96.sortWorldList(var7, var10, var5, var6); + return 1; + } else if (var0 != ScriptOpcodes.GETWORLDINFO) { + if (var0 == ScriptOpcodes.SETFOLLOWEROPSLOWPRIORITY) { + Client.followerOpsLowPriority = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else { + int var8; + ParamDefinition var9; + if (var0 == ScriptOpcodes.NC_PARAM) { + Interpreter.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var9 = class162.getParamDefinition(var8); + if (var9.isString()) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = SecureRandomCallable.getNpcDefinition(var7).getStringParam(var8, var9.defaultStr); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = SecureRandomCallable.getNpcDefinition(var7).getIntParam(var8, var9.defaultInt); + } + + return 1; + } else if (var0 == ScriptOpcodes.LC_PARAM) { + Interpreter.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var9 = class162.getParamDefinition(var8); + if (var9.isString()) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = WorldMapDecorationType.getObjectDefinition(var7).getStringParam(var8, var9.defaultStr); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapDecorationType.getObjectDefinition(var7).getIntParam(var8, var9.defaultInt); + } + + return 1; + } else if (var0 == ScriptOpcodes.OC_PARAM) { + Interpreter.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var9 = class162.getParamDefinition(var8); + if (var9.isString()) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = class222.ItemDefinition_get(var7).getStringParam(var8, var9.defaultStr); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class222.ItemDefinition_get(var7).getIntParam(var8, var9.defaultInt); + } + + return 1; + } else if (var0 == ScriptOpcodes.STRUCT_PARAM) { + Interpreter.Interpreter_intStackSize -= 2; + var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var9 = class162.getParamDefinition(var8); + if (var9.isString()) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = GrandExchangeOfferOwnWorldComparator.StructDefinition_getStructDefinition(var7).getStringParam(var8, var9.defaultStr); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = GrandExchangeOfferOwnWorldComparator.StructDefinition_getStructDefinition(var7).getIntParam(var8, var9.defaultInt); + } + + return 1; + } else if (var0 == ScriptOpcodes.ON_MOBILE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.onMobile ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CLIENTTYPE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.clientType & 3; + return 1; + } else if (var0 == 6520) { + return 1; + } else if (var0 == ScriptOpcodes.MOBILE_KEYBOARDHIDE) { + return 1; + } else if (var0 == 6522) { + --WorldMapDecoration.Interpreter_stringStackSize; + --Interpreter.Interpreter_intStackSize; + return 1; + } else if (var0 == 6523) { + --WorldMapDecoration.Interpreter_stringStackSize; + --Interpreter.Interpreter_intStackSize; + return 1; + } else if (var0 == ScriptOpcodes.BATTERYLEVEL) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + return 1; + } else if (var0 == ScriptOpcodes.BATTERYCHARGING) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + return 1; + } else if (var0 == ScriptOpcodes.WIFIAVAILABLE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + return 1; + } else { + return 2; + } + } + } else { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var7 >= 0 && var7 < World.World_count) { + var4 = Username.World_worlds[var7]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.id; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.properties; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var4.activity; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.location; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.population; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var4.host; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } + } + } + } + + @ObfuscatedName("ix") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;Ljava/lang/String;IIIIZI)V", + garbageValue = "-128903403" + ) + @Export("insertMenuItem") + static final void insertMenuItem(String var0, String var1, int var2, int var3, int var4, int var5, boolean var6) { + if (!Client.isMenuOpen) { + if (Client.menuOptionsCount < 500) { + Client.menuActions[Client.menuOptionsCount] = var0; + Client.menuTargets[Client.menuOptionsCount] = var1; + Client.menuOpcodes[Client.menuOptionsCount] = var2; + Client.menuIdentifiers[Client.menuOptionsCount] = var3; + Client.menuArguments1[Client.menuOptionsCount] = var4; + Client.menuArguments2[Client.menuOptionsCount] = var5; + Client.menuShiftClick[Client.menuOptionsCount] = var6; + ++Client.menuOptionsCount; + } + + } + } + + @ObfuscatedName("kf") + @ObfuscatedSignature( + signature = "(Lhi;I)V", + garbageValue = "774063316" + ) + static final void method4297(Widget var0) { + int var1 = var0.contentType; + if (var1 == 324) { + if (Client.field818 == -1) { + Client.field818 = var0.spriteId2; + Client.field896 = var0.spriteId; + } + + if (Client.playerAppearance.isFemale) { + var0.spriteId2 = Client.field818; + } else { + var0.spriteId2 = Client.field896; + } + + } else if (var1 == 325) { + if (Client.field818 == -1) { + Client.field818 = var0.spriteId2; + Client.field896 = var0.spriteId; + } + + if (Client.playerAppearance.isFemale) { + var0.spriteId2 = Client.field896; + } else { + var0.spriteId2 = Client.field818; + } + + } else if (var1 == 327) { + var0.modelAngleX = 150; + var0.modelAngleY = (int)(Math.sin((double)Client.cycle / 40.0D) * 256.0D) & 2047; + var0.modelType = 5; + var0.modelId = 0; + } else if (var1 == 328) { + var0.modelAngleX = 150; + var0.modelAngleY = (int)(Math.sin((double)Client.cycle / 40.0D) * 256.0D) & 2047; + var0.modelType = 5; + var0.modelId = 1; + } + } } diff --git a/runescape-client/src/main/java/ArchiveDiskActionHandler.java b/runescape-client/src/main/java/ArchiveDiskActionHandler.java index c614d041f9..f64245e11c 100644 --- a/runescape-client/src/main/java/ArchiveDiskActionHandler.java +++ b/runescape-client/src/main/java/ArchiveDiskActionHandler.java @@ -4,34 +4,53 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ih") +@ObfuscatedName("ig") @Implements("ArchiveDiskActionHandler") public class ArchiveDiskActionHandler implements Runnable { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("ArchiveDiskActionHandler_requestQueue") public static NodeDeque ArchiveDiskActionHandler_requestQueue; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("ArchiveDiskActionHandler_responseQueue") public static NodeDeque ArchiveDiskActionHandler_responseQueue; - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1320379029 + intValue = -2025054069 ) - static int field3127; - @ObfuscatedName("u") + static int field3132; + @ObfuscatedName("v") @Export("ArchiveDiskActionHandler_lock") static Object ArchiveDiskActionHandler_lock; + @ObfuscatedName("l") + @Export("ArchiveDiskActionHandler_thread") + static Thread ArchiveDiskActionHandler_thread; + @ObfuscatedName("c") + @ObfuscatedGetter( + intValue = 1867272823 + ) + static int field3133; + @ObfuscatedName("dr") + @ObfuscatedGetter( + longValue = -4581696908763214333L + ) + static long field3130; + @ObfuscatedName("fk") + @ObfuscatedSignature( + signature = "Lks;" + ) + @Export("fontPlain12") + static Font fontPlain12; static { ArchiveDiskActionHandler_requestQueue = new NodeDeque(); ArchiveDiskActionHandler_responseQueue = new NodeDeque(); - field3127 = 0; + field3132 = 0; ArchiveDiskActionHandler_lock = new Object(); } @@ -60,50 +79,29 @@ public class ArchiveDiskActionHandler implements Runnable { } synchronized(ArchiveDiskActionHandler_lock) { - if (field3127 <= 1) { - field3127 = 0; + if (field3132 <= 1) { + field3132 = 0; ArchiveDiskActionHandler_lock.notifyAll(); return; } - field3127 = 600; + field3132 = 600; } } else { - long var8 = 99L; - - try { - Thread.sleep(var8); - } catch (InterruptedException var15) { - } - - try { - Thread.sleep(1L); - } catch (InterruptedException var14) { - } - + ClanChat.method5367(100L); synchronized(ArchiveDiskActionHandler_lock) { - if (field3127 <= 1) { - field3127 = 0; + if (field3132 <= 1) { + field3132 = 0; ArchiveDiskActionHandler_lock.notifyAll(); return; } - --field3127; + --field3132; } } } - } catch (Exception var17) { - class32.RunException_sendStackTrace((String)null, var17); + } catch (Exception var13) { + User.RunException_sendStackTrace((String)null, var13); } } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;ZZB)V", - garbageValue = "10" - ) - @Export("openURL") - public static void openURL(String var0, boolean var1, boolean var2) { - WorldMapID.method568(var0, var1, "openjs", var2); - } } diff --git a/runescape-client/src/main/java/ArchiveLoader.java b/runescape-client/src/main/java/ArchiveLoader.java index 1d80c6aa31..1780bdd426 100644 --- a/runescape-client/src/main/java/ArchiveLoader.java +++ b/runescape-client/src/main/java/ArchiveLoader.java @@ -3,43 +3,44 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bs") +@ObfuscatedName("bh") @Implements("ArchiveLoader") public class ArchiveLoader { @ObfuscatedName("c") - @Export("Tiles_saturation") - static int[] Tiles_saturation; - @ObfuscatedName("bz") - @ObfuscatedSignature( - signature = "[Llf;" + @ObfuscatedGetter( + intValue = 1109035575 ) - @Export("worldSelectBackSprites") - static Sprite[] worldSelectBackSprites; - @ObfuscatedName("gi") - @Export("regionMapArchives") - static byte[][] regionMapArchives; - @ObfuscatedName("n") + @Export("gameCyclesToDo") + static int gameCyclesToDo; + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Lie;" + signature = "[Lmz;" + ) + @Export("JagexCache_idxFiles") + public static BufferedFile[] JagexCache_idxFiles; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lij;" ) @Export("archive") final Archive archive; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1526719037 + intValue = -1458094845 ) @Export("groupCount") final int groupCount; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 966789861 + intValue = 1936388269 ) @Export("loadedCount") int loadedCount; @ObfuscatedSignature( - signature = "(Lie;Ljava/lang/String;)V" + signature = "(Lij;Ljava/lang/String;)V" ) ArchiveLoader(Archive var1, String var2) { this.loadedCount = 0; @@ -47,17 +48,17 @@ public class ArchiveLoader { this.groupCount = var1.getGroupCount(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "1969120013" + garbageValue = "2053388584" ) @Export("isLoaded") boolean isLoaded() { this.loadedCount = 0; for (int var1 = 0; var1 < this.groupCount; ++var1) { - if (!this.archive.method4244(var1) || this.archive.method4243(var1)) { + if (!this.archive.method4436(var1) || this.archive.method4417(var1)) { ++this.loadedCount; } } @@ -65,58 +66,822 @@ public class ArchiveLoader { return this.loadedCount >= this.groupCount; } - @ObfuscatedName("u") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "-238840199" + signature = "(II)Z", + garbageValue = "145350821" ) - public static int method1173(int var0) { - return class32.method578(ViewportMouse.ViewportMouse_entityTags[var0]); + public static boolean method1239(int var0) { + return var0 == WorldMapDecorationType.field2723.id; } - @ObfuscatedName("p") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lbo;Lbo;IZIZB)I", - garbageValue = "7" + signature = "(III)I", + garbageValue = "-1915313873" ) - static int method1174(World var0, World var1, int var2, boolean var3, int var4, boolean var5) { - int var6 = UserComparator7.compareWorlds(var0, var1, var2, var3); - if (var6 != 0) { - return var3 ? -var6 : var6; - } else if (var4 == -1) { - return 0; + static int method1237(int var0, int var1) { + if (var0 == -2) { + return 12345678; + } else if (var0 == -1) { + if (var1 < 0) { + var1 = 0; + } else if (var1 > 127) { + var1 = 127; + } + + var1 = 127 - var1; + return var1; } else { - int var7 = UserComparator7.compareWorlds(var0, var1, var4, var5); - return var5 ? -var7 : var7; + var1 = (var0 & 127) * var1 / 128; + if (var1 < 2) { + var1 = 2; + } else if (var1 > 126) { + var1 = 126; + } + + return (var0 & 65408) + var1; + } + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;I)V", + garbageValue = "1291572583" + ) + public static void method1235(AbstractArchive var0) { + FloorOverlayDefinition.FloorOverlayDefinition_archive = var0; + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lkf;B)V", + garbageValue = "49" + ) + @Export("updatePlayer") + static final void updatePlayer(PacketBuffer var0) { + var0.importIndex(); + int var1 = Client.localPlayerIndex; + Player var2 = class215.localPlayer = Client.players[var1] = new Player(); + var2.index = var1; + int var3 = var0.readBits(30); + byte var4 = (byte)(var3 >> 28); + int var5 = var3 >> 14 & 16383; + int var6 = var3 & 16383; + var2.pathX[0] = var5 - UserComparator8.baseX * 64; + var2.x = (var2.pathX[0] << 7) + (var2.transformedSize() << 6); + var2.pathY[0] = var6 - HealthBar.baseY * 64; + var2.y = (var2.pathY[0] << 7) + (var2.transformedSize() << 6); + Player.Scene_plane = var2.plane = var4; + if (Players.field1229[var1] != null) { + var2.read(Players.field1229[var1]); + } + + Players.Players_count = 0; + Players.Players_indices[++Players.Players_count - 1] = var1; + Players.field1227[var1] = 0; + Players.Players_emptyIdxCount = 0; + + for (int var7 = 1; var7 < 2048; ++var7) { + if (var1 != var7) { + int var8 = var0.readBits(18); + int var9 = var8 >> 16; + int var10 = var8 >> 8 & 597; + int var11 = var8 & 597; + Players.Players_regions[var7] = (var10 << 14) + var11 + (var9 << 28); + Players.Players_orientations[var7] = 0; + Players.Players_targetIndices[var7] = -1; + Players.Players_emptyIndices[++Players.Players_emptyIdxCount - 1] = var7; + Players.field1227[var7] = 0; + } + } + + var0.exportIndex(); + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(IIII)I", + garbageValue = "-561019342" + ) + static int method1230(int var0, int var1, int var2) { + if (var2 > 179) { + var1 /= 2; + } + + if (var2 > 192) { + var1 /= 2; + } + + if (var2 > 217) { + var1 /= 2; + } + + if (var2 > 243) { + var1 /= 2; + } + + int var3 = (var1 / 32 << 7) + (var0 / 4 << 10) + var2 / 2; + return var3; + } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(IIB)Lhi;", + garbageValue = "-102" + ) + @Export("getWidgetChild") + public static Widget getWidgetChild(int var0, int var1) { + Widget var2 = PacketBufferNode.getWidget(var0); + if (var1 == -1) { + return var2; + } else { + return var2 != null && var2.children != null && var1 < var2.children.length ? var2.children[var1] : null; } } @ObfuscatedName("q") @ObfuscatedSignature( - signature = "([BIIB)Ljava/lang/String;", - garbageValue = "-113" + signature = "(Lkc;II)Ljava/lang/String;", + garbageValue = "1190041961" ) - @Export("decodeStringCp1252") - public static String decodeStringCp1252(byte[] var0, int var1, int var2) { - char[] var3 = new char[var2]; - int var4 = 0; + static String method1234(Buffer var0, int var1) { + try { + int var2 = var0.readUShortSmart(); + if (var2 > var1) { + var2 = var1; + } - for (int var5 = 0; var5 < var2; ++var5) { - int var6 = var0[var5 + var1] & 255; - if (var6 != 0) { - if (var6 >= 128 && var6 < 160) { - char var7 = class287.cp1252AsciiExtension[var6 - 128]; - if (var7 == 0) { - var7 = '?'; - } + byte[] var3 = new byte[var2]; + var0.offset += class210.huffman.decompress(var0.array, var0.offset, var3, 0, var2); + String var4 = class160.decodeStringCp1252(var3, 0, var2); + return var4; + } catch (Exception var6) { + return "Cabbage"; + } + } - var6 = var7; + @ObfuscatedName("w") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;II)V", + garbageValue = "2071952148" + ) + static final void method1242(String var0, int var1) { + PacketBufferNode var2 = SoundSystem.getPacketBufferNode(ClientPacket.field2246, Client.packetWriter.isaacCipher); + var2.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var0) + 1); + var2.packetBuffer.writeStringCp1252NullTerminated(var0); + var2.packetBuffer.method5634(var1); + Client.packetWriter.addNode(var2); + } + + @ObfuscatedName("ax") + @ObfuscatedSignature( + signature = "([BI)[B", + garbageValue = "-79197837" + ) + @Export("decompressBytes") + static final byte[] decompressBytes(byte[] var0) { + Buffer var1 = new Buffer(var0); + int var2 = var1.readUnsignedByte(); + int var3 = var1.readInt(); + if (var3 < 0 || AbstractArchive.field3128 != 0 && var3 > AbstractArchive.field3128) { + throw new RuntimeException(); + } else if (var2 == 0) { + byte[] var4 = new byte[var3]; + var1.readBytes(var4, 0, var3); + return var4; + } else { + int var6 = var1.readInt(); + if (var6 < 0 || AbstractArchive.field3128 != 0 && var6 > AbstractArchive.field3128) { + throw new RuntimeException(); + } else { + byte[] var5 = new byte[var6]; + if (var2 == 1) { + BZip2Decompressor.BZip2Decompressor_decompress(var5, var6, var0, var3, 9); + } else { + AbstractArchive.gzipDecompressor.decompress(var1, var5); } - var3[var4++] = (char)var6; + return var5; + } + } + } + + @ObfuscatedName("aj") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "1460957872" + ) + static int method1245(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.GETWINDOWMODE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WallDecoration.getWindowedMode(); + return 1; + } else { + int var3; + if (var0 == ScriptOpcodes.SETWINDOWMODE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var3 == 1 || var3 == 2) { + FontName.setWindowedMode(var3); + } + + return 1; + } else if (var0 == ScriptOpcodes.GETDEFAULTWINDOWMODE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ScriptEvent.clientPreferences.windowMode; + return 1; + } else if (var0 != ScriptOpcodes.SETDEFAULTWINDOWMODE) { + if (var0 == 5310) { + --Interpreter.Interpreter_intStackSize; + return 1; + } else { + return 2; + } + } else { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var3 == 1 || var3 == 2) { + ScriptEvent.clientPreferences.windowMode = var3; + HitSplatDefinition.savePreferences(); + } + + return 1; + } + } + } + + @ObfuscatedName("jg") + @ObfuscatedSignature( + signature = "(IIIIIB)V", + garbageValue = "-34" + ) + @Export("drawScrollBar") + static final void drawScrollBar(int var0, int var1, int var2, int var3, int var4) { + NetSocket.scrollBarSprites[0].drawAt(var0, var1); + NetSocket.scrollBarSprites[1].drawAt(var0, var3 + var1 - 16); + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1 + 16, 16, var3 - 32, Client.field895); + int var5 = var3 * (var3 - 32) / var4; + if (var5 < 8) { + var5 = 8; + } + + int var6 = (var3 - 32 - var5) * var2 / (var4 - var3); + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var6 + var1 + 16, 16, var5, Client.field661); + Rasterizer2D.Rasterizer2D_drawVerticalLine(var0, var6 + var1 + 16, var5, Client.field790); + Rasterizer2D.Rasterizer2D_drawVerticalLine(var0 + 1, var6 + var1 + 16, var5, Client.field790); + Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0, var6 + var1 + 16, 16, Client.field790); + Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0, var6 + var1 + 17, 16, Client.field790); + Rasterizer2D.Rasterizer2D_drawVerticalLine(var0 + 15, var6 + var1 + 16, var5, Client.field683); + Rasterizer2D.Rasterizer2D_drawVerticalLine(var0 + 14, var6 + var1 + 17, var5 - 1, Client.field683); + Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0, var6 + var5 + var1 + 15, 16, Client.field683); + Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0 + 1, var5 + var6 + var1 + 14, 15, Client.field683); + } + + @ObfuscatedName("jf") + @ObfuscatedSignature( + signature = "([Lhi;IIIIIIII)V", + garbageValue = "-954572124" + ) + @Export("updateInterface") + static final void updateInterface(Widget[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { + for (int var8 = 0; var8 < var0.length; ++var8) { + Widget var9 = var0[var8]; + if (var9 != null && var9.parentId == var1 && (!var9.isIf3 || var9.type == 0 || var9.hasListener || class195.getWidgetClickMask(var9) != 0 || var9 == Client.clickedWidgetParent || var9.contentType == 1338)) { + if (var9.isIf3) { + if (WorldMapManager.isComponentHidden(var9)) { + continue; + } + } else if (var9.type == 0 && var9 != ChatChannel.mousedOverWidgetIf1 && WorldMapManager.isComponentHidden(var9)) { + continue; + } + + int var10 = var9.x + var6; + int var11 = var7 + var9.y; + int var12; + int var13; + int var14; + int var15; + int var17; + int var18; + if (var9.type == 2) { + var12 = var2; + var13 = var3; + var14 = var4; + var15 = var5; + } else { + int var16; + if (var9.type == 9) { + var16 = var10; + var17 = var11; + var18 = var10 + var9.width; + int var19 = var11 + var9.height; + if (var18 < var10) { + var16 = var18; + var18 = var10; + } + + if (var19 < var11) { + var17 = var19; + var19 = var11; + } + + ++var18; + ++var19; + var12 = var16 > var2 ? var16 : var2; + var13 = var17 > var3 ? var17 : var3; + var14 = var18 < var4 ? var18 : var4; + var15 = var19 < var5 ? var19 : var5; + } else { + var16 = var10 + var9.width; + var17 = var11 + var9.height; + var12 = var10 > var2 ? var10 : var2; + var13 = var11 > var3 ? var11 : var3; + var14 = var16 < var4 ? var16 : var4; + var15 = var17 < var5 ? var17 : var5; + } + } + + if (var9 == Client.clickedWidget) { + Client.field695 = true; + Client.field846 = var10; + Client.field814 = var11; + } + + boolean var32 = false; + if (var9.field2606) { + switch(Client.field828) { + case 0: + var32 = true; + case 1: + default: + break; + case 2: + if (Client.field794 == var9.id >>> 16) { + var32 = true; + } + break; + case 3: + if (var9.id == Client.field794) { + var32 = true; + } + } + } + + if (var32 || !var9.isIf3 || var12 < var14 && var13 < var15) { + if (var9.isIf3) { + ScriptEvent var26; + if (var9.noClickThrough) { + if (MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { + for (var26 = (ScriptEvent)Client.scriptEvents.last(); var26 != null; var26 = (ScriptEvent)Client.scriptEvents.previous()) { + if (var26.isMouseInputEvent) { + var26.remove(); + var26.widget.containsMouse = false; + } + } + + if (FloorDecoration.widgetDragDuration == 0) { + Client.clickedWidget = null; + Client.clickedWidgetParent = null; + } + + if (!Client.isMenuOpen) { + ClientPacket.addCancelMenuEntry(); + } + } + } else if (var9.noScrollThrough && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { + for (var26 = (ScriptEvent)Client.scriptEvents.last(); var26 != null; var26 = (ScriptEvent)Client.scriptEvents.previous()) { + if (var26.isMouseInputEvent && var26.widget.onScroll == var26.args) { + var26.remove(); + } + } + } + } + + var17 = MouseHandler.MouseHandler_x; + var18 = MouseHandler.MouseHandler_y; + if (MouseHandler.MouseHandler_lastButton != 0) { + var17 = MouseHandler.MouseHandler_lastPressedX; + var18 = MouseHandler.MouseHandler_lastPressedY; + } + + boolean var33 = var17 >= var12 && var18 >= var13 && var17 < var14 && var18 < var15; + if (var9.contentType == 1337) { + if (!Client.isLoading && !Client.isMenuOpen && var33) { + GrandExchangeOfferNameComparator.addSceneMenuOptions(var17, var18, var12, var13); + } + } else if (var9.contentType == 1338) { + WorldMapIcon_1.checkIfMinimapClicked(var9, var10, var11); + } else { + if (var9.contentType == 1400) { + Login.worldMap.onCycle(MouseHandler.MouseHandler_x, MouseHandler.MouseHandler_y, var33, var10, var11, var9.width, var9.height); + } + + if (!Client.isMenuOpen && var33) { + if (var9.contentType == 1400) { + Login.worldMap.addElementMenuOptions(var10, var11, var9.width, var9.height, var17, var18); + } else { + class80.method2197(var9, var17 - var10, var18 - var11); + } + } + + boolean var21; + int var23; + if (var32) { + for (int var20 = 0; var20 < var9.field2623.length; ++var20) { + var21 = false; + boolean var22 = false; + if (!var21 && var9.field2623[var20] != null) { + for (var23 = 0; var23 < var9.field2623[var20].length; ++var23) { + boolean var24 = false; + if (var9.field2627 != null) { + var24 = KeyHandler.KeyHandler_pressedKeys[var9.field2623[var20][var23]]; + } + + if (Frames.method3400(var9.field2623[var20][var23]) || var24) { + var21 = true; + if (var9.field2627 != null && var9.field2627[var20] > Client.cycle) { + break; + } + + byte var25 = var9.field2624[var20][var23]; + if (var25 == 0 || ((var25 & 8) == 0 || !KeyHandler.KeyHandler_pressedKeys[86] && !KeyHandler.KeyHandler_pressedKeys[82] && !KeyHandler.KeyHandler_pressedKeys[81]) && ((var25 & 2) == 0 || KeyHandler.KeyHandler_pressedKeys[86]) && ((var25 & 1) == 0 || KeyHandler.KeyHandler_pressedKeys[82]) && ((var25 & 4) == 0 || KeyHandler.KeyHandler_pressedKeys[81])) { + var22 = true; + break; + } + } + } + } + + if (var22) { + if (var20 < 10) { + class287.widgetDefaultMenuAction(var20 + 1, var9.id, var9.childIndex, var9.itemId, ""); + } else if (var20 == 10) { + InterfaceParent.Widget_runOnTargetLeave(); + class51.selectSpell(var9.id, var9.childIndex, UserComparator5.method3551(class195.getWidgetClickMask(var9)), var9.itemId); + Client.selectedSpellActionName = SoundCache.method2666(var9); + if (Client.selectedSpellActionName == null) { + Client.selectedSpellActionName = "null"; + } + + Client.selectedSpellName = var9.dataText + AbstractArchive.colorStartTag(16777215); + } + + var23 = var9.field2628[var20]; + if (var9.field2627 == null) { + var9.field2627 = new int[var9.field2623.length]; + } + + if (var9.field2626 == null) { + var9.field2626 = new int[var9.field2623.length]; + } + + if (var23 != 0) { + if (var9.field2627[var20] == 0) { + var9.field2627[var20] = var23 + Client.cycle + var9.field2626[var20]; + } else { + var9.field2627[var20] = var23 + Client.cycle; + } + } else { + var9.field2627[var20] = Integer.MAX_VALUE; + } + } + + if (!var21 && var9.field2627 != null) { + var9.field2627[var20] = 0; + } + } + } + + if (var9.isIf3) { + if (MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { + var33 = true; + } else { + var33 = false; + } + + boolean var34 = false; + if ((MouseHandler.MouseHandler_currentButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_currentButton == 4) && var33) { + var34 = true; + } + + var21 = false; + if ((MouseHandler.MouseHandler_lastButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= var12 && MouseHandler.MouseHandler_lastPressedY >= var13 && MouseHandler.MouseHandler_lastPressedX < var14 && MouseHandler.MouseHandler_lastPressedY < var15) { + var21 = true; + } + + if (var21) { + class4.clickWidget(var9, MouseHandler.MouseHandler_lastPressedX - var10, MouseHandler.MouseHandler_lastPressedY - var11); + } + + if (var9.contentType == 1400) { + Login.worldMap.method6429(var17, var18, var33 & var34, var33 & var21); + } + + if (Client.clickedWidget != null && var9 != Client.clickedWidget && var33 && TextureProvider.method2931(class195.getWidgetClickMask(var9))) { + Client.draggedOnWidget = var9; + } + + if (var9 == Client.clickedWidgetParent) { + Client.field809 = true; + Client.field748 = var10; + Client.field751 = var11; + } + + if (var9.hasListener) { + ScriptEvent var29; + if (var33 && Client.mouseWheelRotation != 0 && var9.onScroll != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseY = Client.mouseWheelRotation; + var29.args = var9.onScroll; + Client.scriptEvents.addFirst(var29); + } + + if (Client.clickedWidget != null || GrandExchangeOffer.dragInventoryWidget != null || Client.isMenuOpen) { + var21 = false; + var34 = false; + var33 = false; + } + + if (!var9.isClicked && var21) { + var9.isClicked = true; + if (var9.onClick != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_lastPressedX - var10; + var29.mouseY = MouseHandler.MouseHandler_lastPressedY - var11; + var29.args = var9.onClick; + Client.scriptEvents.addFirst(var29); + } + } + + if (var9.isClicked && var34 && var9.onClickRepeat != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_x - var10; + var29.mouseY = MouseHandler.MouseHandler_y - var11; + var29.args = var9.onClickRepeat; + Client.scriptEvents.addFirst(var29); + } + + if (var9.isClicked && !var34) { + var9.isClicked = false; + if (var9.onRelease != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_x - var10; + var29.mouseY = MouseHandler.MouseHandler_y - var11; + var29.args = var9.onRelease; + Client.field832.addFirst(var29); + } + } + + if (var34 && var9.onHold != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_x - var10; + var29.mouseY = MouseHandler.MouseHandler_y - var11; + var29.args = var9.onHold; + Client.scriptEvents.addFirst(var29); + } + + if (!var9.containsMouse && var33) { + var9.containsMouse = true; + if (var9.onMouseOver != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_x - var10; + var29.mouseY = MouseHandler.MouseHandler_y - var11; + var29.args = var9.onMouseOver; + Client.scriptEvents.addFirst(var29); + } + } + + if (var9.containsMouse && var33 && var9.onMouseRepeat != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_x - var10; + var29.mouseY = MouseHandler.MouseHandler_y - var11; + var29.args = var9.onMouseRepeat; + Client.scriptEvents.addFirst(var29); + } + + if (var9.containsMouse && !var33) { + var9.containsMouse = false; + if (var9.onMouseLeave != null) { + var29 = new ScriptEvent(); + var29.isMouseInputEvent = true; + var29.widget = var9; + var29.mouseX = MouseHandler.MouseHandler_x - var10; + var29.mouseY = MouseHandler.MouseHandler_y - var11; + var29.args = var9.onMouseLeave; + Client.field832.addFirst(var29); + } + } + + if (var9.onTimer != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onTimer; + Client.field813.addFirst(var29); + } + + ScriptEvent var30; + int var35; + int var36; + if (var9.onVarTransmit != null && Client.field679 > var9.field2644) { + if (var9.varTransmitTriggers != null && Client.field679 - var9.field2644 <= 32) { + label886: + for (var35 = var9.field2644; var35 < Client.field679; ++var35) { + var23 = Client.field817[var35 & 31]; + + for (var36 = 0; var36 < var9.varTransmitTriggers.length; ++var36) { + if (var23 == var9.varTransmitTriggers[var36]) { + var30 = new ScriptEvent(); + var30.widget = var9; + var30.args = var9.onVarTransmit; + Client.scriptEvents.addFirst(var30); + break label886; + } + } + } + } else { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onVarTransmit; + Client.scriptEvents.addFirst(var29); + } + + var9.field2644 = Client.field679; + } + + if (var9.onInvTransmit != null && Client.field820 > var9.field2567) { + if (var9.invTransmitTriggers != null && Client.field820 - var9.field2567 <= 32) { + label862: + for (var35 = var9.field2567; var35 < Client.field820; ++var35) { + var23 = Client.field816[var35 & 31]; + + for (var36 = 0; var36 < var9.invTransmitTriggers.length; ++var36) { + if (var23 == var9.invTransmitTriggers[var36]) { + var30 = new ScriptEvent(); + var30.widget = var9; + var30.args = var9.onInvTransmit; + Client.scriptEvents.addFirst(var30); + break label862; + } + } + } + } else { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onInvTransmit; + Client.scriptEvents.addFirst(var29); + } + + var9.field2567 = Client.field820; + } + + if (var9.onStatTransmit != null && Client.changedSkillsCount > var9.field2684) { + if (var9.statTransmitTriggers != null && Client.changedSkillsCount - var9.field2684 <= 32) { + label838: + for (var35 = var9.field2684; var35 < Client.changedSkillsCount; ++var35) { + var23 = Client.changedSkills[var35 & 31]; + + for (var36 = 0; var36 < var9.statTransmitTriggers.length; ++var36) { + if (var23 == var9.statTransmitTriggers[var36]) { + var30 = new ScriptEvent(); + var30.widget = var9; + var30.args = var9.onStatTransmit; + Client.scriptEvents.addFirst(var30); + break label838; + } + } + } + } else { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onStatTransmit; + Client.scriptEvents.addFirst(var29); + } + + var9.field2684 = Client.changedSkillsCount; + } + + if (Client.chatCycle > var9.field2681 && var9.onChatTransmit != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onChatTransmit; + Client.scriptEvents.addFirst(var29); + } + + if (Client.field824 > var9.field2681 && var9.onFriendTransmit != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onFriendTransmit; + Client.scriptEvents.addFirst(var29); + } + + if (Client.field825 > var9.field2681 && var9.onClanTransmit != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onClanTransmit; + Client.scriptEvents.addFirst(var29); + } + + if (Client.field826 > var9.field2681 && var9.onStockTransmit != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onStockTransmit; + Client.scriptEvents.addFirst(var29); + } + + if (Client.field652 > var9.field2681 && var9.field2665 != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.field2665; + Client.scriptEvents.addFirst(var29); + } + + if (Client.field834 > var9.field2681 && var9.onMiscTransmit != null) { + var29 = new ScriptEvent(); + var29.widget = var9; + var29.args = var9.onMiscTransmit; + Client.scriptEvents.addFirst(var29); + } + + var9.field2681 = Client.cycleCntr; + if (var9.onKey != null) { + for (var35 = 0; var35 < Client.field866; ++var35) { + ScriptEvent var31 = new ScriptEvent(); + var31.widget = var9; + var31.keyTyped = Client.field854[var35]; + var31.keyPressed = Client.field853[var35]; + var31.args = var9.onKey; + Client.scriptEvents.addFirst(var31); + } + } + } + } + + if (!var9.isIf3) { + if (Client.clickedWidget != null || GrandExchangeOffer.dragInventoryWidget != null || Client.isMenuOpen) { + continue; + } + + if ((var9.mouseOverRedirect >= 0 || var9.mouseOverColor != 0) && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { + if (var9.mouseOverRedirect >= 0) { + ChatChannel.mousedOverWidgetIf1 = var0[var9.mouseOverRedirect]; + } else { + ChatChannel.mousedOverWidgetIf1 = var9; + } + } + + if (var9.type == 8 && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { + GrandExchangeEvents.field39 = var9; + } + + if (var9.scrollHeight > var9.height) { + GrandExchangeOfferOwnWorldComparator.method1389(var9, var10 + var9.width, var11, var9.height, var9.scrollHeight, MouseHandler.MouseHandler_x, MouseHandler.MouseHandler_y); + } + } + + if (var9.type == 0) { + updateInterface(var0, var9.id, var12, var13, var14, var15, var10 - var9.scrollX, var11 - var9.scrollY); + if (var9.children != null) { + updateInterface(var9.children, var9.id, var12, var13, var14, var15, var10 - var9.scrollX, var11 - var9.scrollY); + } + + InterfaceParent var27 = (InterfaceParent)Client.interfaceParents.get((long)var9.id); + if (var27 != null) { + if (var27.type == 0 && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15 && !Client.isMenuOpen) { + for (ScriptEvent var28 = (ScriptEvent)Client.scriptEvents.last(); var28 != null; var28 = (ScriptEvent)Client.scriptEvents.previous()) { + if (var28.isMouseInputEvent) { + var28.remove(); + var28.widget.containsMouse = false; + } + } + + if (FloorDecoration.widgetDragDuration == 0) { + Client.clickedWidget = null; + Client.clickedWidgetParent = null; + } + + if (!Client.isMenuOpen) { + ClientPacket.addCancelMenuEntry(); + } + } + + ServerBuild.updateRootInterface(var27.group, var12, var13, var14, var15, var10, var11); + } + } + } + } } } - return new String(var3, 0, var4); } } diff --git a/runescape-client/src/main/java/AttackOption.java b/runescape-client/src/main/java/AttackOption.java index 9ee68f2e7d..8512fa12af 100644 --- a/runescape-client/src/main/java/AttackOption.java +++ b/runescape-client/src/main/java/AttackOption.java @@ -1,59 +1,51 @@ -import java.security.SecureRandom; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cn") +@ObfuscatedName("cr") @Implements("AttackOption") public enum AttackOption implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lcn;" + signature = "Lcr;" ) @Export("AttackOption_dependsOnCombatLevels") AttackOption_dependsOnCombatLevels(0), - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lcn;" + signature = "Lcr;" ) @Export("AttackOption_alwaysRightClick") AttackOption_alwaysRightClick(1), - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lcn;" + signature = "Lcr;" ) @Export("AttackOption_leftClickWhereAvailable") AttackOption_leftClickWhereAvailable(2), - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lcn;" + signature = "Lcr;" ) @Export("AttackOption_hidden") AttackOption_hidden(3); - @ObfuscatedName("dw") + @ObfuscatedName("c") + @Export("SpriteBuffer_spriteHeights") + public static int[] SpriteBuffer_spriteHeights; + @ObfuscatedName("h") + public static boolean field1151; + @ObfuscatedName("fp") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lfw;" ) - @Export("archive9") - static Archive archive9; - @ObfuscatedName("gr") - @ObfuscatedSignature( - signature = "Llf;" - ) - @Export("compass") - static Sprite compass; - @ObfuscatedName("lc") + @Export("socketTask") + static Task socketTask; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 629841565 - ) - @Export("selectedSpellWidget") - static int selectedSpellWidget; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = -1814915457 + intValue = -871271379 ) @Export("id") final int id; @@ -62,107 +54,124 @@ public enum AttackOption implements Enumerated { this.id = var3; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)Ljava/security/SecureRandom;", - garbageValue = "639446581" + signature = "(Lhq;B)V", + garbageValue = "17" ) - static SecureRandom method2081() { - SecureRandom var0 = new SecureRandom(); - var0.nextInt(); - return var0; + public static void method2221(AbstractArchive var0) { + VarbitDefinition.VarbitDefinition_archive = var0; } - @ObfuscatedName("z") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkf;I)V", - garbageValue = "-379415067" + signature = "(Lhq;Lhq;ZIS)V", + garbageValue = "-32666" ) - @Export("updatePlayer") - static final void updatePlayer(PacketBuffer var0) { - var0.importIndex(); - int var1 = Client.localPlayerIndex; - Player var2 = class223.localPlayer = Client.players[var1] = new Player(); - var2.index = var1; - int var3 = var0.readBits(30); - byte var4 = (byte)(var3 >> 28); - int var5 = var3 >> 14 & 16383; - int var6 = var3 & 16383; - var2.pathX[0] = var5 - class223.baseX * 64; - var2.x = (var2.pathX[0] << 7) + (var2.transformedSize() << 6); - var2.pathY[0] = var6 - class286.baseY * 64; - var2.y = (var2.pathY[0] << 7) + (var2.transformedSize() << 6); - WorldMapRectangle.plane = var2.plane = var4; - if (Players.field1236[var1] != null) { - var2.read(Players.field1236[var1]); - } - - Players.Players_count = 0; - Players.Players_indices[++Players.Players_count - 1] = var1; - Players.field1244[var1] = 0; - Players.Players_emptyIdxCount = 0; - - for (int var7 = 1; var7 < 2048; ++var7) { - if (var1 != var7) { - int var8 = var0.readBits(18); - int var9 = var8 >> 16; - int var10 = var8 >> 8 & 597; - int var11 = var8 & 597; - Players.Players_regions[var7] = (var10 << 14) + var11 + (var9 << 28); - Players.Players_orientations[var7] = 0; - Players.Players_targetIndices[var7] = -1; - Players.Players_emptyIndices[++Players.Players_emptyIdxCount - 1] = var7; - Players.field1244[var7] = 0; - } - } - - var0.exportIndex(); - } - - @ObfuscatedName("ed") - @ObfuscatedSignature( - signature = "(IZZZI)Lie;", - garbageValue = "1568056482" - ) - @Export("newArchive") - static Archive newArchive(int var0, boolean var1, boolean var2, boolean var3) { - ArchiveDisk var4 = null; - if (JagexCache.JagexCache_dat2File != null) { - var4 = new ArchiveDisk(var0, JagexCache.JagexCache_dat2File, class189.JagexCache_idxFiles[var0], 1000000); - } - - return new Archive(var4, WorldMapData_0.masterDisk, var0, var1, var2, var3); - } - - @ObfuscatedName("hj") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;IIIIZI)V", - garbageValue = "844579626" - ) - @Export("insertMenuItem") - static final void insertMenuItem(String var0, String var1, int var2, int var3, int var4, int var5, boolean var6) { - if (!Client.isMenuOpen) { - if (Client.menuOptionsCount < 500) { - Client.menuActions[Client.menuOptionsCount] = var0; - Client.menuTargets[Client.menuOptionsCount] = var1; - Client.menuOpcodes[Client.menuOptionsCount] = var2; - Client.menuIdentifiers[Client.menuOptionsCount] = var3; - Client.menuArguments1[Client.menuOptionsCount] = var4; - Client.menuArguments2[Client.menuOptionsCount] = var5; - Client.menuShiftClick[Client.menuOptionsCount] = var6; - ++Client.menuOptionsCount; + static void method2218(AbstractArchive var0, AbstractArchive var1, boolean var2, int var3) { + if (Login.field1188) { + if (var3 == 4) { + Login.loginIndex = 4; } + } else { + Login.loginIndex = var3; + Rasterizer2D.Rasterizer2D_clear(); + byte[] var4 = var0.takeFileByNames("title.jpg", ""); + Login.leftTitleSprite = WorldMapSection1.convertJpgToSprite(var4); + FontName.rightTitleSprite = Login.leftTitleSprite.mirrorHorizontally(); + if ((Client.worldProperties & 536870912) != 0) { + Tiles.logoSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "logo_deadman_mode", ""); + } else if ((Client.worldProperties & 1073741824) != 0) { + Tiles.logoSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "logo_seasonal_mode", ""); + } else { + Tiles.logoSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "logo", ""); + } + + NPC.titleboxSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "titlebox", ""); + UserComparator9.titlebuttonSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "titlebutton", ""); + class208.runesSprite = PlayerAppearance.method4160(var1, "runes", ""); + Decimator.title_muteSprite = PlayerAppearance.method4160(var1, "title_mute", ""); + UserComparator8.options_buttons_0Sprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,0", ""); + class51.field412 = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,4", ""); + Login.options_buttons_2Sprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,2", ""); + class4.field23 = ClientPacket.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,6", ""); + Login.field1174 = UserComparator8.options_buttons_0Sprite.subWidth; + Language.field2328 = UserComparator8.options_buttons_0Sprite.subHeight; + Login.loginScreenRunesAnimation = new LoginScreenAnimation(class208.runesSprite); + if (var2) { + Login.Login_username = ""; + Login.Login_password = ""; + } + + Huffman.field2491 = 0; + class268.otp = ""; + Login.field1177 = true; + Login.worldSelectOpen = false; + if (!ScriptEvent.clientPreferences.titleMusicDisabled) { + Archive var5 = class216.archive6; + int var6 = var5.getGroupId("scape main"); + int var7 = var5.getFileId(var6, ""); + WorldMapIcon_0.method253(2, var5, var6, var7, 255, false); + } else { + class80.method2194(2); + } + + UrlRequester.method3428(false); + Login.field1188 = true; + Login.xPadding = (class286.canvasWidth - 765) / 2; + Login.loginBoxX = Login.xPadding + 202; + class192.loginBoxCenter = Login.loginBoxX + 180; + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + FontName.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + Tiles.logoSprite.drawAt(Login.xPadding + 382 - Tiles.logoSprite.subWidth / 2, 18); + } + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(II)I", + garbageValue = "2026213000" + ) + @Export("Messages_getHistorySize") + static int Messages_getHistorySize(int var0) { + ChatChannel var1 = (ChatChannel)Messages.Messages_channels.get(var0); + return var1 == null ? 0 : var1.size(); + } + + @ObfuscatedName("x") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "1182575987" + ) + static void method2215() { + if (class43.loadWorlds()) { + Login.worldSelectOpen = true; + Login.worldSelectPage = 0; + Login.worldSelectPagesCount = 0; + } + + } + + @ObfuscatedName("jj") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "2104552058" + ) + @Export("runIntfCloseListeners") + static final void runIntfCloseListeners(int var0, int var1) { + if (TextureProvider.loadInterface(var0)) { + DirectByteArrayCopier.runComponentCloseListeners(Widget.Widget_interfaceComponents[var0], var1); } } } diff --git a/runescape-client/src/main/java/AudioFilter.java b/runescape-client/src/main/java/AudioFilter.java index 8d67f9012e..6068471dcc 100644 --- a/runescape-client/src/main/java/AudioFilter.java +++ b/runescape-client/src/main/java/AudioFilter.java @@ -3,154 +3,154 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ds") +@ObfuscatedName("dz") @Implements("AudioFilter") public class AudioFilter { - @ObfuscatedName("p") - static float[][] field1454; - @ObfuscatedName("q") + @ObfuscatedName("l") + static float[][] field1460; + @ObfuscatedName("c") @Export("coefficients") static int[][] coefficients; - @ObfuscatedName("m") - static float field1456; - @ObfuscatedName("y") + @ObfuscatedName("o") + static float field1458; + @ObfuscatedName("i") @Export("forwardMultiplier") static int forwardMultiplier; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("pairs") int[] pairs; + @ObfuscatedName("n") + int[][][] field1457; + @ObfuscatedName("q") + int[][][] field1459; @ObfuscatedName("v") - int[][][] field1458; - @ObfuscatedName("u") - int[][][] field1452; - @ObfuscatedName("r") - int[] field1453; + int[] field1455; static { - field1454 = new float[2][8]; + field1460 = new float[2][8]; coefficients = new int[2][8]; } AudioFilter() { this.pairs = new int[2]; - this.field1458 = new int[2][2][4]; - this.field1452 = new int[2][2][4]; - this.field1453 = new int[2]; + this.field1457 = new int[2][2][4]; + this.field1459 = new int[2][2][4]; + this.field1455 = new int[2]; } - @ObfuscatedName("z") - float method2674(int var1, int var2, float var3) { - float var4 = (float)this.field1452[var1][0][var2] + var3 * (float)(this.field1452[var1][1][var2] - this.field1452[var1][0][var2]); + @ObfuscatedName("a") + float method2857(int var1, int var2, float var3) { + float var4 = (float)this.field1459[var1][0][var2] + var3 * (float)(this.field1459[var1][1][var2] - this.field1459[var1][0][var2]); var4 *= 0.0015258789F; return 1.0F - (float)Math.pow(10.0D, (double)(-var4 / 20.0F)); } - @ObfuscatedName("v") - float method2676(int var1, int var2, float var3) { - float var4 = (float)this.field1458[var1][0][var2] + var3 * (float)(this.field1458[var1][1][var2] - this.field1458[var1][0][var2]); + @ObfuscatedName("n") + float method2854(int var1, int var2, float var3) { + float var4 = (float)this.field1457[var1][0][var2] + var3 * (float)(this.field1457[var1][1][var2] - this.field1457[var1][0][var2]); var4 *= 1.2207031E-4F; return normalize(var4); } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("compute") int compute(int var1, float var2) { float var3; if (var1 == 0) { - var3 = (float)this.field1453[0] + (float)(this.field1453[1] - this.field1453[0]) * var2; + var3 = (float)this.field1455[0] + (float)(this.field1455[1] - this.field1455[0]) * var2; var3 *= 0.0030517578F; - field1456 = (float)Math.pow(0.1D, (double)(var3 / 20.0F)); - forwardMultiplier = (int)(field1456 * 65536.0F); + field1458 = (float)Math.pow(0.1D, (double)(var3 / 20.0F)); + forwardMultiplier = (int)(field1458 * 65536.0F); } if (this.pairs[var1] == 0) { return 0; } else { - var3 = this.method2674(var1, 0, var2); - field1454[var1][0] = -2.0F * var3 * (float)Math.cos((double)this.method2676(var1, 0, var2)); - field1454[var1][1] = var3 * var3; + var3 = this.method2857(var1, 0, var2); + field1460[var1][0] = -2.0F * var3 * (float)Math.cos((double)this.method2854(var1, 0, var2)); + field1460[var1][1] = var3 * var3; float[] var10000; int var4; for (var4 = 1; var4 < this.pairs[var1]; ++var4) { - var3 = this.method2674(var1, var4, var2); - float var5 = -2.0F * var3 * (float)Math.cos((double)this.method2676(var1, var4, var2)); + var3 = this.method2857(var1, var4, var2); + float var5 = -2.0F * var3 * (float)Math.cos((double)this.method2854(var1, var4, var2)); float var6 = var3 * var3; - field1454[var1][var4 * 2 + 1] = field1454[var1][var4 * 2 - 1] * var6; - field1454[var1][var4 * 2] = field1454[var1][var4 * 2 - 1] * var5 + field1454[var1][var4 * 2 - 2] * var6; + field1460[var1][var4 * 2 + 1] = field1460[var1][var4 * 2 - 1] * var6; + field1460[var1][var4 * 2] = field1460[var1][var4 * 2 - 1] * var5 + field1460[var1][var4 * 2 - 2] * var6; for (int var7 = var4 * 2 - 1; var7 >= 2; --var7) { - var10000 = field1454[var1]; - var10000[var7] += field1454[var1][var7 - 1] * var5 + field1454[var1][var7 - 2] * var6; + var10000 = field1460[var1]; + var10000[var7] += field1460[var1][var7 - 1] * var5 + field1460[var1][var7 - 2] * var6; } - var10000 = field1454[var1]; - var10000[1] += field1454[var1][0] * var5 + var6; - var10000 = field1454[var1]; + var10000 = field1460[var1]; + var10000[1] += field1460[var1][0] * var5 + var6; + var10000 = field1460[var1]; var10000[0] += var5; } if (var1 == 0) { for (var4 = 0; var4 < this.pairs[0] * 2; ++var4) { - var10000 = field1454[0]; - var10000[var4] *= field1456; + var10000 = field1460[0]; + var10000[var4] *= field1458; } } for (var4 = 0; var4 < this.pairs[var1] * 2; ++var4) { - coefficients[var1][var4] = (int)(field1454[var1][var4] * 65536.0F); + coefficients[var1][var4] = (int)(field1460[var1][var4] * 65536.0F); } return this.pairs[var1] * 2; } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lkl;Ldm;)V" + signature = "(Lkc;Ldd;)V" ) - final void method2678(Buffer var1, SoundEnvelope var2) { + final void method2852(Buffer var1, SoundEnvelope var2) { int var3 = var1.readUnsignedByte(); this.pairs[0] = var3 >> 4; this.pairs[1] = var3 & 15; if (var3 != 0) { - this.field1453[0] = var1.readUnsignedShort(); - this.field1453[1] = var1.readUnsignedShort(); + this.field1455[0] = var1.readUnsignedShort(); + this.field1455[1] = var1.readUnsignedShort(); int var4 = var1.readUnsignedByte(); int var5; int var6; for (var5 = 0; var5 < 2; ++var5) { for (var6 = 0; var6 < this.pairs[var5]; ++var6) { - this.field1458[var5][0][var6] = var1.readUnsignedShort(); - this.field1452[var5][0][var6] = var1.readUnsignedShort(); + this.field1457[var5][0][var6] = var1.readUnsignedShort(); + this.field1459[var5][0][var6] = var1.readUnsignedShort(); } } for (var5 = 0; var5 < 2; ++var5) { for (var6 = 0; var6 < this.pairs[var5]; ++var6) { if ((var4 & 1 << var5 * 4 << var6) != 0) { - this.field1458[var5][1][var6] = var1.readUnsignedShort(); - this.field1452[var5][1][var6] = var1.readUnsignedShort(); + this.field1457[var5][1][var6] = var1.readUnsignedShort(); + this.field1459[var5][1][var6] = var1.readUnsignedShort(); } else { - this.field1458[var5][1][var6] = this.field1458[var5][0][var6]; - this.field1452[var5][1][var6] = this.field1452[var5][0][var6]; + this.field1457[var5][1][var6] = this.field1457[var5][0][var6]; + this.field1459[var5][1][var6] = this.field1459[var5][0][var6]; } } } - if (var4 != 0 || this.field1453[1] != this.field1453[0]) { + if (var4 != 0 || this.field1455[1] != this.field1455[0]) { var2.decodeSegments(var1); } } else { - int[] var7 = this.field1453; - this.field1453[1] = 0; + int[] var7 = this.field1455; + this.field1455[1] = 0; var7[0] = 0; } } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("normalize") static float normalize(float var0) { float var1 = 32.703197F * (float)Math.pow(2.0D, (double)var0); diff --git a/runescape-client/src/main/java/BZip2Decompressor.java b/runescape-client/src/main/java/BZip2Decompressor.java index 2bbdb76da6..94edb55b89 100644 --- a/runescape-client/src/main/java/BZip2Decompressor.java +++ b/runescape-client/src/main/java/BZip2Decompressor.java @@ -3,12 +3,12 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("km") +@ObfuscatedName("kd") @Implements("BZip2Decompressor") public final class BZip2Decompressor { - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Lkj;" + signature = "Lky;" ) @Export("BZip2Decompressor_state") static BZip2State BZip2Decompressor_state; @@ -17,7 +17,7 @@ public final class BZip2Decompressor { BZip2Decompressor_state = new BZip2State(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("BZip2Decompressor_decompress") public static int BZip2Decompressor_decompress(byte[] var0, int var1, byte[] var2, int var3, int var4) { synchronized(BZip2Decompressor_state) { @@ -29,7 +29,7 @@ public final class BZip2Decompressor { BZip2Decompressor_state.bsLive = 0; BZip2Decompressor_state.bsBuff = 0; BZip2Decompressor_state.nextBit_unused = 0; - BZip2Decompressor_state.field3713 = 0; + BZip2Decompressor_state.field3718 = 0; BZip2Decompressor_decompress(BZip2Decompressor_state); var1 -= BZip2Decompressor_state.outputLength; BZip2Decompressor_state.inputArray = null; @@ -38,21 +38,21 @@ public final class BZip2Decompressor { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkj;)V" + signature = "(Lky;)V" ) - static void method5705(BZip2State var0) { + static void method5897(BZip2State var0) { byte var2 = var0.out_char; int var3 = var0.su_rNToGo; int var4 = var0.nblocks_used; int var5 = var0.su_ch2; - int[] var6 = DirectByteArrayCopier.BZip2Decompressor_block; - int var7 = var0.field3732; + int[] var6 = class162.BZip2Decompressor_block; + int var7 = var0.field3720; byte[] var8 = var0.outputArray; int var9 = var0.next_out; int var10 = var0.outputLength; - int var12 = var0.field3750 + 1; + int var12 = var0.field3745 + 1; label61: while (true) { @@ -148,25 +148,25 @@ public final class BZip2Decompressor { break; } - int var13 = var0.field3713; - var0.field3713 += var10 - var10; - if (var0.field3713 < var13) { + int var13 = var0.field3718; + var0.field3718 += var10 - var10; + if (var0.field3718 < var13) { } var0.out_char = var2; var0.su_rNToGo = var3; var0.nblocks_used = var4; var0.su_ch2 = var5; - DirectByteArrayCopier.BZip2Decompressor_block = var6; - var0.field3732 = var7; + class162.BZip2Decompressor_block = var6; + var0.field3720 = var7; var0.outputArray = var8; var0.next_out = var9; var0.outputLength = var10; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkj;)V" + signature = "(Lky;)V" ) @Export("BZip2Decompressor_decompress") static void BZip2Decompressor_decompress(BZip2State var0) { @@ -193,8 +193,8 @@ public final class BZip2Decompressor { int[] var24 = null; int[] var25 = null; var0.blockSize100k = 1410065408; - if (DirectByteArrayCopier.BZip2Decompressor_block == null) { - DirectByteArrayCopier.BZip2Decompressor_block = new int[var0.blockSize100k * 100000]; + if (class162.BZip2Decompressor_block == null) { + class162.BZip2Decompressor_block = new int[var0.blockSize100k * 100000]; } boolean var26 = true; @@ -430,7 +430,7 @@ public final class BZip2Decompressor { } var10002 = var0.unzftab[var0.seqToUnseq[var1 & 255] & 255]++; - DirectByteArrayCopier.BZip2Decompressor_block[var47] = var0.seqToUnseq[var1 & 255] & 255; + class162.BZip2Decompressor_block[var47] = var0.seqToUnseq[var1 & 255] & 255; ++var47; if (var45 == 0) { ++var43; @@ -489,7 +489,7 @@ public final class BZip2Decompressor { var10000 = var0.unzftab; for (var10000[var1 & 255] += var48; var48 > 0; --var48) { - DirectByteArrayCopier.BZip2Decompressor_block[var47] = var1 & 255; + class162.BZip2Decompressor_block[var47] = var1 & 255; ++var47; } } @@ -509,22 +509,22 @@ public final class BZip2Decompressor { } for (var36 = 0; var36 < var47; ++var36) { - var1 = (byte)(DirectByteArrayCopier.BZip2Decompressor_block[var36] & 255); - var10000 = DirectByteArrayCopier.BZip2Decompressor_block; + var1 = (byte)(class162.BZip2Decompressor_block[var36] & 255); + var10000 = class162.BZip2Decompressor_block; int var10001 = var0.cftab[var1 & 255]; var10000[var10001] |= var36 << 8; var10002 = var0.cftab[var1 & 255]++; } - var0.field3732 = DirectByteArrayCopier.BZip2Decompressor_block[var0.originalPointer] >> 8; + var0.field3720 = class162.BZip2Decompressor_block[var0.originalPointer] >> 8; var0.nblocks_used = 0; - var0.field3732 = DirectByteArrayCopier.BZip2Decompressor_block[var0.field3732]; - var0.su_ch2 = (byte)(var0.field3732 & 255); - var0.field3732 >>= 8; + var0.field3720 = class162.BZip2Decompressor_block[var0.field3720]; + var0.su_ch2 = (byte)(var0.field3720 & 255); + var0.field3720 >>= 8; ++var0.nblocks_used; - var0.field3750 = var47; - method5705(var0); - if (var0.field3750 + 1 == var0.nblocks_used && var0.su_rNToGo == 0) { + var0.field3745 = var47; + method5897(var0); + if (var0.field3745 + 1 == var0.nblocks_used && var0.su_rNToGo == 0) { var26 = true; break; } @@ -538,27 +538,27 @@ public final class BZip2Decompressor { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkj;)B" + signature = "(Lky;)B" ) @Export("BZip2Decompressor_readNextByte") static byte BZip2Decompressor_readNextByte(BZip2State var0) { return (byte)BZip2Decompressor_readBits(8, var0); } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lkj;)B" + signature = "(Lky;)B" ) @Export("BZip2Decompressor_readNextBit") static byte BZip2Decompressor_readNextBit(BZip2State var0) { return (byte)BZip2Decompressor_readBits(1, var0); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(ILkj;)I" + signature = "(ILky;)I" ) @Export("BZip2Decompressor_readBits") static int BZip2Decompressor_readBits(int var0, BZip2State var1) { @@ -576,9 +576,9 @@ public final class BZip2Decompressor { return var2; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Lkj;)V" + signature = "(Lky;)V" ) @Export("makeMaps") static void makeMaps(BZip2State var0) { @@ -593,7 +593,7 @@ public final class BZip2Decompressor { } - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("BZip2Decompressor_createHuffmanTables") static void BZip2Decompressor_createHuffmanTables(int[] var0, int[] var1, int[] var2, byte[] var3, int var4, int var5, int var6) { int var7 = 0; diff --git a/runescape-client/src/main/java/BZip2State.java b/runescape-client/src/main/java/BZip2State.java index c636d2f449..fe50f929c4 100644 --- a/runescape-client/src/main/java/BZip2State.java +++ b/runescape-client/src/main/java/BZip2State.java @@ -2,175 +2,168 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kj") +@ObfuscatedName("ky") @Implements("BZip2State") public final class BZip2State { - @ObfuscatedName("eg") - @ObfuscatedGetter( - intValue = -1555084527 - ) - @Export("port2") - static int port2; - @ObfuscatedName("z") - final int field3723; + @ObfuscatedName("a") + final int field3709; + @ObfuscatedName("t") + final int field3732; @ObfuscatedName("n") - final int field3740; - @ObfuscatedName("v") - final int field3749; - @ObfuscatedName("u") - final int field3729; - @ObfuscatedName("r") - final int field3717; - @ObfuscatedName("p") - final int field3730; + final int field3734; @ObfuscatedName("q") + final int field3711; + @ObfuscatedName("v") + final int field3712; + @ObfuscatedName("l") + final int field3713; + @ObfuscatedName("c") @Export("inputArray") byte[] inputArray; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -1460237959 + intValue = -502427743 ) @Export("nextByte") int nextByte; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 19255173 + intValue = -561445913 ) @Export("nextBit_unused") int nextBit_unused; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("outputArray") byte[] outputArray; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 577933795 + intValue = -871682081 ) @Export("next_out") int next_out; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -1492713953 + intValue = -661840641 ) @Export("outputLength") int outputLength; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -1053795843 + intValue = 77506983 ) - int field3713; - @ObfuscatedName("a") + int field3718; + @ObfuscatedName("k") @Export("out_char") byte out_char; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = 423882031 + intValue = -250901683 ) @Export("su_rNToGo") int su_rNToGo; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = -1870654053 + intValue = 2016386947 ) @Export("bsBuff") int bsBuff; - @ObfuscatedName("t") + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = 2034972657 + intValue = 1150627855 ) @Export("bsLive") int bsLive; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 1804549120 + intValue = 1637628928 ) @Export("blockSize100k") int blockSize100k; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = -2121773995 + intValue = 1744345569 ) @Export("originalPointer") int originalPointer; - @ObfuscatedName("h") + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = -1375440771 + intValue = 1139360211 ) - int field3732; - @ObfuscatedName("s") + int field3720; + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = 1764835615 + intValue = -2116705151 ) @Export("su_ch2") int su_ch2; @ObfuscatedName("f") @Export("unzftab") int[] unzftab; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 1747033841 + intValue = -271375789 ) @Export("nblocks_used") int nblocks_used; - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("cftab") int[] cftab; - @ObfuscatedName("k") + @ObfuscatedName("y") @ObfuscatedGetter( - intValue = 1244375945 + intValue = 1457092991 ) @Export("nInUse") int nInUse; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @Export("inUse") boolean[] inUse; - @ObfuscatedName("az") + @ObfuscatedName("aw") @Export("inUse16") boolean[] inUse16; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("seqToUnseq") byte[] seqToUnseq; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @Export("ll8") byte[] ll8; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @Export("getAndMoveToFrontDecode_yy") int[] getAndMoveToFrontDecode_yy; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @Export("selector") byte[] selector; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("selectorMtf") byte[] selectorMtf; - @ObfuscatedName("ax") + @ObfuscatedName("av") @Export("temp_charArray2d") byte[][] temp_charArray2d; - @ObfuscatedName("as") + @ObfuscatedName("am") @Export("limit") int[][] limit; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @Export("base") int[][] base; - @ObfuscatedName("al") + @ObfuscatedName("ax") @Export("perm") int[][] perm; - @ObfuscatedName("ad") + @ObfuscatedName("al") @Export("minLens") int[] minLens; - @ObfuscatedName("an") + @ObfuscatedName("ap") @ObfuscatedGetter( - intValue = 648150601 + intValue = 1163964567 ) - int field3750; + int field3745; BZip2State() { - this.field3723 = 4096; - this.field3740 = 16; - this.field3749 = 258; - this.field3729 = 6; - this.field3717 = 50; - this.field3730 = 18002; + this.field3709 = 4096; + this.field3732 = 16; + this.field3734 = 258; + this.field3711 = 6; + this.field3712 = 50; + this.field3713 = 18002; this.nextByte = 0; this.next_out = 0; this.unzftab = new int[256]; @@ -188,23 +181,4 @@ public final class BZip2State { this.perm = new int[6][258]; this.minLens = new int[6]; } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(B)[Lkc;", - garbageValue = "-127" - ) - @Export("ChatMode_values") - static PrivateChatMode[] ChatMode_values() { - return new PrivateChatMode[]{PrivateChatMode.field3792, PrivateChatMode.field3790, PrivateChatMode.field3791}; - } - - @ObfuscatedName("hy") - @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "157596925" - ) - static boolean method5703(int var0) { - return var0 == 57 || var0 == 58 || var0 == 1007 || var0 == 25 || var0 == 30; - } } diff --git a/runescape-client/src/main/java/BoundaryObject.java b/runescape-client/src/main/java/BoundaryObject.java index b944af7fb7..7f8e3d023c 100644 --- a/runescape-client/src/main/java/BoundaryObject.java +++ b/runescape-client/src/main/java/BoundaryObject.java @@ -4,66 +4,62 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("eo") +@ObfuscatedName("et") @Implements("BoundaryObject") public final class BoundaryObject { - @ObfuscatedName("dc") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive3") - static Archive archive3; - @ObfuscatedName("z") + @ObfuscatedName("r") + static String[] field1859; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -21907105 - ) - @Export("orientationA") - int orientationA; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = 614934347 + intValue = -14166733 ) @Export("tileHeight") int tileHeight; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -602196191 + intValue = -591706183 ) @Export("x") int x; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1866626591 + intValue = -1799577875 ) @Export("y") int y; - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1916194803 + intValue = 1720763557 + ) + @Export("orientationA") + int orientationA; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = 1635831629 ) @Export("orientationB") int orientationB; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Ler;" + signature = "Lep;" ) @Export("entity1") public Entity entity1; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Ler;" + signature = "Lep;" ) @Export("entity2") public Entity entity2; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - longValue = 7018407287880452951L + longValue = 7223116526443198487L ) @Export("tag") public long tag; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -461421073 + intValue = 1447474805 ) @Export("flags") int flags; @@ -73,12 +69,101 @@ public final class BoundaryObject { this.flags = 0; } - @ObfuscatedName("n") + @ObfuscatedName("ko") @ObfuscatedSignature( - signature = "(CB)Z", - garbageValue = "31" + signature = "(I)V", + garbageValue = "1336245402" ) - static final boolean method3226(char var0) { - return var0 == 160 || var0 == ' ' || var0 == '_' || var0 == '-'; + static void method3393() { + for (InterfaceParent var0 = (InterfaceParent)Client.interfaceParents.first(); var0 != null; var0 = (InterfaceParent)Client.interfaceParents.next()) { + int var1 = var0.group; + if (TextureProvider.loadInterface(var1)) { + boolean var2 = true; + Widget[] var3 = Widget.Widget_interfaceComponents[var1]; + + int var4; + for (var4 = 0; var4 < var3.length; ++var4) { + if (var3[var4] != null) { + var2 = var3[var4].isIf3; + break; + } + } + + if (!var2) { + var4 = (int)var0.key; + Widget var5 = PacketBufferNode.getWidget(var4); + if (var5 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var5); + } + } + } + } + + } + + @ObfuscatedName("lw") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;ZI)V", + garbageValue = "-2087337765" + ) + @Export("findItemDefinitions") + static void findItemDefinitions(String var0, boolean var1) { + var0 = var0.toLowerCase(); + short[] var2 = new short[16]; + int var3 = 0; + + for (int var4 = 0; var4 < ItemDefinition.ItemDefinition_fileCount; ++var4) { + ItemDefinition var5 = class222.ItemDefinition_get(var4); + if ((!var1 || var5.isTradable) && var5.noteTemplate == -1 && var5.name.toLowerCase().indexOf(var0) != -1) { + if (var3 >= 250) { + MouseHandler.foundItemIdCount = -1; + UserComparator4.foundItemIds = null; + return; + } + + if (var3 >= var2.length) { + short[] var6 = new short[var2.length * 2]; + + for (int var7 = 0; var7 < var3; ++var7) { + var6[var7] = var2[var7]; + } + + var2 = var6; + } + + var2[var3++] = (short)var4; + } + } + + UserComparator4.foundItemIds = var2; + WorldMapManager.foundItemIndex = 0; + MouseHandler.foundItemIdCount = var3; + String[] var8 = new String[MouseHandler.foundItemIdCount]; + + for (int var9 = 0; var9 < MouseHandler.foundItemIdCount; ++var9) { + var8[var9] = class222.ItemDefinition_get(var2[var9]).name; + } + + short[] var10 = UserComparator4.foundItemIds; + RouteStrategy.sortItemsByName(var8, var10, 0, var8.length - 1); + } + + @ObfuscatedName("lj") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "124156386" + ) + static void method3394() { + if (GrandExchangeOfferWorldComparator.field30 != null) { + Client.field900 = Client.cycle; + GrandExchangeOfferWorldComparator.field30.method4482(); + + for (int var0 = 0; var0 < Client.players.length; ++var0) { + if (Client.players[var0] != null) { + GrandExchangeOfferWorldComparator.field30.method4476(UserComparator8.baseX * 64 + (Client.players[var0].x >> 7), HealthBar.baseY * 64 + (Client.players[var0].y >> 7)); + } + } + } + } } diff --git a/runescape-client/src/main/java/Bounds.java b/runescape-client/src/main/java/Bounds.java index 8119d4f9cb..dc7a080ec3 100644 --- a/runescape-client/src/main/java/Bounds.java +++ b/runescape-client/src/main/java/Bounds.java @@ -4,30 +4,30 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ll") +@ObfuscatedName("ls") @Implements("Bounds") public class Bounds { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -479130629 + intValue = -1735724601 ) @Export("lowX") public int lowX; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 724783571 + intValue = -701395687 ) @Export("lowY") public int lowY; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1669121479 + intValue = -825003219 ) @Export("highX") public int highX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1354833317 + intValue = 1589322753 ) @Export("highY") public int highY; @@ -41,10 +41,10 @@ public class Bounds { this(0, 0, var1, var2); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "166241873" + signature = "(IIB)V", + garbageValue = "0" ) @Export("setLow") public void setLow(int var1, int var2) { @@ -52,10 +52,10 @@ public class Bounds { this.lowY = var2; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "1712715973" + signature = "(IIB)V", + garbageValue = "-111" ) @Export("setHigh") public void setHigh(int var1, int var2) { @@ -63,22 +63,22 @@ public class Bounds { this.highY = var2; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lll;Lll;I)V", - garbageValue = "2079875928" + signature = "(Lls;Lls;I)V", + garbageValue = "478225673" ) - public void method5913(Bounds var1, Bounds var2) { - this.method5927(var1, var2); - this.method5914(var1, var2); + public void method6081(Bounds var1, Bounds var2) { + this.method6097(var1, var2); + this.method6085(var1, var2); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lll;Lll;B)V", - garbageValue = "-1" + signature = "(Lls;Lls;I)V", + garbageValue = "-1348909503" ) - void method5927(Bounds var1, Bounds var2) { + void method6097(Bounds var1, Bounds var2) { var2.lowX = this.lowX; var2.highX = this.highX; if (this.lowX < var1.lowX) { @@ -86,8 +86,8 @@ public class Bounds { var2.lowX = var1.lowX; } - if (var2.method5916() > var1.method5916()) { - var2.highX -= var2.method5916() - var1.method5916(); + if (var2.method6086() > var1.method6086()) { + var2.highX -= var2.method6086() - var1.method6086(); } if (var2.highX < 0) { @@ -96,12 +96,12 @@ public class Bounds { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lll;Lll;I)V", - garbageValue = "-1654040739" + signature = "(Lls;Lls;B)V", + garbageValue = "1" ) - void method5914(Bounds var1, Bounds var2) { + void method6085(Bounds var1, Bounds var2) { var2.lowY = this.lowY; var2.highY = this.highY; if (this.lowY < var1.lowY) { @@ -109,8 +109,8 @@ public class Bounds { var2.lowY = var1.lowY; } - if (var2.method5912() > var1.method5912()) { - var2.highY -= var2.method5912() - var1.method5912(); + if (var2.method6087() > var1.method6087()) { + var2.highY -= var2.method6087() - var1.method6087(); } if (var2.highY < 0) { @@ -119,22 +119,22 @@ public class Bounds { } - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "769635987" - ) - int method5916() { - return this.lowX + this.highX; - } - - @ObfuscatedName("q") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "59" + garbageValue = "-20" ) - int method5912() { - return this.highY + this.lowY; + int method6086() { + return this.highX + this.lowX; + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(B)I", + garbageValue = "-30" + ) + int method6087() { + return this.lowY + this.highY; } public String toString() { diff --git a/runescape-client/src/main/java/Buddy.java b/runescape-client/src/main/java/Buddy.java index a749b0c0bb..5c122cb3cf 100644 --- a/runescape-client/src/main/java/Buddy.java +++ b/runescape-client/src/main/java/Buddy.java @@ -3,26 +3,25 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("jl") +@ObfuscatedName("jx") @Implements("Buddy") public class Buddy extends User { - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1753766973 + intValue = 1646057305 ) @Export("world") public int world; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1761858423 + intValue = 1797004239 ) @Export("int2") public int int2; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1627143829 + intValue = 48717521 ) @Export("rank") public int rank; @@ -31,10 +30,10 @@ public class Buddy extends User { this.world = -1; } - @ObfuscatedName("ak") + @ObfuscatedName("bx") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "-736416010" + signature = "(IIB)V", + garbageValue = "-15" ) @Export("set") void set(int var1, int var2) { @@ -42,17 +41,17 @@ public class Buddy extends User { this.int2 = var2; } - @ObfuscatedName("aq") + @ObfuscatedName("bl") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-516703486" + garbageValue = "-319513783" ) @Export("getWorld") public int getWorld() { return this.world; } - @ObfuscatedName("am") + @ObfuscatedName("bh") @ObfuscatedSignature( signature = "(B)Z", garbageValue = "0" @@ -62,364 +61,100 @@ public class Buddy extends User { return this.world > 0; } - @ObfuscatedName("ap") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1426462552" + signature = "(CI)C", + garbageValue = "129853061" ) - static int method5111(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.FRIEND_COUNT) { - if (Tiles.friendSystem.field1052 == 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -2; - } else if (Tiles.friendSystem.field1052 == 1) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Tiles.friendSystem.friendsList.getSize(); - } - - return 1; - } else { - int var3; - if (var0 == ScriptOpcodes.FRIEND_GETNAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Tiles.friendSystem.method1863() && var3 >= 0 && var3 < Tiles.friendSystem.friendsList.getSize()) { - Friend var8 = (Friend)Tiles.friendSystem.friendsList.get(var3); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var8.getName(); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var8.getPreviousName(); - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.FRIEND_GETWORLD) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Tiles.friendSystem.method1863() && var3 >= 0 && var3 < Tiles.friendSystem.friendsList.getSize()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)Tiles.friendSystem.friendsList.get(var3)).world; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.FRIEND_GETRANK) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Tiles.friendSystem.method1863() && var3 >= 0 && var3 < Tiles.friendSystem.friendsList.getSize()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)Tiles.friendSystem.friendsList.get(var3)).rank; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else { - String var5; - if (var0 == ScriptOpcodes.FRIEND_SETRANK) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - int var6 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - NPC.method2050(var5, var6); - return 1; - } else if (var0 == ScriptOpcodes.FRIEND_ADD) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Tiles.friendSystem.addFriend(var5); - return 1; - } else if (var0 == ScriptOpcodes.FRIEND_DEL) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Tiles.friendSystem.removeFriend(var5); - return 1; - } else if (var0 == ScriptOpcodes.IGNORE_ADD) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Tiles.friendSystem.addIgnore(var5); - return 1; - } else if (var0 == ScriptOpcodes.IGNORE_DEL) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Tiles.friendSystem.removeIgnore(var5); - return 1; - } else if (var0 == ScriptOpcodes.FRIEND_TEST) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var5 = WorldMapSectionType.method250(var5); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Tiles.friendSystem.isFriended(new Username(var5, WorldMapSection1.loginType), false) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATDISPLAYNAME) { - if (Varps.clanChat != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Varps.clanChat.name; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATCOUNT) { - if (Varps.clanChat != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Varps.clanChat.getSize(); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATUSERNAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Varps.clanChat != null && var3 < Varps.clanChat.getSize()) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Varps.clanChat.get(var3).getUsername().getName(); - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATUSERWORLD) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Varps.clanChat != null && var3 < Varps.clanChat.getSize()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)Varps.clanChat.get(var3)).getWorld(); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATUSERRANK) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Varps.clanChat != null && var3 < Varps.clanChat.getSize()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)Varps.clanChat.get(var3)).rank; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATMINKICK) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Varps.clanChat != null ? Varps.clanChat.minKick : 0; - return 1; - } else if (var0 == ScriptOpcodes.CLAN_KICKUSER) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - NetCache.clanKickUser(var5); - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATRANK) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Varps.clanChat != null ? Varps.clanChat.rank : 0; - return 1; - } else if (var0 == ScriptOpcodes.CLAN_JOINCHAT) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - World.Clan_joinChat(var5); - return 1; - } else if (var0 == ScriptOpcodes.CLAN_LEAVECHAT) { - WorldMapLabel.Clan_leaveChat(); - return 1; - } else if (var0 == ScriptOpcodes.IGNORE_COUNT) { - if (!Tiles.friendSystem.method1863()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Tiles.friendSystem.ignoreList.getSize(); - } - - return 1; - } else if (var0 == ScriptOpcodes.IGNORE_GETNAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Tiles.friendSystem.method1863() && var3 >= 0 && var3 < Tiles.friendSystem.ignoreList.getSize()) { - Ignored var4 = (Ignored)Tiles.friendSystem.ignoreList.get(var3); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.getName(); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.getPreviousName(); - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.IGNORE_TEST) { - var5 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var5 = WorldMapSectionType.method250(var5); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Tiles.friendSystem.isIgnored(new Username(var5, WorldMapSection1.loginType)) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CLAN_ISSELF) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Varps.clanChat != null && var3 < Varps.clanChat.getSize() && Varps.clanChat.get(var3).getUsername().equals(class223.localPlayer.username)) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_GETCHATOWNERNAME) { - if (Varps.clanChat != null && Varps.clanChat.owner != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Varps.clanChat.owner; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.CLAN_ISFRIEND) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Varps.clanChat != null && var3 < Varps.clanChat.getSize() && ((ClanMate)Varps.clanChat.get(var3)).isFriend()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 != ScriptOpcodes.CLAN_ISIGNORE) { - if (var0 == 3628) { - Tiles.friendSystem.friendsList.removeComparator(); - return 1; - } else { - boolean var7; - if (var0 == 3629) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator1(var7)); - return 1; - } else if (var0 == 3630) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator2(var7)); - return 1; - } else if (var0 == 3631) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator3(var7)); - return 1; - } else if (var0 == 3632) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator4(var7)); - return 1; - } else if (var0 == 3633) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator5(var7)); - return 1; - } else if (var0 == 3634) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator6(var7)); - return 1; - } else if (var0 == 3635) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator7(var7)); - return 1; - } else if (var0 == 3636) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator8(var7)); - return 1; - } else if (var0 == 3637) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator9(var7)); - return 1; - } else if (var0 == 3638) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new UserComparator10(var7)); - return 1; - } else if (var0 == 3639) { - Tiles.friendSystem.friendsList.sort(); - return 1; - } else if (var0 == 3640) { - Tiles.friendSystem.ignoreList.removeComparator(); - return 1; - } else if (var0 == 3641) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.ignoreList.addComparator(new UserComparator1(var7)); - return 1; - } else if (var0 == 3642) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.ignoreList.addComparator(new UserComparator2(var7)); - return 1; - } else if (var0 == 3643) { - Tiles.friendSystem.ignoreList.sort(); - return 1; - } else if (var0 == 3644) { - if (Varps.clanChat != null) { - Varps.clanChat.removeComparator(); - } - - return 1; - } else if (var0 == 3645) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator1(var7)); - } - - return 1; - } else if (var0 == 3646) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator2(var7)); - } - - return 1; - } else if (var0 == 3647) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator3(var7)); - } - - return 1; - } else if (var0 == 3648) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator4(var7)); - } - - return 1; - } else if (var0 == 3649) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator5(var7)); - } - - return 1; - } else if (var0 == 3650) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator6(var7)); - } - - return 1; - } else if (var0 == 3651) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator7(var7)); - } - - return 1; - } else if (var0 == 3652) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator8(var7)); - } - - return 1; - } else if (var0 == 3653) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator9(var7)); - } - - return 1; - } else if (var0 == 3654) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new UserComparator10(var7)); - } - - return 1; - } else if (var0 == 3655) { - if (Varps.clanChat != null) { - Varps.clanChat.sort(); - } - - return 1; - } else if (var0 == 3656) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Tiles.friendSystem.friendsList.addComparator(new BuddyRankComparator(var7)); - return 1; - } else if (var0 == 3657) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (Varps.clanChat != null) { - Varps.clanChat.addComparator(new BuddyRankComparator(var7)); - } - - return 1; - } else { - return 2; - } - } - } else { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (Varps.clanChat != null && var3 < Varps.clanChat.getSize() && ((ClanMate)Varps.clanChat.get(var3)).isIgnored()) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } - } + public static char method5286(char var0) { + switch(var0) { + case ' ': + case '-': + case '_': + case ' ': + return '_'; + case '#': + case '[': + case ']': + return var0; + case 'À': + case 'Á': + case 'Â': + case 'Ã': + case 'Ä': + case 'à': + case 'á': + case 'â': + case 'ã': + case 'ä': + return 'a'; + case 'Ç': + case 'ç': + return 'c'; + case 'È': + case 'É': + case 'Ê': + case 'Ë': + case 'è': + case 'é': + case 'ê': + case 'ë': + return 'e'; + case 'Í': + case 'Î': + case 'Ï': + case 'í': + case 'î': + case 'ï': + return 'i'; + case 'Ñ': + case 'ñ': + return 'n'; + case 'Ò': + case 'Ó': + case 'Ô': + case 'Õ': + case 'Ö': + case 'ò': + case 'ó': + case 'ô': + case 'õ': + case 'ö': + return 'o'; + case 'Ù': + case 'Ú': + case 'Û': + case 'Ü': + case 'ù': + case 'ú': + case 'û': + case 'ü': + return 'u'; + case 'ß': + return 'b'; + case 'ÿ': + case 'Ÿ': + return 'y'; + default: + return Character.toLowerCase(var0); } } + + @ObfuscatedName("ah") + @ObfuscatedSignature( + signature = "(IB)I", + garbageValue = "116" + ) + static int method5298(int var0) { + return (int)Math.pow(2.0D, (double)((float)var0 / 256.0F + 7.0F)); + } + + @ObfuscatedName("bh") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;I)I", + garbageValue = "-2095111578" + ) + public static int method5297(String var0) { + return var0.length() + 2; + } } diff --git a/runescape-client/src/main/java/BuddyRankComparator.java b/runescape-client/src/main/java/BuddyRankComparator.java index 87a277393b..39f5c6a4f1 100644 --- a/runescape-client/src/main/java/BuddyRankComparator.java +++ b/runescape-client/src/main/java/BuddyRankComparator.java @@ -3,10 +3,16 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fd") +@ObfuscatedName("fs") @Implements("BuddyRankComparator") public class BuddyRankComparator extends AbstractUserComparator { - @ObfuscatedName("z") + @ObfuscatedName("do") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive0") + static Archive archive0; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -14,10 +20,10 @@ public class BuddyRankComparator extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-1443378495" + signature = "(Ljx;Ljx;I)I", + garbageValue = "63405397" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -32,13 +38,60 @@ public class BuddyRankComparator extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("hs") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "96" + signature = "(Lij;IIIBZI)V", + garbageValue = "-1505675157" ) - @Export("getNewestMenuIdx") - static final int getNewestMenuIdx() { - return Client.menuOptionsCount - 1; + @Export("requestNetFile") + static void requestNetFile(Archive var0, int var1, int var2, int var3, byte var4, boolean var5) { + long var6 = (long)((var1 << 16) + var2); + NetFileRequest var8 = (NetFileRequest)NetCache.NetCache_pendingPriorityWrites.get(var6); + if (var8 == null) { + var8 = (NetFileRequest)NetCache.NetCache_pendingPriorityResponses.get(var6); + if (var8 == null) { + var8 = (NetFileRequest)NetCache.NetCache_pendingWrites.get(var6); + if (var8 != null) { + if (var5) { + var8.removeDual(); + NetCache.NetCache_pendingPriorityWrites.put(var8, var6); + --NetCache.NetCache_pendingWritesCount; + ++NetCache.NetCache_pendingPriorityWritesCount; + } + + } else { + if (!var5) { + var8 = (NetFileRequest)NetCache.NetCache_pendingResponses.get(var6); + if (var8 != null) { + return; + } + } + + var8 = new NetFileRequest(); + var8.archive = var0; + var8.crc = var3; + var8.padding = var4; + if (var5) { + NetCache.NetCache_pendingPriorityWrites.put(var8, var6); + ++NetCache.NetCache_pendingPriorityWritesCount; + } else { + NetCache.NetCache_pendingWritesQueue.addFirst(var8); + NetCache.NetCache_pendingWrites.put(var8, var6); + ++NetCache.NetCache_pendingWritesCount; + } + + } + } + } + } + + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "2092280519" + ) + public static void method3568() { + SequenceDefinition.SequenceDefinition_cached.clear(); + SequenceDefinition.SequenceDefinition_cachedFrames.clear(); } } diff --git a/runescape-client/src/main/java/Buffer.java b/runescape-client/src/main/java/Buffer.java index b3a25be0b9..c8aa009bda 100644 --- a/runescape-client/src/main/java/Buffer.java +++ b/runescape-client/src/main/java/Buffer.java @@ -5,21 +5,21 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kl") +@ObfuscatedName("kc") @Implements("Buffer") public class Buffer extends Node { - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("crc32Table") static int[] crc32Table; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("crc64Table") static long[] crc64Table; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("array") public byte[] array; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -757431099 + intValue = -827254609 ) @Export("offset") public int offset; @@ -61,7 +61,7 @@ public class Buffer extends Node { } public Buffer(int var1) { - this.array = class30.ByteArrayPool_getArray(var1); + this.array = World.ByteArrayPool_getArray(var1); this.offset = 0; } @@ -70,34 +70,34 @@ public class Buffer extends Node { this.offset = 0; } - @ObfuscatedName("ak") + @ObfuscatedName("ai") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-44" + garbageValue = "67" ) @Export("releaseArray") public void releaseArray() { if (this.array != null) { - class80.ByteArrayPool_release(this.array); + class191.ByteArrayPool_release(this.array); } this.array = null; } - @ObfuscatedName("aq") + @ObfuscatedName("ac") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-477863922" + garbageValue = "-124467030" ) @Export("writeByte") public void writeByte(int var1) { this.array[++this.offset - 1] = (byte)var1; } - @ObfuscatedName("am") + @ObfuscatedName("at") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "2066508781" + garbageValue = "-469527659" ) @Export("writeShort") public void writeShort(int var1) { @@ -105,10 +105,10 @@ public class Buffer extends Node { this.array[++this.offset - 1] = (byte)var1; } - @ObfuscatedName("ae") + @ObfuscatedName("as") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "-88" + signature = "(II)V", + garbageValue = "-1060098226" ) @Export("writeMedium") public void writeMedium(int var1) { @@ -117,10 +117,10 @@ public class Buffer extends Node { this.array[++this.offset - 1] = (byte)var1; } - @ObfuscatedName("av") + @ObfuscatedName("ba") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "22" + signature = "(II)V", + garbageValue = "-1202665318" ) @Export("writeInt") public void writeInt(int var1) { @@ -130,7 +130,7 @@ public class Buffer extends Node { this.array[++this.offset - 1] = (byte)var1; } - @ObfuscatedName("ah") + @ObfuscatedName("bg") @Export("writeLongMedium") public void writeLongMedium(long var1) { this.array[++this.offset - 1] = (byte)((int)(var1 >> 40)); @@ -141,7 +141,7 @@ public class Buffer extends Node { this.array[++this.offset - 1] = (byte)((int)var1); } - @ObfuscatedName("ag") + @ObfuscatedName("bc") @Export("writeLong") public void writeLong(long var1) { this.array[++this.offset - 1] = (byte)((int)(var1 >> 56)); @@ -154,20 +154,20 @@ public class Buffer extends Node { this.array[++this.offset - 1] = (byte)((int)var1); } - @ObfuscatedName("aj") + @ObfuscatedName("bd") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "246663976" + garbageValue = "-802962767" ) @Export("writeBoolean") public void writeBoolean(boolean var1) { this.writeByte(var1 ? 1 : 0); } - @ObfuscatedName("au") + @ObfuscatedName("bl") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)V", - garbageValue = "-1991648587" + garbageValue = "1119026352" ) @Export("writeStringCp1252NullTerminated") public void writeStringCp1252NullTerminated(String var1) { @@ -175,15 +175,15 @@ public class Buffer extends Node { if (var2 >= 0) { throw new IllegalArgumentException(""); } else { - this.offset += ServerBuild.encodeStringCp1252(var1, 0, var1.length(), this.array, this.offset); + this.offset += GrandExchangeOffer.encodeStringCp1252(var1, 0, var1.length(), this.array, this.offset); this.array[++this.offset - 1] = 0; } } - @ObfuscatedName("at") + @ObfuscatedName("bu") @ObfuscatedSignature( - signature = "(Ljava/lang/String;B)V", - garbageValue = "-30" + signature = "(Ljava/lang/String;I)V", + garbageValue = "-1964385686" ) @Export("writeStringCp1252NullCircumfixed") public void writeStringCp1252NullCircumfixed(String var1) { @@ -192,28 +192,28 @@ public class Buffer extends Node { throw new IllegalArgumentException(""); } else { this.array[++this.offset - 1] = 0; - this.offset += ServerBuild.encodeStringCp1252(var1, 0, var1.length(), this.array, this.offset); + this.offset += GrandExchangeOffer.encodeStringCp1252(var1, 0, var1.length(), this.array, this.offset); this.array[++this.offset - 1] = 0; } } - @ObfuscatedName("bx") + @ObfuscatedName("br") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;I)V", - garbageValue = "1234483841" + signature = "(Ljava/lang/CharSequence;B)V", + garbageValue = "8" ) @Export("writeCESU8") public void writeCESU8(CharSequence var1) { - int var2 = class173.method3556(var1); + int var2 = Projectile.method2268(var1); this.array[++this.offset - 1] = 0; this.writeVarInt(var2); - this.offset += AbstractWorldMapIcon.method640(this.array, this.offset, var1); + this.offset += Entity.method3390(this.array, this.offset, var1); } - @ObfuscatedName("bh") + @ObfuscatedName("bq") @ObfuscatedSignature( - signature = "([BIII)V", - garbageValue = "-1646863699" + signature = "([BIIS)V", + garbageValue = "-9801" ) @Export("writeBytes") public void writeBytes(byte[] var1, int var2, int var3) { @@ -223,10 +223,10 @@ public class Buffer extends Node { } - @ObfuscatedName("bd") + @ObfuscatedName("bi") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "2127950431" + signature = "(IB)V", + garbageValue = "4" ) @Export("writeLengthInt") public void writeLengthInt(int var1) { @@ -240,10 +240,10 @@ public class Buffer extends Node { } } - @ObfuscatedName("bm") + @ObfuscatedName("be") @ObfuscatedSignature( signature = "(IB)V", - garbageValue = "15" + garbageValue = "-72" ) @Export("writeLengthShort") public void writeLengthShort(int var1) { @@ -255,10 +255,10 @@ public class Buffer extends Node { } } - @ObfuscatedName("bv") + @ObfuscatedName("bt") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "554833635" + garbageValue = "-69272234" ) @Export("writeLengthByte") public void writeLengthByte(int var1) { @@ -269,10 +269,10 @@ public class Buffer extends Node { } } - @ObfuscatedName("bj") + @ObfuscatedName("bs") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-2079556313" + garbageValue = "2007891987" ) @Export("writeSmartByteShort") public void writeSmartByteShort(int var1) { @@ -285,10 +285,10 @@ public class Buffer extends Node { } } - @ObfuscatedName("bs") + @ObfuscatedName("bj") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "831943486" + signature = "(IB)V", + garbageValue = "97" ) @Export("writeVarInt") public void writeVarInt(int var1) { @@ -311,30 +311,30 @@ public class Buffer extends Node { this.writeByte(var1 & 127); } - @ObfuscatedName("bz") + @ObfuscatedName("bm") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "14" + garbageValue = "29" ) @Export("readUnsignedByte") public int readUnsignedByte() { return this.array[++this.offset - 1] & 255; } - @ObfuscatedName("bc") + @ObfuscatedName("bn") @ObfuscatedSignature( - signature = "(I)B", - garbageValue = "-462155889" + signature = "(B)B", + garbageValue = "122" ) @Export("readByte") public byte readByte() { return this.array[++this.offset - 1]; } - @ObfuscatedName("bk") + @ObfuscatedName("bz") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "914315113" + signature = "(B)I", + garbageValue = "66" ) @Export("readUnsignedShort") public int readUnsignedShort() { @@ -342,10 +342,10 @@ public class Buffer extends Node { return (this.array[this.offset - 1] & 255) + ((this.array[this.offset - 2] & 255) << 8); } - @ObfuscatedName("ba") + @ObfuscatedName("bo") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1303448580" + garbageValue = "1302638663" ) @Export("readShort") public int readShort() { @@ -358,10 +358,10 @@ public class Buffer extends Node { return var1; } - @ObfuscatedName("bn") + @ObfuscatedName("bk") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "1555" + signature = "(B)I", + garbageValue = "0" ) @Export("readMedium") public int readMedium() { @@ -369,10 +369,10 @@ public class Buffer extends Node { return ((this.array[this.offset - 3] & 255) << 16) + (this.array[this.offset - 1] & 255) + ((this.array[this.offset - 2] & 255) << 8); } - @ObfuscatedName("be") + @ObfuscatedName("bv") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "562340943" + garbageValue = "-1932524542" ) @Export("readInt") public int readInt() { @@ -380,32 +380,32 @@ public class Buffer extends Node { return ((this.array[this.offset - 3] & 255) << 16) + (this.array[this.offset - 1] & 255) + ((this.array[this.offset - 2] & 255) << 8) + ((this.array[this.offset - 4] & 255) << 24); } - @ObfuscatedName("bu") + @ObfuscatedName("bw") @ObfuscatedSignature( signature = "(I)J", - garbageValue = "1896849386" + garbageValue = "-1857115687" ) @Export("readLong") public long readLong() { long var1 = (long)this.readInt() & 4294967295L; long var3 = (long)this.readInt() & 4294967295L; - return var3 + (var1 << 32); + return (var1 << 32) + var3; } - @ObfuscatedName("bi") + @ObfuscatedName("bb") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "27" + signature = "(I)Z", + garbageValue = "462936462" ) @Export("readBoolean") public boolean readBoolean() { return (this.readUnsignedByte() & 1) == 1; } - @ObfuscatedName("bb") + @ObfuscatedName("bf") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "-2144032387" + garbageValue = "-1021286320" ) @Export("readStringCp1252NullTerminatedOrNull") public String readStringCp1252NullTerminatedOrNull() { @@ -417,10 +417,10 @@ public class Buffer extends Node { } } - @ObfuscatedName("bt") + @ObfuscatedName("by") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "334653243" + garbageValue = "-63676026" ) @Export("readStringCp1252NullTerminated") public String readStringCp1252NullTerminated() { @@ -430,13 +430,13 @@ public class Buffer extends Node { } int var2 = this.offset - var1 - 1; - return var2 == 0 ? "" : ArchiveLoader.decodeStringCp1252(this.array, var1, var2); + return var2 == 0 ? "" : class160.decodeStringCp1252(this.array, var1, var2); } - @ObfuscatedName("by") + @ObfuscatedName("bp") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "-2099106824" + garbageValue = "445274981" ) @Export("readStringCp1252NullCircumfixed") public String readStringCp1252NullCircumfixed() { @@ -450,14 +450,14 @@ public class Buffer extends Node { } int var3 = this.offset - var2 - 1; - return var3 == 0 ? "" : ArchiveLoader.decodeStringCp1252(this.array, var2, var3); + return var3 == 0 ? "" : class160.decodeStringCp1252(this.array, var2, var3); } } - @ObfuscatedName("bq") + @ObfuscatedName("cx") @ObfuscatedSignature( - signature = "(S)Ljava/lang/String;", - garbageValue = "27564" + signature = "(I)Ljava/lang/String;", + garbageValue = "1958782178" ) @Export("readCESU8") public String readCESU8() { @@ -469,17 +469,68 @@ public class Buffer extends Node { if (var2 + this.offset > this.array.length) { throw new IllegalStateException(""); } else { - String var3 = UserComparator6.method3408(this.array, this.offset, var2); + byte[] var4 = this.array; + int var5 = this.offset; + char[] var6 = new char[var2]; + int var7 = 0; + int var8 = var5; + + int var11; + for (int var9 = var5 + var2; var8 < var9; var6[var7++] = (char)var11) { + int var10 = var4[var8++] & 255; + if (var10 < 128) { + if (var10 == 0) { + var11 = 65533; + } else { + var11 = var10; + } + } else if (var10 < 192) { + var11 = 65533; + } else if (var10 < 224) { + if (var8 < var9 && (var4[var8] & 192) == 128) { + var11 = (var10 & 31) << 6 | var4[var8++] & 63; + if (var11 < 128) { + var11 = 65533; + } + } else { + var11 = 65533; + } + } else if (var10 < 240) { + if (var8 + 1 < var9 && (var4[var8] & 192) == 128 && (var4[var8 + 1] & 192) == 128) { + var11 = (var10 & 15) << 12 | (var4[var8++] & 63) << 6 | var4[var8++] & 63; + if (var11 < 2048) { + var11 = 65533; + } + } else { + var11 = 65533; + } + } else if (var10 < 248) { + if (var8 + 2 < var9 && (var4[var8] & 192) == 128 && (var4[var8 + 1] & 192) == 128 && (var4[var8 + 2] & 192) == 128) { + var11 = (var10 & 7) << 18 | (var4[var8++] & 63) << 12 | (var4[var8++] & 63) << 6 | var4[var8++] & 63; + if (var11 >= 65536 && var11 <= 1114111) { + var11 = 65533; + } else { + var11 = 65533; + } + } else { + var11 = 65533; + } + } else { + var11 = 65533; + } + } + + String var3 = new String(var6, 0, var7); this.offset += var2; return var3; } } } - @ObfuscatedName("bo") + @ObfuscatedName("cv") @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "4" + signature = "([BIII)V", + garbageValue = "-2023216453" ) @Export("readBytes") public void readBytes(byte[] var1, int var2, int var3) { @@ -489,10 +540,10 @@ public class Buffer extends Node { } - @ObfuscatedName("br") + @ObfuscatedName("ce") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "953873121" + garbageValue = "1739180184" ) @Export("readShortSmart") public int readShortSmart() { @@ -500,10 +551,10 @@ public class Buffer extends Node { return var1 < 128 ? this.readUnsignedByte() - 64 : this.readUnsignedShort() - 49152; } - @ObfuscatedName("bl") + @ObfuscatedName("cw") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1038515838" + garbageValue = "1284153115" ) @Export("readUShortSmart") public int readUShortSmart() { @@ -511,12 +562,12 @@ public class Buffer extends Node { return var1 < 128 ? this.readUnsignedByte() : this.readUnsignedShort() - 32768; } - @ObfuscatedName("bf") + @ObfuscatedName("cd") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1994836425" + garbageValue = "-1852913201" ) - public int method5457() { + public int method5623() { int var1 = 0; int var2; @@ -528,21 +579,21 @@ public class Buffer extends Node { return var1; } - @ObfuscatedName("bg") + @ObfuscatedName("cn") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "1856744569" + garbageValue = "1135440353" ) - public int method5458() { + public int method5624() { return this.array[this.offset] < 0 ? this.readInt() & Integer.MAX_VALUE : this.readUnsignedShort(); } - @ObfuscatedName("bw") + @ObfuscatedName("cr") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "-9085" + signature = "(I)I", + garbageValue = "918113281" ) - public int method5453() { + public int method5638() { if (this.array[this.offset] < 0) { return this.readInt() & Integer.MAX_VALUE; } else { @@ -551,10 +602,10 @@ public class Buffer extends Node { } } - @ObfuscatedName("bp") + @ObfuscatedName("ci") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1177667309" + signature = "(B)I", + garbageValue = "46" ) @Export("readVarInt") public int readVarInt() { @@ -568,10 +619,10 @@ public class Buffer extends Node { return var2 | var1; } - @ObfuscatedName("cz") + @ObfuscatedName("cy") @ObfuscatedSignature( - signature = "([IB)V", - garbageValue = "0" + signature = "([II)V", + garbageValue = "-1693681803" ) @Export("xteaEncryptAll") public void xteaEncryptAll(int[] var1) { @@ -596,10 +647,10 @@ public class Buffer extends Node { } - @ObfuscatedName("ck") + @ObfuscatedName("cl") @ObfuscatedSignature( - signature = "([II)V", - garbageValue = "1768480831" + signature = "([IB)V", + garbageValue = "68" ) @Export("xteaDecryptAll") public void xteaDecryptAll(int[] var1) { @@ -624,10 +675,10 @@ public class Buffer extends Node { } - @ObfuscatedName("cv") + @ObfuscatedName("co") @ObfuscatedSignature( signature = "([IIII)V", - garbageValue = "-1919695403" + garbageValue = "-2013644278" ) @Export("xteaEncrypt") public void xteaEncrypt(int[] var1, int var2, int var3) { @@ -654,10 +705,10 @@ public class Buffer extends Node { this.offset = var4; } - @ObfuscatedName("co") + @ObfuscatedName("cu") @ObfuscatedSignature( - signature = "([IIIB)V", - garbageValue = "97" + signature = "([IIII)V", + garbageValue = "-1289996541" ) @Export("xteaDecrypt") public void xteaDecrypt(int[] var1, int var2, int var3) { @@ -684,10 +735,10 @@ public class Buffer extends Node { this.offset = var4; } - @ObfuscatedName("cs") + @ObfuscatedName("cz") @ObfuscatedSignature( - signature = "(Ljava/math/BigInteger;Ljava/math/BigInteger;I)V", - garbageValue = "-2071004135" + signature = "(Ljava/math/BigInteger;Ljava/math/BigInteger;B)V", + garbageValue = "46" ) @Export("encryptRsa") public void encryptRsa(BigInteger var1, BigInteger var2) { @@ -703,137 +754,136 @@ public class Buffer extends Node { this.writeBytes(var7, 0, var7.length); } - @ObfuscatedName("cg") + @ObfuscatedName("cq") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "-123385623" + signature = "(IS)I", + garbageValue = "-12364" ) @Export("writeCrc") public int writeCrc(int var1) { - int var2 = LoginScreenAnimation.method1848(this.array, var1, this.offset); + int var2 = class3.method50(this.array, var1, this.offset); this.writeInt(var2); return var2; } - @ObfuscatedName("cn") + @ObfuscatedName("cj") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-1463177032" + signature = "(B)Z", + garbageValue = "0" ) @Export("checkCrc") public boolean checkCrc() { this.offset -= 4; - int var1 = LoginScreenAnimation.method1848(this.array, 0, this.offset); + int var1 = class3.method50(this.array, 0, this.offset); int var2 = this.readInt(); - return var2 == var1; + return var1 == var2; } - @ObfuscatedName("cd") + @ObfuscatedName("cm") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1145773072" + garbageValue = "274218508" ) - public void method5467(int var1) { + public void method5634(int var1) { this.array[++this.offset - 1] = (byte)(var1 + 128); } - @ObfuscatedName("cy") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "8" - ) - public void method5468(int var1) { - this.array[++this.offset - 1] = (byte)(0 - var1); - } - - @ObfuscatedName("cj") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "91" - ) - public void method5461(int var1) { - this.array[++this.offset - 1] = (byte)(128 - var1); - } - @ObfuscatedName("cb") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-108626677" + signature = "(II)V", + garbageValue = "-1061719400" ) - public int method5470() { + public void method5635(int var1) { + this.array[++this.offset - 1] = (byte)(0 - var1); + } + + @ObfuscatedName("cp") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-1910519130" + ) + public void method5636(int var1) { + this.array[++this.offset - 1] = (byte)(128 - var1); + } + + @ObfuscatedName("cs") + @ObfuscatedSignature( + signature = "(B)I", + garbageValue = "21" + ) + public int method5697() { return this.array[++this.offset - 1] - 128 & 255; } - @ObfuscatedName("cr") + @ObfuscatedName("ck") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-313206497" + garbageValue = "-806225833" ) - public int method5471() { + public int method5622() { return 0 - this.array[++this.offset - 1] & 255; } @ObfuscatedName("ct") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1489408789" + signature = "(B)I", + garbageValue = "6" ) - public int method5511() { + public int method5639() { return 128 - this.array[++this.offset - 1] & 255; } - @ObfuscatedName("ci") - @ObfuscatedSignature( - signature = "(I)B", - garbageValue = "-961755482" - ) - public byte method5473() { - return (byte)(this.array[++this.offset - 1] - 128); - } - - @ObfuscatedName("cu") - @ObfuscatedSignature( - signature = "(I)B", - garbageValue = "-675073982" - ) - public byte method5474() { - return (byte)(0 - this.array[++this.offset - 1]); - } - - @ObfuscatedName("ce") - @ObfuscatedSignature( - signature = "(I)B", - garbageValue = "-598630050" - ) - public byte method5475() { - return (byte)(128 - this.array[++this.offset - 1]); - } - @ObfuscatedName("cc") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1760464682" + signature = "(I)B", + garbageValue = "-787549657" ) - public void method5476(int var1) { + public byte method5640() { + return (byte)(this.array[++this.offset - 1] - 128); + } + + @ObfuscatedName("ch") + @ObfuscatedSignature( + signature = "(I)B", + garbageValue = "-1656298865" + ) + public byte method5671() { + return (byte)(0 - this.array[++this.offset - 1]); + } + + @ObfuscatedName("cg") + @ObfuscatedSignature( + signature = "(I)B", + garbageValue = "1929724921" + ) + public byte method5763() { + return (byte)(128 - this.array[++this.offset - 1]); + } + + @ObfuscatedName("cf") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "1201605899" + ) + public void method5643(int var1) { this.array[++this.offset - 1] = (byte)var1; this.array[++this.offset - 1] = (byte)(var1 >> 8); } - @ObfuscatedName("cl") + @ObfuscatedName("ca") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1748318243" + garbageValue = "-1719673408" ) - @Export("writeIntME") - public void writeIntME(int var1) { + public void method5644(int var1) { this.array[++this.offset - 1] = (byte)(var1 >> 8); this.array[++this.offset - 1] = (byte)(var1 + 128); } - @ObfuscatedName("cw") + @ObfuscatedName("db") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "921627728" + garbageValue = "-1488299936" ) @Export("writeShortLE") public void writeShortLE(int var1) { @@ -841,42 +891,42 @@ public class Buffer extends Node { this.array[++this.offset - 1] = (byte)(var1 >> 8); } - @ObfuscatedName("cq") + @ObfuscatedName("dq") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-509396216" + signature = "(S)I", + garbageValue = "-7547" ) - public int method5479() { + public int method5646() { this.offset += 2; return ((this.array[this.offset - 1] & 255) << 8) + (this.array[this.offset - 2] & 255); } - @ObfuscatedName("ca") + @ObfuscatedName("dd") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "2084520877" + signature = "(B)I", + garbageValue = "96" ) - public int method5480() { + public int method5647() { this.offset += 2; return (this.array[this.offset - 1] - 128 & 255) + ((this.array[this.offset - 2] & 255) << 8); } - @ObfuscatedName("cf") + @ObfuscatedName("dl") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "1941268038" + garbageValue = "1001624658" ) - public int method5647() { + public int method5648() { this.offset += 2; return ((this.array[this.offset - 1] & 255) << 8) + (this.array[this.offset - 2] - 128 & 255); } - @ObfuscatedName("cx") + @ObfuscatedName("dm") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1363651075" + garbageValue = "1363257322" ) - public int method5486() { + public int method5649() { this.offset += 2; int var1 = ((this.array[this.offset - 1] & 255) << 8) + (this.array[this.offset - 2] & 255); if (var1 > 32767) { @@ -886,12 +936,12 @@ public class Buffer extends Node { return var1; } - @ObfuscatedName("cm") + @ObfuscatedName("di") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "649688108" + signature = "(B)I", + garbageValue = "-11" ) - public int method5504() { + public int method5650() { this.offset += 2; int var1 = (this.array[this.offset - 1] - 128 & 255) + ((this.array[this.offset - 2] & 255) << 8); if (var1 > 32767) { @@ -901,12 +951,12 @@ public class Buffer extends Node { return var1; } - @ObfuscatedName("cp") + @ObfuscatedName("dn") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1593001312" + signature = "(B)I", + garbageValue = "60" ) - public int method5484() { + public int method5651() { this.offset += 2; int var1 = ((this.array[this.offset - 1] & 255) << 8) + (this.array[this.offset - 2] - 128 & 255); if (var1 > 32767) { @@ -916,112 +966,89 @@ public class Buffer extends Node { return var1; } - @ObfuscatedName("ch") - @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-1821828851" - ) - public void method5485(int var1) { - this.array[++this.offset - 1] = (byte)var1; - this.array[++this.offset - 1] = (byte)(var1 >> 8); - this.array[++this.offset - 1] = (byte)(var1 >> 16); - } - - @ObfuscatedName("dt") + @ObfuscatedName("dr") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-715044381" + garbageValue = "842389221" ) - public int method5488() { + public int method5678() { this.offset += 3; - return (this.array[this.offset - 3] & 255) + ((this.array[this.offset - 2] & 255) << 8) + ((this.array[this.offset - 1] & 255) << 16); + return (this.array[this.offset - 1] & 255) + ((this.array[this.offset - 3] & 255) << 8) + ((this.array[this.offset - 2] & 255) << 16); } - @ObfuscatedName("dv") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "-115" - ) - @Export("writeIntLE16") - public void writeIntLE16(int var1) { - this.array[++this.offset - 1] = (byte)var1; - this.array[++this.offset - 1] = (byte)(var1 >> 8); - this.array[++this.offset - 1] = (byte)(var1 >> 16); - this.array[++this.offset - 1] = (byte)(var1 >> 24); - } - - @ObfuscatedName("dm") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "81" - ) - public void method5630(int var1) { - this.array[++this.offset - 1] = (byte)(var1 >> 8); - this.array[++this.offset - 1] = (byte)var1; - this.array[++this.offset - 1] = (byte)(var1 >> 24); - this.array[++this.offset - 1] = (byte)(var1 >> 16); - } - - @ObfuscatedName("dn") + @ObfuscatedName("do") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "775210063" + garbageValue = "-1296850548" ) - public void method5489(int var1) { + public void method5653(int var1) { + this.array[++this.offset - 1] = (byte)var1; + this.array[++this.offset - 1] = (byte)(var1 >> 8); + this.array[++this.offset - 1] = (byte)(var1 >> 16); + this.array[++this.offset - 1] = (byte)(var1 >> 24); + } + + @ObfuscatedName("ds") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-232914500" + ) + @Export("writeIntME") + public void writeIntME(int var1) { + this.array[++this.offset - 1] = (byte)(var1 >> 8); + this.array[++this.offset - 1] = (byte)var1; + this.array[++this.offset - 1] = (byte)(var1 >> 24); + this.array[++this.offset - 1] = (byte)(var1 >> 16); + } + + @ObfuscatedName("dz") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-1673259479" + ) + public void method5655(int var1) { this.array[++this.offset - 1] = (byte)(var1 >> 16); this.array[++this.offset - 1] = (byte)(var1 >> 24); this.array[++this.offset - 1] = (byte)var1; this.array[++this.offset - 1] = (byte)(var1 >> 8); } - @ObfuscatedName("dq") + @ObfuscatedName("dj") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "338391955" + signature = "(B)I", + garbageValue = "-18" ) - public int method5482() { + public int method5656() { this.offset += 4; return (this.array[this.offset - 4] & 255) + ((this.array[this.offset - 3] & 255) << 8) + ((this.array[this.offset - 2] & 255) << 16) + ((this.array[this.offset - 1] & 255) << 24); } - @ObfuscatedName("dy") + @ObfuscatedName("df") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "311573145" + garbageValue = "-1810248535" ) - public int method5561() { + public int method5796() { this.offset += 4; return ((this.array[this.offset - 2] & 255) << 24) + ((this.array[this.offset - 4] & 255) << 8) + (this.array[this.offset - 3] & 255) + ((this.array[this.offset - 1] & 255) << 16); } - @ObfuscatedName("de") + @ObfuscatedName("da") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "5" + signature = "(I)I", + garbageValue = "-1563321841" ) - public int method5492() { + public int method5603() { this.offset += 4; return ((this.array[this.offset - 1] & 255) << 8) + ((this.array[this.offset - 4] & 255) << 16) + (this.array[this.offset - 2] & 255) + ((this.array[this.offset - 3] & 255) << 24); } - @ObfuscatedName("df") + @ObfuscatedName("dg") @ObfuscatedSignature( signature = "([BIII)V", - garbageValue = "641640947" + garbageValue = "-2008997891" ) - public void method5493(byte[] var1, int var2, int var3) { - for (int var4 = var2; var4 < var3 + var2; ++var4) { - var1[var4] = (byte)(this.array[++this.offset - 1] - 128); - } - - } - - @ObfuscatedName("dr") - @ObfuscatedSignature( - signature = "([BIII)V", - garbageValue = "666802900" - ) - public void method5494(byte[] var1, int var2, int var3) { + public void method5702(byte[] var1, int var2, int var3) { for (int var4 = var3 + var2 - 1; var4 >= var2; --var4) { var1[var4] = (byte)(this.array[++this.offset - 1] - 128); } diff --git a/runescape-client/src/main/java/BufferedFile.java b/runescape-client/src/main/java/BufferedFile.java index 201033f761..c36f6d19d8 100644 --- a/runescape-client/src/main/java/BufferedFile.java +++ b/runescape-client/src/main/java/BufferedFile.java @@ -6,66 +6,66 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("mm") +@ObfuscatedName("mz") @Implements("BufferedFile") public class BufferedFile { - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lmh;" ) @Export("accessFile") AccessFile accessFile; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("readBuffer") byte[] readBuffer; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - longValue = -7294963934648719297L + longValue = -3262164853072505693L ) @Export("readBufferOffset") long readBufferOffset; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1845108509 + intValue = -773924091 ) @Export("readBufferLength") int readBufferLength; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("writeBuffer") byte[] writeBuffer; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - longValue = -8408813098273597985L + longValue = 2584269110563809293L ) @Export("writeBufferOffset") long writeBufferOffset; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 1704738159 + intValue = 2068321047 ) @Export("writeBufferLength") int writeBufferLength; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - longValue = -7862153769092129291L + longValue = 6372981625088766905L ) @Export("offset") long offset; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - longValue = 3070804450108675653L + longValue = 7685888135171302975L ) @Export("fileLength") long fileLength; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - longValue = 8830743471394433983L + longValue = -4038469138705030175L ) @Export("length") long length; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - longValue = 3243026924650541047L + longValue = 8140662089348975089L ) @Export("fileOffset") long fileOffset; @@ -84,10 +84,10 @@ public class BufferedFile { this.offset = 0L; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-55" + garbageValue = "57" ) @Export("close") public void close() throws IOException { @@ -95,7 +95,7 @@ public class BufferedFile { this.accessFile.close(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("seek") public void seek(long var1) throws IOException { if (var1 < 0L) { @@ -105,30 +105,30 @@ public class BufferedFile { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(S)J", - garbageValue = "15865" + signature = "(B)J", + garbageValue = "87" ) @Export("length") public long length() { return this.length; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "([BI)V", - garbageValue = "588547682" + signature = "([BS)V", + garbageValue = "1024" ) @Export("readFully") public void readFully(byte[] var1) throws IOException { this.read(var1, 0, var1.length); } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "-41" + signature = "([BIII)V", + garbageValue = "2116217795" ) @Export("read") public void read(byte[] var1, int var2, int var3) throws IOException { @@ -137,7 +137,7 @@ public class BufferedFile { throw new ArrayIndexOutOfBoundsException(var3 + var2 - var1.length); } - if (this.writeBufferOffset != -1L && this.offset >= this.writeBufferOffset && (long)var3 + this.offset <= (long)this.writeBufferLength + this.writeBufferOffset) { + if (-1L != this.writeBufferOffset && this.offset >= this.writeBufferOffset && this.offset + (long)var3 <= (long)this.writeBufferLength + this.writeBufferOffset) { System.arraycopy(this.writeBuffer, (int)(this.offset - this.writeBufferOffset), var1, var2, var3); this.offset += (long)var3; return; @@ -146,7 +146,7 @@ public class BufferedFile { long var4 = this.offset; int var7 = var3; int var8; - if (this.offset >= this.readBufferOffset && this.offset < this.readBufferOffset + (long)this.readBufferLength) { + if (this.offset >= this.readBufferOffset && this.offset < (long)this.readBufferLength + this.readBufferOffset) { var8 = (int)((long)this.readBufferLength - (this.offset - this.readBufferOffset)); if (var8 > var3) { var8 = var3; @@ -202,14 +202,14 @@ public class BufferedFile { long var10 = -1L; if (this.writeBufferOffset >= var4 && this.writeBufferOffset < (long)var7 + var4) { var13 = this.writeBufferOffset; - } else if (var4 >= this.writeBufferOffset && var4 < this.writeBufferOffset + (long)this.writeBufferLength) { + } else if (var4 >= this.writeBufferOffset && var4 < (long)this.writeBufferLength + this.writeBufferOffset) { var13 = var4; } - if (this.writeBufferOffset + (long)this.writeBufferLength > var4 && (long)this.writeBufferLength + this.writeBufferOffset <= var4 + (long)var7) { + if ((long)this.writeBufferLength + this.writeBufferOffset > var4 && this.writeBufferOffset + (long)this.writeBufferLength <= (long)var7 + var4) { var10 = (long)this.writeBufferLength + this.writeBufferOffset; - } else if (var4 + (long)var7 > this.writeBufferOffset && var4 + (long)var7 <= this.writeBufferOffset + (long)this.writeBufferLength) { - var10 = (long)var7 + var4; + } else if ((long)var7 + var4 > this.writeBufferOffset && (long)var7 + var4 <= (long)this.writeBufferLength + this.writeBufferOffset) { + var10 = var4 + (long)var7; } if (var13 > -1L && var10 > var13) { @@ -231,15 +231,15 @@ public class BufferedFile { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "77" + garbageValue = "27" ) @Export("load") void load() throws IOException { this.readBufferLength = 0; - if (this.offset != this.fileOffset) { + if (this.fileOffset != this.offset) { this.accessFile.seek(this.offset); this.fileOffset = this.offset; } @@ -261,23 +261,23 @@ public class BufferedFile { } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "([BIII)V", - garbageValue = "2016597591" + garbageValue = "2065277497" ) @Export("write") public void write(byte[] var1, int var2, int var3) throws IOException { try { - if ((long)var3 + this.offset > this.length) { - this.length = (long)var3 + this.offset; + if (this.offset + (long)var3 > this.length) { + this.length = this.offset + (long)var3; } - if (-1L != this.writeBufferOffset && (this.offset < this.writeBufferOffset || this.offset > (long)this.writeBufferLength + this.writeBufferOffset)) { + if (-1L != this.writeBufferOffset && (this.offset < this.writeBufferOffset || this.offset > this.writeBufferOffset + (long)this.writeBufferLength)) { this.flush(); } - if (-1L != this.writeBufferOffset && (long)var3 + this.offset > this.writeBufferOffset + (long)this.writeBuffer.length) { + if (this.writeBufferOffset != -1L && (long)var3 + this.offset > this.writeBufferOffset + (long)this.writeBuffer.length) { int var4 = (int)((long)this.writeBuffer.length - (this.offset - this.writeBufferOffset)); System.arraycopy(var1, var2, this.writeBuffer, (int)(this.offset - this.writeBufferOffset), var4); this.offset += (long)var4; @@ -316,14 +316,14 @@ public class BufferedFile { long var6 = -1L; if (this.offset >= this.readBufferOffset && this.offset < (long)this.readBufferLength + this.readBufferOffset) { var9 = this.offset; - } else if (this.readBufferOffset >= this.offset && this.readBufferOffset < this.offset + (long)var3) { + } else if (this.readBufferOffset >= this.offset && this.readBufferOffset < (long)var3 + this.offset) { var9 = this.readBufferOffset; } - if ((long)var3 + this.offset > this.readBufferOffset && (long)var3 + this.offset <= this.readBufferOffset + (long)this.readBufferLength) { - var6 = this.offset + (long)var3; - } else if (this.readBufferOffset + (long)this.readBufferLength > this.offset && this.readBufferOffset + (long)this.readBufferLength <= this.offset + (long)var3) { - var6 = (long)this.readBufferLength + this.readBufferOffset; + if (this.offset + (long)var3 > this.readBufferOffset && this.offset + (long)var3 <= (long)this.readBufferLength + this.readBufferOffset) { + var6 = (long)var3 + this.offset; + } else if ((long)this.readBufferLength + this.readBufferOffset > this.offset && (long)this.readBufferLength + this.readBufferOffset <= this.offset + (long)var3) { + var6 = this.readBufferOffset + (long)this.readBufferLength; } if (var9 > -1L && var6 > var9) { @@ -339,21 +339,21 @@ public class BufferedFile { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "928727943" + signature = "(B)V", + garbageValue = "4" ) @Export("flush") void flush() throws IOException { - if (-1L != this.writeBufferOffset) { + if (this.writeBufferOffset != -1L) { if (this.fileOffset != this.writeBufferOffset) { this.accessFile.seek(this.writeBufferOffset); this.fileOffset = this.writeBufferOffset; } this.accessFile.write(this.writeBuffer, 0, this.writeBufferLength); - this.fileOffset += (long)(this.writeBufferLength * -1599618673) * 1704738159L; + this.fileOffset += 2068321047L * (long)(this.writeBufferLength * 1929925799); if (this.fileOffset > this.fileLength) { this.fileLength = this.fileOffset; } @@ -362,14 +362,14 @@ public class BufferedFile { long var3 = -1L; if (this.writeBufferOffset >= this.readBufferOffset && this.writeBufferOffset < this.readBufferOffset + (long)this.readBufferLength) { var1 = this.writeBufferOffset; - } else if (this.readBufferOffset >= this.writeBufferOffset && this.readBufferOffset < this.writeBufferOffset + (long)this.writeBufferLength) { + } else if (this.readBufferOffset >= this.writeBufferOffset && this.readBufferOffset < (long)this.writeBufferLength + this.writeBufferOffset) { var1 = this.readBufferOffset; } if ((long)this.writeBufferLength + this.writeBufferOffset > this.readBufferOffset && (long)this.writeBufferLength + this.writeBufferOffset <= (long)this.readBufferLength + this.readBufferOffset) { var3 = (long)this.writeBufferLength + this.writeBufferOffset; - } else if ((long)this.readBufferLength + this.readBufferOffset > this.writeBufferOffset && this.readBufferOffset + (long)this.readBufferLength <= this.writeBufferOffset + (long)this.writeBufferLength) { - var3 = (long)this.readBufferLength + this.readBufferOffset; + } else if (this.readBufferOffset + (long)this.readBufferLength > this.writeBufferOffset && this.readBufferOffset + (long)this.readBufferLength <= this.writeBufferOffset + (long)this.writeBufferLength) { + var3 = this.readBufferOffset + (long)this.readBufferLength; } if (var1 > -1L && var3 > var1) { diff --git a/runescape-client/src/main/java/BufferedNetSocket.java b/runescape-client/src/main/java/BufferedNetSocket.java index ef5c70f176..d8cf6916e5 100644 --- a/runescape-client/src/main/java/BufferedNetSocket.java +++ b/runescape-client/src/main/java/BufferedNetSocket.java @@ -1,38 +1,30 @@ import java.io.IOException; import java.net.Socket; -import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kd") +@ObfuscatedName("kg") @Implements("BufferedNetSocket") public class BufferedNetSocket extends AbstractSocket { - @ObfuscatedName("w") - @ObfuscatedGetter( - intValue = 966969419 - ) - @Export("cacheGamebuild") - public static int cacheGamebuild; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("socket") Socket socket; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lkx;" + signature = "Lkl;" ) @Export("source") BufferedSource source; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lkv;" + signature = "Lkn;" ) @Export("sink") BufferedSink sink; - public BufferedNetSocket(Socket var1, int var2, int var3) throws IOException { + BufferedNetSocket(Socket var1, int var2, int var3) throws IOException { this.socket = var1; this.socket.setSoTimeout(30000); this.socket.setTcpNoDelay(true); @@ -42,10 +34,10 @@ public class BufferedNetSocket extends AbstractSocket { this.sink = new BufferedSink(this.socket.getOutputStream(), var3); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-119" + signature = "(I)V", + garbageValue = "1632517280" ) @Export("close") public void close() { @@ -59,50 +51,50 @@ public class BufferedNetSocket extends AbstractSocket { this.source.close(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1784126558" + signature = "(B)I", + garbageValue = "0" ) @Export("readUnsignedByte") public int readUnsignedByte() throws IOException { return this.source.readUnsignedByte(); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "3" + garbageValue = "-1" ) @Export("available") public int available() throws IOException { return this.source.available(); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-336706705" + garbageValue = "1174929907" ) @Export("isAvailable") public boolean isAvailable(int var1) throws IOException { return this.source.isAvailable(var1); } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "([BIII)I", - garbageValue = "-2035668362" + garbageValue = "1681485484" ) @Export("read") public int read(byte[] var1, int var2, int var3) throws IOException { return this.source.read(var1, var2, var3); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "-68" + signature = "([BIII)V", + garbageValue = "1989353375" ) @Export("write") public void write(byte[] var1, int var2, int var3) throws IOException { @@ -112,44 +104,4 @@ public class BufferedNetSocket extends AbstractSocket { protected void finalize() { this.close(); } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "2009022285" - ) - @Export("loadWorlds") - static boolean loadWorlds() { - try { - if (class51.World_request == null) { - class51.World_request = Client.urlRequester.request(new URL(WorldMapSectionType.field150)); - } else if (class51.World_request.isDone()) { - byte[] var0 = class51.World_request.getResponse(); - Buffer var1 = new Buffer(var0); - var1.readInt(); - World.World_count = var1.readUnsignedShort(); - World.World_worlds = new World[World.World_count]; - - World var3; - for (int var2 = 0; var2 < World.World_count; var3.index = var2++) { - var3 = World.World_worlds[var2] = new World(); - var3.id = var1.readUnsignedShort(); - var3.properties = var1.readInt(); - var3.host = var1.readStringCp1252NullTerminated(); - var3.activity = var1.readStringCp1252NullTerminated(); - var3.location = var1.readUnsignedByte(); - var3.population = var1.readShort(); - } - - WorldMapData_0.sortWorlds(World.World_worlds, 0, World.World_worlds.length - 1, World.World_sortOption1, World.World_sortOption2); - class51.World_request = null; - return true; - } - } catch (Exception var4) { - var4.printStackTrace(); - class51.World_request = null; - } - - return false; - } } diff --git a/runescape-client/src/main/java/BufferedSink.java b/runescape-client/src/main/java/BufferedSink.java index c3a67af5ca..e525b043b7 100644 --- a/runescape-client/src/main/java/BufferedSink.java +++ b/runescape-client/src/main/java/BufferedSink.java @@ -6,46 +6,40 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kv") +@ObfuscatedName("kn") @Implements("BufferedSink") public class BufferedSink implements Runnable { - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "Lbr;" - ) - @Export("loginScreenRunesAnimation") - static LoginScreenAnimation loginScreenRunesAnimation; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("thread") Thread thread; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("outputStream") OutputStream outputStream; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1047270953 + intValue = 1704761219 ) @Export("capacity") int capacity; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("buffer") byte[] buffer; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 205486611 + intValue = -1398859285 ) @Export("position") int position; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1646863699 + intValue = 1220399631 ) @Export("limit") int limit; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("exception") IOException exception; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("closed") boolean closed; @@ -60,10 +54,10 @@ public class BufferedSink implements Runnable { this.thread.start(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "-57" + signature = "(I)Z", + garbageValue = "-1040331430" ) @Export("isClosed") boolean isClosed() { @@ -85,10 +79,10 @@ public class BufferedSink implements Runnable { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "30" + signature = "([BIII)V", + garbageValue = "-2046611751" ) @Export("write") void write(byte[] var1, int var2, int var3) throws IOException { @@ -125,10 +119,10 @@ public class BufferedSink implements Runnable { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1627292871" + garbageValue = "96034687" ) @Export("close") void close() { @@ -203,72 +197,4 @@ public class BufferedSink implements Runnable { } while(!this.isClosed()); } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lli;I)I", - garbageValue = "-828018974" - ) - static final int method5794(LoginType var0) { - if (var0 == null) { - return 12; - } else { - switch(var0.field4033) { - case 0: - return 20; - default: - return 12; - } - } - } - - @ObfuscatedName("fm") - @ObfuscatedSignature( - signature = "(Lho;IIB)V", - garbageValue = "-112" - ) - @Export("checkIfMinimapClicked") - static final void checkIfMinimapClicked(Widget var0, int var1, int var2) { - if (Client.minimapState == 0 || Client.minimapState == 3) { - if (!Client.isMenuOpen && (MouseHandler.MouseHandler_lastButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_lastButton == 4)) { - SpriteMask var3 = var0.getSpriteMask(true); - if (var3 == null) { - return; - } - - int var4 = MouseHandler.MouseHandler_lastPressedX - var1; - int var5 = MouseHandler.MouseHandler_lastPressedY - var2; - if (var3.contains(var4, var5)) { - var4 -= var3.width / 2; - var5 -= var3.height / 2; - int var6 = Client.camAngleY & 2047; - int var7 = Rasterizer3D.Rasterizer3D_sine[var6]; - int var8 = Rasterizer3D.Rasterizer3D_cosine[var6]; - int var9 = var5 * var7 + var4 * var8 >> 11; - int var10 = var5 * var8 - var7 * var4 >> 11; - int var11 = var9 + class223.localPlayer.x >> 7; - int var12 = class223.localPlayer.y - var10 >> 7; - PacketBufferNode var13 = InterfaceParent.getPacketBufferNode(ClientPacket.field2275, Client.packetWriter.isaacCipher); - var13.packetBuffer.writeByte(18); - var13.packetBuffer.writeShortLE(class223.baseX * 64 + var11); - var13.packetBuffer.method5476(class286.baseY * 64 + var12); - var13.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? (KeyHandler.KeyHandler_pressedKeys[81] ? 2 : 1) : 0); - var13.packetBuffer.writeByte(var4); - var13.packetBuffer.writeByte(var5); - var13.packetBuffer.writeShort(Client.camAngleY); - var13.packetBuffer.writeByte(57); - var13.packetBuffer.writeByte(0); - var13.packetBuffer.writeByte(0); - var13.packetBuffer.writeByte(89); - var13.packetBuffer.writeShort(class223.localPlayer.x); - var13.packetBuffer.writeShort(class223.localPlayer.y); - var13.packetBuffer.writeByte(63); - Client.packetWriter.addNode(var13); - Client.destinationX = var11; - Client.destinationY = var12; - } - } - - } - } } diff --git a/runescape-client/src/main/java/BufferedSource.java b/runescape-client/src/main/java/BufferedSource.java index c28c9da82f..b1e081a165 100644 --- a/runescape-client/src/main/java/BufferedSource.java +++ b/runescape-client/src/main/java/BufferedSource.java @@ -7,37 +7,37 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kx") +@ObfuscatedName("kl") @Implements("BufferedSource") public class BufferedSource implements Runnable { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("thread") Thread thread; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("inputStream") InputStream inputStream; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1837703949 + intValue = -1673259479 ) @Export("capacity") int capacity; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("buffer") byte[] buffer; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 496960127 + intValue = 571240185 ) @Export("position") int position; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -589477741 + intValue = -143003191 ) @Export("limit") int limit; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("exception") IOException exception; @@ -52,10 +52,10 @@ public class BufferedSource implements Runnable { this.thread.start(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IB)Z", - garbageValue = "-42" + signature = "(II)Z", + garbageValue = "1194815492" ) @Export("isAvailable") boolean isAvailable(int var1) throws IOException { @@ -86,10 +86,10 @@ public class BufferedSource implements Runnable { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-99" + signature = "(S)I", + garbageValue = "256" ) @Export("available") int available() throws IOException { @@ -110,15 +110,15 @@ public class BufferedSource implements Runnable { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "1540455812" + garbageValue = "418616079" ) @Export("readUnsignedByte") int readUnsignedByte() throws IOException { synchronized(this) { - if (this.limit == this.position) { + if (this.position == this.limit) { if (this.exception != null) { throw new IOException(this.exception.toString()); } else { @@ -133,10 +133,10 @@ public class BufferedSource implements Runnable { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "([BIII)I", - garbageValue = "2103598010" + garbageValue = "153221716" ) @Export("read") int read(byte[] var1, int var2, int var3) throws IOException { @@ -174,10 +174,10 @@ public class BufferedSource implements Runnable { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "2069219110" + garbageValue = "-206595375" ) @Export("close") void close() { @@ -243,4 +243,26 @@ public class BufferedSource implements Runnable { } } } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(II)Lio;", + garbageValue = "-139133141" + ) + @Export("KitDefinition_get") + public static KitDefinition KitDefinition_get(int var0) { + KitDefinition var1 = (KitDefinition)KitDefinition.KitDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = KitDefinition.KitDefinition_archive.takeFile(3, var0); + var1 = new KitDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + + KitDefinition.KitDefinition_cached.put(var1, (long)var0); + return var1; + } + } } diff --git a/runescape-client/src/main/java/ByteArrayNode.java b/runescape-client/src/main/java/ByteArrayNode.java index 5127ccb0a0..fb76fe1b7c 100644 --- a/runescape-client/src/main/java/ByteArrayNode.java +++ b/runescape-client/src/main/java/ByteArrayNode.java @@ -2,10 +2,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("fl") +@ObfuscatedName("fq") @Implements("ByteArrayNode") public class ByteArrayNode extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("byteArray") public byte[] byteArray; diff --git a/runescape-client/src/main/java/ByteArrayPool.java b/runescape-client/src/main/java/ByteArrayPool.java index f6ccea5da9..76ec2c7a0c 100644 --- a/runescape-client/src/main/java/ByteArrayPool.java +++ b/runescape-client/src/main/java/ByteArrayPool.java @@ -1,45 +1,49 @@ +import java.util.Iterator; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kt") +@ObfuscatedName("kz") @Implements("ByteArrayPool") public class ByteArrayPool { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1085109787 + intValue = -261452537 ) @Export("ByteArrayPool_smallCount") static int ByteArrayPool_smallCount; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -745592959 + intValue = -718717257 ) @Export("ByteArrayPool_mediumCount") static int ByteArrayPool_mediumCount; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1171490501 + intValue = -1909793595 ) @Export("ByteArrayPool_largeCount") static int ByteArrayPool_largeCount; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("ByteArrayPool_small") static byte[][] ByteArrayPool_small; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("ByteArrayPool_medium") static byte[][] ByteArrayPool_medium; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("ByteArrayPool_large") static byte[][] ByteArrayPool_large; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("ByteArrayPool_alternativeSizes") - public static int[] ByteArrayPool_alternativeSizes; - @ObfuscatedName("m") - @Export("ByteArrayPool_altSizeArrayCounts") - public static int[] ByteArrayPool_altSizeArrayCounts; + static int[] ByteArrayPool_alternativeSizes; + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "Ldm;" + ) + @Export("soundCache") + public static SoundCache soundCache; static { ByteArrayPool_smallCount = 0; @@ -50,10 +54,10 @@ public class ByteArrayPool { ByteArrayPool_large = new byte[50][]; } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IZB)[B", - garbageValue = "-44" + signature = "(IZI)[B", + garbageValue = "77699142" ) @Export("ByteArrayPool_getArrayBool") static synchronized byte[] ByteArrayPool_getArrayBool(int var0, boolean var1) { @@ -85,14 +89,14 @@ public class ByteArrayPool { return var2; } - if (class81.ByteArrayPool_arrays != null) { + if (HorizontalAlignment.ByteArrayPool_arrays != null) { for (int var4 = 0; var4 < ByteArrayPool_alternativeSizes.length; ++var4) { if (ByteArrayPool_alternativeSizes[var4] != var0) { if (var0 < ByteArrayPool_alternativeSizes[var4]) { } - } else if (ByteArrayPool_altSizeArrayCounts[var4] > 0) { - byte[] var3 = class81.ByteArrayPool_arrays[var4][--ByteArrayPool_altSizeArrayCounts[var4]]; - class81.ByteArrayPool_arrays[var4][ByteArrayPool_altSizeArrayCounts[var4]] = null; + } else if (class222.ByteArrayPool_altSizeArrayCounts[var4] > 0) { + byte[] var3 = HorizontalAlignment.ByteArrayPool_arrays[var4][--class222.ByteArrayPool_altSizeArrayCounts[var4]]; + HorizontalAlignment.ByteArrayPool_arrays[var4][class222.ByteArrayPool_altSizeArrayCounts[var4]] = null; return var3; } } @@ -100,4 +104,46 @@ public class ByteArrayPool { return new byte[var0]; } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Ljava/lang/Throwable;Ljava/lang/String;)Lmf;" + ) + @Export("newRunException") + public static RunException newRunException(Throwable var0, String var1) { + RunException var2; + if (var0 instanceof RunException) { + var2 = (RunException)var0; + var2.message = var2.message + ' ' + var1; + } else { + var2 = new RunException(var0, var1); + } + + return var2; + } + + @ObfuscatedName("ke") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1348959879" + ) + @Export("FriendSystem_invalidateFriends") + static final void FriendSystem_invalidateFriends() { + for (int var0 = 0; var0 < Players.Players_count; ++var0) { + Player var1 = Client.players[Players.Players_indices[var0]]; + var1.clearIsFriend(); + } + + Iterator var2 = Messages.Messages_hashTable.iterator(); + + while (var2.hasNext()) { + Message var3 = (Message)var2.next(); + var3.clearIsFromFriend(); + } + + if (class4.clanChat != null) { + class4.clanChat.clearFriends(); + } + + } } diff --git a/runescape-client/src/main/java/Calendar.java b/runescape-client/src/main/java/Calendar.java index 99ac1f837a..1cc8b8fee4 100644 --- a/runescape-client/src/main/java/Calendar.java +++ b/runescape-client/src/main/java/Calendar.java @@ -4,18 +4,24 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gz") +@ObfuscatedName("gi") @Implements("Calendar") public class Calendar { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("MONTH_NAMES_ENGLISH_GERMAN") public static final String[][] MONTH_NAMES_ENGLISH_GERMAN; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("DAYS_OF_THE_WEEK") public static final String[] DAYS_OF_THE_WEEK; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("Calendar_calendar") public static java.util.Calendar Calendar_calendar; + @ObfuscatedName("b") + @ObfuscatedSignature( + signature = "Lkc;" + ) + @Export("NetCache_reference") + public static Buffer NetCache_reference; static { MONTH_NAMES_ENGLISH_GERMAN = new String[][]{{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}, {"Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"}, {"jan", "fév", "mars", "avr", "mai", "juin", "juil", "août", "sept", "oct", "nov", "déc"}, {"jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"}, {"jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"}, {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}, {"ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"}}; @@ -24,38 +30,86 @@ public class Calendar { Calendar_calendar = java.util.Calendar.getInstance(TimeZone.getTimeZone("GMT")); } - @ObfuscatedName("y") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(Lho;I[B[BB)V", - garbageValue = "-75" + signature = "(I)I", + garbageValue = "-2132557577" ) - @Export("Widget_setKey") - static final void Widget_setKey(Widget var0, int var1, byte[] var2, byte[] var3) { - if (var0.field2552 == null) { - if (var2 == null) { - return; - } + static final int method4102() { + return ViewportMouse.ViewportMouse_x; + } - var0.field2552 = new byte[11][]; - var0.field2621 = new byte[11][]; - var0.field2586 = new int[11]; - var0.field2548 = new int[11]; + @ObfuscatedName("gd") + @ObfuscatedSignature( + signature = "(IIIIZI)V", + garbageValue = "399120527" + ) + @Export("setViewportShape") + static final void setViewportShape(int var0, int var1, int var2, int var3, boolean var4) { + if (var2 < 1) { + var2 = 1; } - var0.field2552[var1] = var2; - if (var2 != null) { - var0.field2619 = true; + if (var3 < 1) { + var3 = 1; + } + + int var5 = var3 - 334; + int var6; + if (var5 < 0) { + var6 = Client.field881; + } else if (var5 >= 100) { + var6 = Client.field882; } else { - var0.field2619 = false; + var6 = (Client.field882 - Client.field881) * var5 / 100 + Client.field881; + } - for (int var4 = 0; var4 < var0.field2552.length; ++var4) { - if (var0.field2552[var4] != null) { - var0.field2619 = true; - break; + int var7 = var3 * var6 * 512 / (var2 * 334); + int var8; + int var9; + short var10; + if (var7 < Client.field844) { + var10 = Client.field844; + var6 = var10 * var2 * 334 / (var3 * 512); + if (var6 > Client.field886) { + var6 = Client.field886; + var8 = var3 * var6 * 512 / (var10 * 334); + var9 = (var2 - var8) / 2; + if (var4) { + Rasterizer2D.Rasterizer2D_resetClip(); + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var9, var3, -16777216); + Rasterizer2D.Rasterizer2D_fillRectangle(var0 + var2 - var9, var1, var9, var3, -16777216); } + + var0 += var9; + var2 -= var9 * 2; + } + } else if (var7 > Client.field888) { + var10 = Client.field888; + var6 = var10 * var2 * 334 / (var3 * 512); + if (var6 < Client.field885) { + var6 = Client.field885; + var8 = var10 * var2 * 334 / (var6 * 512); + var9 = (var3 - var8) / 2; + if (var4) { + Rasterizer2D.Rasterizer2D_resetClip(); + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var9, -16777216); + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var3 + var1 - var9, var2, var9, -16777216); + } + + var1 += var9; + var3 -= var9 * 2; } } - var0.field2621[var1] = var3; + Client.viewportZoom = var3 * var6 / 334; + if (var2 != Client.viewportWidth || var3 != Client.viewportHeight) { + class192.method3813(var2, var3); + } + + Client.viewportOffsetX = var0; + Client.viewportOffsetY = var1; + Client.viewportWidth = var2; + Client.viewportHeight = var3; } } diff --git a/runescape-client/src/main/java/Canvas.java b/runescape-client/src/main/java/Canvas.java index 9b4cc37b9d..2f5f8efd42 100644 --- a/runescape-client/src/main/java/Canvas.java +++ b/runescape-client/src/main/java/Canvas.java @@ -4,12 +4,11 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ay") +@ObfuscatedName("ai") @Implements("Canvas") public final class Canvas extends java.awt.Canvas { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("component") Component component; @@ -17,127 +16,83 @@ public final class Canvas extends java.awt.Canvas { this.component = var1; } - public final void update(Graphics var1) { - this.component.update(var1); - } - public final void paint(Graphics var1) { this.component.paint(var1); } - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(II)Lho;", - garbageValue = "313560965" - ) - @Export("getWidget") - public static Widget getWidget(int var0) { - int var1 = var0 >> 16; - int var2 = var0 & 65535; - if (UserComparator5.Widget_interfaceComponents[var1] == null || UserComparator5.Widget_interfaceComponents[var1][var2] == null) { - boolean var3 = WorldMapData_0.loadInterface(var1); - if (!var3) { - return null; - } - } - - return UserComparator5.Widget_interfaceComponents[var1][var2]; + public final void update(Graphics var1) { + this.component.update(var1); } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lhp;III)[Llf;", - garbageValue = "-2024454786" + signature = "(IIB)I", + garbageValue = "-116" ) - @Export("SpriteBuffer_getSpriteArray") - public static Sprite[] SpriteBuffer_getSpriteArray(AbstractArchive var0, int var1, int var2) { - return !VertexNormal.method2962(var0, var1, var2) ? null : AbstractWorldMapIcon.method642(); - } - - @ObfuscatedName("al") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "952621968" - ) - static int method889(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.GETWINDOWMODE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class247.getWindowedMode(); - return 1; + static int method935(int var0, int var1) { + ItemContainer var2 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var2 == null) { + return 0; + } else if (var1 == -1) { + return 0; } else { - int var3; - if (var0 == ScriptOpcodes.SETWINDOWMODE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var3 == 1 || var3 == 2) { - UserComparator8.setWindowedMode(var3); - } + int var3 = 0; - return 1; - } else if (var0 == ScriptOpcodes.GETDEFAULTWINDOWMODE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AbstractArchive.clientPreferences.windowMode; - return 1; - } else if (var0 != ScriptOpcodes.SETDEFAULTWINDOWMODE) { - if (var0 == 5310) { - --Interpreter.Interpreter_intStackSize; - return 1; - } else { - return 2; + for (int var4 = 0; var4 < var2.quantities.length; ++var4) { + if (var2.ids[var4] == var1) { + var3 += var2.quantities[var4]; } - } else { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var3 == 1 || var3 == 2) { - AbstractArchive.clientPreferences.windowMode = var3; - Language.savePreferences(); - } - - return 1; } + + return var3; } } - @ObfuscatedName("kn") + @ObfuscatedName("il") @ObfuscatedSignature( - signature = "(Ljava/lang/String;ZI)V", - garbageValue = "328041460" + signature = "(ILjava/lang/String;I)V", + garbageValue = "-1452803850" ) - @Export("findItemDefinitions") - static void findItemDefinitions(String var0, boolean var1) { - var0 = var0.toLowerCase(); - short[] var2 = new short[16]; - int var3 = 0; + static void method934(int var0, String var1) { + int var2 = Players.Players_count; + int[] var3 = Players.Players_indices; + boolean var4 = false; + Username var5 = new Username(var1, class60.loginType); - for (int var4 = 0; var4 < JagexCache.ItemDefinition_fileCount; ++var4) { - ItemDefinition var5 = Occluder.ItemDefinition_get(var4); - if ((!var1 || var5.isTradable) && var5.noteTemplate == -1 && var5.name.toLowerCase().indexOf(var0) != -1) { - if (var3 >= 250) { - DevicePcmPlayerProvider.foundItemIdCount = -1; - WorldMapIcon_0.foundItemIds = null; - return; + for (int var6 = 0; var6 < var2; ++var6) { + Player var7 = Client.players[var3[var6]]; + if (var7 != null && var7 != class215.localPlayer && var7.username != null && var7.username.equals(var5)) { + PacketBufferNode var8; + if (var0 == 1) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2193, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var3[var6]); + var8.packetBuffer.writeByte(0); + Client.packetWriter.addNode(var8); + } else if (var0 == 4) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2229, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShortLE(var3[var6]); + var8.packetBuffer.method5634(0); + Client.packetWriter.addNode(var8); + } else if (var0 == 6) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2236, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5635(0); + var8.packetBuffer.writeShort(var3[var6]); + Client.packetWriter.addNode(var8); + } else if (var0 == 7) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2251, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5643(var3[var6]); + var8.packetBuffer.writeByte(0); + Client.packetWriter.addNode(var8); } - if (var3 >= var2.length) { - short[] var6 = new short[var2.length * 2]; - - for (int var7 = 0; var7 < var3; ++var7) { - var6[var7] = var2[var7]; - } - - var2 = var6; - } - - var2[var3++] = (short)var4; + var4 = true; + break; } } - WorldMapIcon_0.foundItemIds = var2; - ReflectionCheck.foundItemIndex = 0; - DevicePcmPlayerProvider.foundItemIdCount = var3; - String[] var8 = new String[DevicePcmPlayerProvider.foundItemIdCount]; - - for (int var9 = 0; var9 < DevicePcmPlayerProvider.foundItemIdCount; ++var9) { - var8[var9] = Occluder.ItemDefinition_get(var2[var9]).name; + if (!var4) { + class30.addGameMessage(4, "", "Unable to find " + var1); } - short[] var10 = WorldMapIcon_0.foundItemIds; - GrandExchangeOfferNameComparator.sortItemsByName(var8, var10, 0, var8.length - 1); } } diff --git a/runescape-client/src/main/java/ChatChannel.java b/runescape-client/src/main/java/ChatChannel.java index eef9ada3dc..84dccad638 100644 --- a/runescape-client/src/main/java/ChatChannel.java +++ b/runescape-client/src/main/java/ChatChannel.java @@ -4,18 +4,24 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cc") +@ObfuscatedName("cb") @Implements("ChatChannel") public class ChatChannel { - @ObfuscatedName("n") + @ObfuscatedName("lb") @ObfuscatedSignature( - signature = "[Lbe;" + signature = "Lhi;" + ) + @Export("mousedOverWidgetIf1") + static Widget mousedOverWidgetIf1; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "[Lbt;" ) @Export("messages") Message[] messages; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -864101903 + intValue = -1655773149 ) @Export("count") int count; @@ -24,10 +30,10 @@ public class ChatChannel { this.messages = new Message[100]; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;B)Lbe;", - garbageValue = "56" + signature = "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Lbt;", + garbageValue = "-2124852367" ) @Export("addMessage") Message addMessage(int var1, String var2, String var3, String var4) { @@ -55,222 +61,49 @@ public class ChatChannel { return var5; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)Lbe;", - garbageValue = "601749225" + signature = "(II)Lbt;", + garbageValue = "1546938937" ) @Export("getMessage") Message getMessage(int var1) { return var1 >= 0 && var1 < this.count ? this.messages[var1] : null; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-135495526" + signature = "(B)I", + garbageValue = "126" ) @Export("size") int size() { return this.count; } - @ObfuscatedName("ft") + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "(CI)Z", + garbageValue = "1710830217" + ) + @Export("isCharAlphabetic") + public static boolean isCharAlphabetic(char var0) { + return var0 >= 'A' && var0 <= 'Z' || var0 >= 'a' && var0 <= 'z'; + } + + @ObfuscatedName("fz") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "247037730" + garbageValue = "-1507769653" ) - static final void method2237() { - int var0 = class225.field3045 * 128 + 64; - int var1 = Clock.field2039 * 16384 + 64; - int var2 = MusicPatchPcmStream.getTileHeight(var0, var1, WorldMapRectangle.plane) - GrandExchangeOfferOwnWorldComparator.field627; - if (GrandExchangeOfferOwnWorldComparator.cameraX < var0) { - GrandExchangeOfferOwnWorldComparator.cameraX = (var0 - GrandExchangeOfferOwnWorldComparator.cameraX) * Messages.field1262 / 1000 + GrandExchangeOfferOwnWorldComparator.cameraX + MouseRecorder.field572; - if (GrandExchangeOfferOwnWorldComparator.cameraX > var0) { - GrandExchangeOfferOwnWorldComparator.cameraX = var0; - } + @Export("playPcmPlayers") + static final void playPcmPlayers() { + if (MenuAction.pcmPlayer1 != null) { + MenuAction.pcmPlayer1.run(); } - if (GrandExchangeOfferOwnWorldComparator.cameraX > var0) { - GrandExchangeOfferOwnWorldComparator.cameraX -= Messages.field1262 * (GrandExchangeOfferOwnWorldComparator.cameraX - var0) / 1000 + MouseRecorder.field572; - if (GrandExchangeOfferOwnWorldComparator.cameraX < var0) { - GrandExchangeOfferOwnWorldComparator.cameraX = var0; - } - } - - if (Varcs.cameraY < var2) { - Varcs.cameraY = (var2 - Varcs.cameraY) * Messages.field1262 / 1000 + Varcs.cameraY + MouseRecorder.field572; - if (Varcs.cameraY > var2) { - Varcs.cameraY = var2; - } - } - - if (Varcs.cameraY > var2) { - Varcs.cameraY -= Messages.field1262 * (Varcs.cameraY - var2) / 1000 + MouseRecorder.field572; - if (Varcs.cameraY < var2) { - Varcs.cameraY = var2; - } - } - - if (WorldMapIcon_1.cameraZ < var1) { - WorldMapIcon_1.cameraZ = (var1 - WorldMapIcon_1.cameraZ) * Messages.field1262 / 1000 + WorldMapIcon_1.cameraZ + MouseRecorder.field572; - if (WorldMapIcon_1.cameraZ > var1) { - WorldMapIcon_1.cameraZ = var1; - } - } - - if (WorldMapIcon_1.cameraZ > var1) { - WorldMapIcon_1.cameraZ -= Messages.field1262 * (WorldMapIcon_1.cameraZ - var1) / 1000 + MouseRecorder.field572; - if (WorldMapIcon_1.cameraZ < var1) { - WorldMapIcon_1.cameraZ = var1; - } - } - - var0 = GameShell.field455 * 16384 + 64; - var1 = SecureRandomFuture.field1228 * 16384 + 64; - var2 = MusicPatchPcmStream.getTileHeight(var0, var1, WorldMapRectangle.plane) - class14.field90; - int var3 = var0 - GrandExchangeOfferOwnWorldComparator.cameraX; - int var4 = var2 - Varcs.cameraY; - int var5 = var1 - WorldMapIcon_1.cameraZ; - int var6 = (int)Math.sqrt((double)(var5 * var5 + var3 * var3)); - int var7 = (int)(Math.atan2((double)var4, (double)var6) * 325.949D) & 2047; - int var8 = (int)(Math.atan2((double)var3, (double)var5) * -325.949D) & 2047; - if (var7 < 128) { - var7 = 128; - } - - if (var7 > 383) { - var7 = 383; - } - - if (IgnoreList.cameraPitch < var7) { - IgnoreList.cameraPitch = (var7 - IgnoreList.cameraPitch) * ScriptEvent.field570 / 1000 + IgnoreList.cameraPitch + class80.field1126; - if (IgnoreList.cameraPitch > var7) { - IgnoreList.cameraPitch = var7; - } - } - - if (IgnoreList.cameraPitch > var7) { - IgnoreList.cameraPitch -= ScriptEvent.field570 * (IgnoreList.cameraPitch - var7) / 1000 + class80.field1126; - if (IgnoreList.cameraPitch < var7) { - IgnoreList.cameraPitch = var7; - } - } - - int var9 = var8 - WorldMapSection2.cameraYaw; - if (var9 > 1024) { - var9 -= 2048; - } - - if (var9 < -1024) { - var9 += 2048; - } - - if (var9 > 0) { - WorldMapSection2.cameraYaw = WorldMapSection2.cameraYaw + class80.field1126 + var9 * ScriptEvent.field570 / 1000; - WorldMapSection2.cameraYaw &= 2047; - } - - if (var9 < 0) { - WorldMapSection2.cameraYaw -= class80.field1126 + -var9 * ScriptEvent.field570 / 1000; - WorldMapSection2.cameraYaw &= 2047; - } - - int var10 = var8 - WorldMapSection2.cameraYaw; - if (var10 > 1024) { - var10 -= 2048; - } - - if (var10 < -1024) { - var10 += 2048; - } - - if (var10 < 0 && var9 > 0 || var10 > 0 && var9 < 0) { - WorldMapSection2.cameraYaw = var8; - } - - } - - @ObfuscatedName("jx") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "73" - ) - static void method2229(int var0) { - ParamDefinition.tempMenuAction = new MenuAction(); - ParamDefinition.tempMenuAction.argument1 = Client.menuArguments1[var0]; - ParamDefinition.tempMenuAction.argument2 = Client.menuArguments2[var0]; - ParamDefinition.tempMenuAction.opcode = Client.menuOpcodes[var0]; - ParamDefinition.tempMenuAction.argument0 = Client.menuIdentifiers[var0]; - ParamDefinition.tempMenuAction.action = Client.menuActions[var0]; - } - - @ObfuscatedName("ja") - @ObfuscatedSignature( - signature = "([Lho;II)V", - garbageValue = "559815398" - ) - @Export("drawModelComponents") - static final void drawModelComponents(Widget[] var0, int var1) { - for (int var2 = 0; var2 < var0.length; ++var2) { - Widget var3 = var0[var2]; - if (var3 != null && var3.parentId == var1 && (!var3.isIf3 || !WorldMapSectionType.isComponentHidden(var3))) { - int var5; - if (var3.type == 0) { - if (!var3.isIf3 && WorldMapSectionType.isComponentHidden(var3) && var3 != NetSocket.mousedOverWidgetIf1) { - continue; - } - - drawModelComponents(var0, var3.id); - if (var3.children != null) { - drawModelComponents(var3.children, var3.id); - } - - InterfaceParent var7 = (InterfaceParent)Client.interfaceParents.get((long)var3.id); - if (var7 != null) { - var5 = var7.group; - if (WorldMapData_0.loadInterface(var5)) { - drawModelComponents(UserComparator5.Widget_interfaceComponents[var5], -1); - } - } - } - - if (var3.type == 6) { - if (var3.sequenceId != -1 || var3.sequenceId2 != -1) { - boolean var4 = Projectile.runCs1(var3); - if (var4) { - var5 = var3.sequenceId2; - } else { - var5 = var3.sequenceId; - } - - if (var5 != -1) { - SequenceDefinition var6 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var5); - - for (var3.modelFrameCycle += Client.field698; var3.modelFrameCycle > var6.frameLengths[var3.modelFrame]; WorldMapSectionType.invalidateWidget(var3)) { - var3.modelFrameCycle -= var6.frameLengths[var3.modelFrame]; - ++var3.modelFrame; - if (var3.modelFrame >= var6.frameIds.length) { - var3.modelFrame -= var6.frameCount; - if (var3.modelFrame < 0 || var3.modelFrame >= var6.frameIds.length) { - var3.modelFrame = 0; - } - } - } - } - } - - if (var3.field2601 != 0 && !var3.isIf3) { - int var8 = var3.field2601 >> 16; - var5 = var3.field2601 << 16 >> 16; - var8 *= Client.field698; - var5 *= Client.field698; - var3.modelAngleX = var8 + var3.modelAngleX & 2047; - var3.modelAngleY = var5 + var3.modelAngleY & 2047; - WorldMapSectionType.invalidateWidget(var3); - } - } - } + if (class80.pcmPlayer0 != null) { + class80.pcmPlayer0.run(); } } diff --git a/runescape-client/src/main/java/ClanChat.java b/runescape-client/src/main/java/ClanChat.java index b6b529599d..43968e40ec 100644 --- a/runescape-client/src/main/java/ClanChat.java +++ b/runescape-client/src/main/java/ClanChat.java @@ -4,154 +4,183 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jk") +@ObfuscatedName("jp") @Implements("ClanChat") public class ClanChat extends UserList { - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) @Export("loginType") final LoginType loginType; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lju;" + signature = "Ljv;" ) @Export("localUser") final Usernamed localUser; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("name") public String name; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("owner") public String owner; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("minKick") public byte minKick; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 198699637 + intValue = 1359173587 ) @Export("rank") public int rank; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = -2033888675 + intValue = 1180287539 ) - int field3622; + int field3621; @ObfuscatedSignature( - signature = "(Lli;Lju;)V" + signature = "(Lln;Ljv;)V" ) public ClanChat(LoginType var1, Usernamed var2) { super(100); this.name = null; this.owner = null; - this.field3622 = 1; + this.field3621 = 1; this.loginType = var1; this.localUser = var2; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)Ljh;", - garbageValue = "2" + signature = "(I)Ljg;", + garbageValue = "-706396611" ) @Export("newInstance") User newInstance() { return new ClanMate(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)[Ljh;", - garbageValue = "951526901" + signature = "(II)[Ljg;", + garbageValue = "1510983955" ) @Export("newTypedArray") User[] newTypedArray(int var1) { return new ClanMate[var1]; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)V", - garbageValue = "969628158" + garbageValue = "-1580131719" ) @Export("readName") final void readName(String var1) { - this.name = VertexNormal.method2961(var1); + long var5 = 0L; + int var7 = var1.length(); + + for (int var8 = 0; var8 < var7; ++var8) { + var5 *= 37L; + char var9 = var1.charAt(var8); + if (var9 >= 'A' && var9 <= 'Z') { + var5 += (long)(var9 + 1 - 65); + } else if (var9 >= 'a' && var9 <= 'z') { + var5 += (long)(var9 + 1 - 97); + } else if (var9 >= '0' && var9 <= '9') { + var5 += (long)(var9 + 27 - 48); + } + + if (var5 >= 177917621779460413L) { + break; + } + } + + while (0L == var5 % 37L && 0L != var5) { + var5 /= 37L; + } + + String var10 = WorldMapDecoration.base37DecodeLong(var5); + if (var10 == null) { + var10 = ""; + } + + this.name = var10; } - @ObfuscatedName("m") + @ObfuscatedName("cw") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "-1129044853" + signature = "(Ljava/lang/String;B)V", + garbageValue = "97" ) @Export("setOwner") final void setOwner(String var1) { - this.owner = VertexNormal.method2961(var1); + long var5 = 0L; + int var7 = var1.length(); + + for (int var8 = 0; var8 < var7; ++var8) { + var5 *= 37L; + char var9 = var1.charAt(var8); + if (var9 >= 'A' && var9 <= 'Z') { + var5 += (long)(var9 + 1 - 65); + } else if (var9 >= 'a' && var9 <= 'z') { + var5 += (long)(var9 + 1 - 97); + } else if (var9 >= '0' && var9 <= '9') { + var5 += (long)(var9 + 27 - 48); + } + + if (var5 >= 177917621779460413L) { + break; + } + } + + while (0L == var5 % 37L && var5 != 0L) { + var5 /= 37L; + } + + String var10 = WorldMapDecoration.base37DecodeLong(var5); + if (var10 == null) { + var10 = ""; + } + + this.owner = var10; } - @ObfuscatedName("y") + @ObfuscatedName("cd") @ObfuscatedSignature( - signature = "(Lkl;S)V", - garbageValue = "20227" + signature = "(Lkc;I)V", + garbageValue = "-1009603456" ) @Export("readUpdate") public final void readUpdate(Buffer var1) { this.setOwner(var1.readStringCp1252NullTerminated()); long var2 = var1.readLong(); - long var5 = var2; - String var4; - int var7; - if (var2 > 0L && var2 < 6582952005840035281L) { - if (var2 % 37L == 0L) { - var4 = null; - } else { - var7 = 0; - - for (long var13 = var2; 0L != var13; var13 /= 37L) { - ++var7; - } - - StringBuilder var15 = new StringBuilder(var7); - - while (0L != var5) { - long var11 = var5; - var5 /= 37L; - var15.append(class288.base37Table[(int)(var11 - 37L * var5)]); - } - - var4 = var15.reverse().toString(); - } - } else { - var4 = null; - } - - this.readName(var4); + this.readName(class30.method602(var2)); this.minKick = var1.readByte(); - var7 = var1.readUnsignedByte(); - if (var7 != 255) { + int var4 = var1.readUnsignedByte(); + if (var4 != 255) { this.clear(); - for (int var8 = 0; var8 < var7; ++var8) { - ClanMate var9 = (ClanMate)this.addLastNoPreviousUsername(new Username(var1.readStringCp1252NullTerminated(), this.loginType)); - int var10 = var1.readUnsignedShort(); - var9.set(var10, ++this.field3622 - 1); - var9.rank = var1.readByte(); + for (int var5 = 0; var5 < var4; ++var5) { + ClanMate var6 = (ClanMate)this.addLastNoPreviousUsername(new Username(var1.readStringCp1252NullTerminated(), this.loginType)); + int var7 = var1.readUnsignedShort(); + var6.set(var7, ++this.field3621 - 1); + var6.rank = var1.readByte(); var1.readStringCp1252NullTerminated(); - this.isLocalPlayer(var9); + this.isLocalPlayer(var6); } } } - @ObfuscatedName("i") + @ObfuscatedName("cn") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-31" + signature = "(Lkc;B)V", + garbageValue = "38" ) - public final void method5166(Buffer var1) { + public final void method5354(Buffer var1) { Username var2 = new Username(var1.readStringCp1252NullTerminated(), this.loginType); int var3 = var1.readUnsignedShort(); byte var4 = var1.readByte(); @@ -181,7 +210,7 @@ public class ClanChat extends UserList { var6 = (ClanMate)this.addLastNoPreviousUsername(var2); } - var6.set(var3, ++this.field3622 - 1); + var6.set(var3, ++this.field3621 - 1); var6.rank = var4; this.isLocalPlayer(var6); } @@ -191,7 +220,7 @@ public class ClanChat extends UserList { @ObfuscatedName("cr") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "85012014" + garbageValue = "2124688840" ) @Export("clearFriends") public final void clearFriends() { @@ -201,10 +230,10 @@ public class ClanChat extends UserList { } - @ObfuscatedName("ct") + @ObfuscatedName("ci") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "313560965" + garbageValue = "-1188581699" ) @Export("invalidateIgnoreds") public final void invalidateIgnoreds() { @@ -214,10 +243,10 @@ public class ClanChat extends UserList { } - @ObfuscatedName("ci") + @ObfuscatedName("cy") @ObfuscatedSignature( - signature = "(Ljo;I)V", - garbageValue = "345857456" + signature = "(Ljn;I)V", + garbageValue = "-1306702332" ) @Export("isLocalPlayer") final void isLocalPlayer(ClanMate var1) { @@ -226,4 +255,21 @@ public class ClanChat extends UserList { } } + + @ObfuscatedName("a") + public static final void method5367(long var0) { + if (var0 > 0L) { + if (var0 % 10L == 0L) { + class43.method882(var0 - 1L); + + try { + Thread.sleep(1L); + } catch (InterruptedException var3) { + } + } else { + class43.method882(var0); + } + + } + } } diff --git a/runescape-client/src/main/java/ClanMate.java b/runescape-client/src/main/java/ClanMate.java index 61ee4440c7..adaa93e430 100644 --- a/runescape-client/src/main/java/ClanMate.java +++ b/runescape-client/src/main/java/ClanMate.java @@ -3,24 +3,18 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jo") +@ObfuscatedName("jn") @Implements("ClanMate") public class ClanMate extends Buddy { - @ObfuscatedName("dj") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive11") - static Archive archive11; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("friend") TriBool friend; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("ignored") TriBool ignored; @@ -30,20 +24,20 @@ public class ClanMate extends Buddy { this.ignored = TriBool.TriBool_unknown; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-407939513" + garbageValue = "1787297671" ) @Export("clearIsFriend") void clearIsFriend() { this.friend = TriBool.TriBool_unknown; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "1388018244" + garbageValue = "2015099973" ) @Export("isFriend") public final boolean isFriend() { @@ -54,30 +48,30 @@ public class ClanMate extends Buddy { return this.friend == TriBool.TriBool_true; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2101732622" + signature = "(B)V", + garbageValue = "36" ) @Export("fillIsFriend") void fillIsFriend() { - this.friend = Tiles.friendSystem.friendsList.contains(super.username) ? TriBool.TriBool_true : TriBool.TriBool_false; + this.friend = PacketWriter.friendSystem.friendsList.contains(super.username) ? TriBool.TriBool_true : TriBool.TriBool_false; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "349082109" + signature = "(B)V", + garbageValue = "-59" ) @Export("clearIsIgnored") void clearIsIgnored() { this.ignored = TriBool.TriBool_unknown; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-1700541155" + signature = "(B)Z", + garbageValue = "-8" ) @Export("isIgnored") public final boolean isIgnored() { @@ -88,22 +82,26 @@ public class ClanMate extends Buddy { return this.ignored == TriBool.TriBool_true; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-735499948" + garbageValue = "-1162251482" ) @Export("fillIsIgnored") void fillIsIgnored() { - this.ignored = Tiles.friendSystem.ignoreList.contains(super.username) ? TriBool.TriBool_true : TriBool.TriBool_false; + this.ignored = PacketWriter.friendSystem.ignoreList.contains(super.username) ? TriBool.TriBool_true : TriBool.TriBool_false; } - @ObfuscatedName("u") + @ObfuscatedName("lx") @ObfuscatedSignature( - signature = "(Lhp;Lhp;III)Lkn;", - garbageValue = "-569680121" + signature = "([BIB)V", + garbageValue = "81" ) - public static Font method4976(AbstractArchive var0, AbstractArchive var1, int var2, int var3) { - return !VertexNormal.method2962(var0, var2, var3) ? null : class49.method893(var1.takeFile(var2, var3)); + static void method5151(byte[] var0, int var1) { + if (Client.randomDatData == null) { + Client.randomDatData = new byte[24]; + } + + class300.writeRandomDat(var0, var1, Client.randomDatData, 0, 24); } } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index f4f8b09f7c..1c157aff75 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -1,6 +1,4 @@ -import java.io.File; import java.io.IOException; -import java.io.RandomAccessFile; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; @@ -10,1274 +8,1261 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; import netscape.javascript.JSObject; @Implements("Client") @ObfuscatedName("client") public final class Client extends GameShell implements Usernamed { - @ObfuscatedName("mk") + @ObfuscatedName("ma") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhi;" ) @Export("clickedWidget") static Widget clickedWidget; - @ObfuscatedName("om") + @ObfuscatedName("oq") @ObfuscatedGetter( - intValue = -556975935 + intValue = 1669670355 + ) + static int field835; + @ObfuscatedName("or") + @ObfuscatedGetter( + intValue = -1587927699 ) @Export("rootWidgetCount") static int rootWidgetCount; - @ObfuscatedName("ol") + @ObfuscatedName("oe") @ObfuscatedGetter( - intValue = -659707133 + longValue = 7809710238956253295L ) - static int field638; - @ObfuscatedName("og") - @ObfuscatedGetter( - longValue = -2357868230662320483L - ) - static long field754; + static long field736; @ObfuscatedName("ot") - static boolean[] field841; - @ObfuscatedName("oi") - static boolean[] field847; - @ObfuscatedName("nj") - static boolean field817; - @ObfuscatedName("op") static boolean[] field842; - @ObfuscatedName("nm") - static boolean field814; - @ObfuscatedName("ox") + @ObfuscatedName("oh") + static boolean[] field837; + @ObfuscatedName("ov") + static boolean[] field631; + @ObfuscatedName("nw") + static boolean field695; + @ObfuscatedName("oz") @Export("isResizable") static boolean isResizable; - @ObfuscatedName("nt") + @ObfuscatedName("nf") @ObfuscatedGetter( - intValue = 1655703121 + intValue = -447078155 ) @Export("cycleCntr") static int cycleCntr; - @ObfuscatedName("sj") + @ObfuscatedName("sk") @ObfuscatedGetter( - intValue = 11492349 + intValue = -711169745 ) - public static int field905; - @ObfuscatedName("ng") + public static int field900; + @ObfuscatedName("nz") @ObfuscatedGetter( - intValue = -1435027681 + intValue = -2050239349 ) - static int field744; - @ObfuscatedName("mb") + static int field824; + @ObfuscatedName("nk") + static boolean field809; + @ObfuscatedName("qp") + static boolean field855; + @ObfuscatedName("mp") @ObfuscatedGetter( - intValue = -1276072491 + intValue = -1344541921 ) @Export("widgetClickX") static int widgetClickX; - @ObfuscatedName("qr") - static boolean field759; - @ObfuscatedName("mv") + @ObfuscatedName("me") @ObfuscatedGetter( - intValue = 2043143959 + intValue = -1705214051 ) @Export("widgetClickY") static int widgetClickY; - @ObfuscatedName("na") + @ObfuscatedName("np") @ObfuscatedGetter( - intValue = -868722211 + intValue = -230439773 ) - static int field695; - @ObfuscatedName("me") + static int field748; + @ObfuscatedName("ms") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhi;" ) @Export("clickedWidgetParent") static Widget clickedWidgetParent; - @ObfuscatedName("md") + @ObfuscatedName("mo") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("interfaceParents") static NodeHashTable interfaceParents; - @ObfuscatedName("nl") - @ObfuscatedGetter( - intValue = 194862223 - ) - static int field816; - @ObfuscatedName("oy") + @ObfuscatedName("ox") @Export("rootWidgetXs") static int[] rootWidgetXs; - @ObfuscatedName("oq") - @ObfuscatedSignature( - signature = "Llq;" - ) - @Export("widgetClickMasks") - static NodeHashTable widgetClickMasks; - @ObfuscatedName("oe") + @ObfuscatedName("ob") @Export("rootWidgetWidths") static int[] rootWidgetWidths; - @ObfuscatedName("ms") + @ObfuscatedName("nn") + @ObfuscatedGetter( + intValue = 415324941 + ) + static int field751; + @ObfuscatedName("ml") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhi;" ) @Export("viewportWidget") static Widget viewportWidget; - @ObfuscatedName("oz") + @ObfuscatedName("oi") @ObfuscatedGetter( - intValue = 1348758997 + intValue = 1211489517 ) @Export("gameDrawingMode") static int gameDrawingMode; - @ObfuscatedName("ow") - @Export("rootWidgetHeights") - static int[] rootWidgetHeights; - @ObfuscatedName("my") + @ObfuscatedName("og") + @Export("rootWidgetYs") + static int[] rootWidgetYs; + @ObfuscatedName("mn") @ObfuscatedGetter( - intValue = -2028586371 + intValue = -615155411 ) @Export("staffModLevel") public static int staffModLevel; - @ObfuscatedName("ov") - @Export("rootWidgetYs") - static int[] rootWidgetYs; - @ObfuscatedName("nk") - @ObfuscatedGetter( - intValue = -1019005303 - ) - static int field818; - @ObfuscatedName("pl") - @ObfuscatedGetter( - intValue = 858875897 - ) - @Export("destinationX") - static int destinationX; - @ObfuscatedName("tb") + @ObfuscatedName("os") + @Export("rootWidgetHeights") + static int[] rootWidgetHeights; + @ObfuscatedName("op") @ObfuscatedSignature( - signature = "Lbu;" + signature = "Llh;" ) - static final class65 field909; - @ObfuscatedName("np") + @Export("widgetClickMasks") + static NodeHashTable widgetClickMasks; + @ObfuscatedName("th") + static int[] field890; + @ObfuscatedName("nm") @ObfuscatedGetter( - intValue = 1046894235 + intValue = 172768801 ) - static int field819; - @ObfuscatedName("px") - @ObfuscatedGetter( - intValue = 242208529 - ) - @Export("destinationY") - static int destinationY; - @ObfuscatedName("oh") - @ObfuscatedSignature( - signature = "Ljv;" - ) - @Export("scriptEvents") - static NodeDeque scriptEvents; - @ObfuscatedName("nq") - @ObfuscatedGetter( - intValue = -861923243 - ) - static int field833; + static int field834; + @ObfuscatedName("ta") + static int[] field906; @ObfuscatedName("tg") - static int[] field910; - @ObfuscatedName("nc") - @Export("isDraggingWidget") - static boolean isDraggingWidget; - @ObfuscatedName("td") - static int[] field911; - @ObfuscatedName("nv") - @ObfuscatedGetter( - intValue = 826785605 - ) - static int field832; - @ObfuscatedName("qz") - @Export("isCameraLocked") - static boolean isCameraLocked; - @ObfuscatedName("mx") - @ObfuscatedGetter( - intValue = -140222153 - ) - @Export("runEnergy") - static int runEnergy; - @ObfuscatedName("qb") - @ObfuscatedGetter( - intValue = -910754411 - ) - static int field666; - @ObfuscatedName("mo") - @ObfuscatedGetter( - intValue = -1946560921 - ) - @Export("weight") - static int weight; - @ObfuscatedName("qa") - @ObfuscatedGetter( - intValue = 892519291 - ) - static int field868; - @ObfuscatedName("no") - static int[] field820; - @ObfuscatedName("nb") - @ObfuscatedGetter( - intValue = -1905651311 - ) - static int field830; - @ObfuscatedName("nw") - @ObfuscatedGetter( - intValue = -330072185 - ) - static int field825; - @ObfuscatedName("mw") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lbs;" ) - @Export("draggedOnWidget") - static Widget draggedOnWidget; - @ObfuscatedName("sl") - @ObfuscatedGetter( - intValue = -897184099 - ) - static int field900; - @ObfuscatedName("ru") + static final class65 field904; + @ObfuscatedName("sr") @ObfuscatedSignature( - signature = "Lhr;" - ) - @Export("playerAppearance") - static PlayerAppearance playerAppearance; - @ObfuscatedName("on") - @ObfuscatedGetter( - intValue = -1310890605 - ) - @Export("mouseWheelRotation") - static int mouseWheelRotation; - @ObfuscatedName("mj") - @ObfuscatedSignature( - signature = "Lho;" - ) - @Export("meslayerContinueWidget") - static Widget meslayerContinueWidget; - @ObfuscatedName("qm") - @ObfuscatedGetter( - intValue = -1177667309 - ) - @Export("soundEffectCount") - static int soundEffectCount; - @ObfuscatedName("sn") - @ObfuscatedGetter( - intValue = 2123814989 - ) - static int field901; - @ObfuscatedName("qh") - @Export("soundEffectIds") - static int[] soundEffectIds; - @ObfuscatedName("qw") - @Export("queuedSoundEffectLoops") - static int[] queuedSoundEffectLoops; - @ObfuscatedName("sa") - @ObfuscatedSignature( - signature = "[Li;" + signature = "[Ld;" ) @Export("grandExchangeOffers") static GrandExchangeOffer[] grandExchangeOffers; - @ObfuscatedName("qx") - @Export("queuedSoundEffectDelays") - static int[] queuedSoundEffectDelays; - @ObfuscatedName("qt") + @ObfuscatedName("oj") @ObfuscatedSignature( - signature = "[Lcm;" + signature = "Ljb;" ) - @Export("soundEffects") - static SoundEffect[] soundEffects; - @ObfuscatedName("ql") - @Export("soundLocations") - static int[] soundLocations; - @ObfuscatedName("nn") + @Export("scriptEvents") + static NodeDeque scriptEvents; + @ObfuscatedName("pg") @ObfuscatedGetter( - intValue = 1294400327 + intValue = 1345286015 ) - static int field831; - @ObfuscatedName("qf") + @Export("destinationX") + static int destinationX; + @ObfuscatedName("nc") @ObfuscatedGetter( - intValue = 1977131521 + intValue = 723672855 + ) + static int field846; + @ObfuscatedName("pd") + @ObfuscatedGetter( + intValue = 959702887 + ) + @Export("destinationY") + static int destinationY; + @ObfuscatedName("nb") + @ObfuscatedGetter( + intValue = -899895459 + ) + static int field814; + @ObfuscatedName("ng") + @ObfuscatedGetter( + intValue = -1812598639 + ) + static int field652; + @ObfuscatedName("nd") + @ObfuscatedGetter( + intValue = -441716439 + ) + static int field826; + @ObfuscatedName("nr") + @Export("isDraggingWidget") + static boolean isDraggingWidget; + @ObfuscatedName("mr") + @ObfuscatedGetter( + intValue = -397177077 + ) + @Export("runEnergy") + static int runEnergy; + @ObfuscatedName("mk") + @ObfuscatedGetter( + intValue = -887954319 + ) + @Export("weight") + static int weight; + @ObfuscatedName("mu") + @ObfuscatedSignature( + signature = "Lhi;" + ) + @Export("meslayerContinueWidget") + static Widget meslayerContinueWidget; + @ObfuscatedName("no") + static int[] field816; + @ObfuscatedName("sm") + @ObfuscatedGetter( + intValue = 857681821 + ) + static int field818; + @ObfuscatedName("nu") + @ObfuscatedGetter( + intValue = 703633297 + ) + static int field820; + @ObfuscatedName("rg") + @ObfuscatedSignature( + signature = "Lhe;" + ) + @Export("playerAppearance") + static PlayerAppearance playerAppearance; + @ObfuscatedName("qk") + @ObfuscatedGetter( + intValue = -1636781949 + ) + static int field868; + @ObfuscatedName("sl") + @ObfuscatedGetter( + intValue = 1393467707 + ) + static int field896; + @ObfuscatedName("ol") + @ObfuscatedGetter( + intValue = 1068901591 + ) + @Export("mouseWheelRotation") + static int mouseWheelRotation; + @ObfuscatedName("mv") + @ObfuscatedSignature( + signature = "Lhi;" + ) + @Export("draggedOnWidget") + static Widget draggedOnWidget; + @ObfuscatedName("ru") + static boolean[] field641; + @ObfuscatedName("rz") + static int[] field877; + @ObfuscatedName("qx") + @ObfuscatedGetter( + intValue = -233646219 ) @Export("minimapState") static int minimapState; - @ObfuscatedName("si") + @ObfuscatedName("rl") + static int[] field795; + @ObfuscatedName("rn") + static int[] field879; + @ObfuscatedName("ri") + static int[] field880; + @ObfuscatedName("sv") @Export("archiveLoaders") static ArrayList archiveLoaders; - @ObfuscatedName("se") + @ObfuscatedName("sa") @ObfuscatedGetter( - intValue = 426040267 + intValue = 1310325491 ) @Export("archiveLoadersDone") static int archiveLoadersDone; - @ObfuscatedName("rm") - static boolean[] field835; - @ObfuscatedName("pz") - static long[] field889; - @ObfuscatedName("rk") - static int[] field882; - @ObfuscatedName("pi") + @ObfuscatedName("pl") @ObfuscatedGetter( - longValue = -2403274902957123209L - ) - static long field860; - @ObfuscatedName("rl") - static int[] field883; - @ObfuscatedName("nu") - static int[] field782; - @ObfuscatedName("rh") - static int[] field884; - @ObfuscatedName("ne") - @ObfuscatedGetter( - intValue = -1128248371 - ) - static int field823; - @ObfuscatedName("rj") - static int[] field885; - @ObfuscatedName("pr") - @ObfuscatedGetter( - intValue = -1812154483 + intValue = -1292384633 ) static int field856; - @ObfuscatedName("su") - @ObfuscatedSignature( - signature = "Lly;" - ) - @Export("platformInfoProvider") - static PlatformInfoProvider platformInfoProvider; - @ObfuscatedName("pt") - @ObfuscatedGetter( - intValue = -1929025607 - ) - static int field643; - @ObfuscatedName("pv") - @ObfuscatedGetter( - intValue = -1079323191 - ) - @Export("mapIconCount") - static int mapIconCount; @ObfuscatedName("ps") - @Export("mapIconXs") - static int[] mapIconXs; - @ObfuscatedName("qi") @ObfuscatedGetter( - intValue = -114703177 + longValue = 6749730827027050469L ) - static int field761; - @ObfuscatedName("pu") - @Export("mapIconYs") - static int[] mapIconYs; - @ObfuscatedName("rt") - static short field880; - @ObfuscatedName("re") - static short field887; - @ObfuscatedName("rd") - static short field892; - @ObfuscatedName("pg") - @ObfuscatedSignature( - signature = "[Llf;" - ) - @Export("mapIcons") - static Sprite[] mapIcons; - @ObfuscatedName("rr") - static short field893; - @ObfuscatedName("ra") - static short field891; - @ObfuscatedName("rf") + static long field663; + @ObfuscatedName("rs") @ObfuscatedGetter( - intValue = 720626183 - ) - @Export("viewportZoom") - static int viewportZoom; - @ObfuscatedName("ri") - static short field686; - @ObfuscatedName("rz") - @ObfuscatedGetter( - intValue = 806304417 - ) - @Export("viewportWidth") - static int viewportWidth; - @ObfuscatedName("nh") - @ObfuscatedGetter( - intValue = 1691099913 - ) - @Export("chatCycle") - static int chatCycle; - @ObfuscatedName("pa") - @ObfuscatedGetter( - intValue = 168765299 - ) - @Export("tradeChatMode") - static int tradeChatMode; - @ObfuscatedName("pw") - @ObfuscatedGetter( - intValue = 253399583 - ) - @Export("publicChatMode") - static int publicChatMode; - @ObfuscatedName("qj") - @ObfuscatedGetter( - intValue = -1492029485 - ) - @Export("soundEffectVolume") - static int soundEffectVolume; - @ObfuscatedName("ro") - @ObfuscatedGetter( - intValue = -1929841361 - ) - @Export("viewportHeight") - static int viewportHeight; - @ObfuscatedName("rc") - @ObfuscatedGetter( - intValue = -1154982749 + intValue = -137337439 ) @Export("viewportOffsetX") static int viewportOffsetX; - @ObfuscatedName("nz") - @Export("changedSkills") - static int[] changedSkills; - @ObfuscatedName("rb") + @ObfuscatedName("rm") @ObfuscatedGetter( - intValue = -654475437 + intValue = 2111319843 ) @Export("viewportOffsetY") static int viewportOffsetY; - @ObfuscatedName("nd") + @ObfuscatedName("rr") @ObfuscatedGetter( - intValue = -15935377 + intValue = 1474521741 ) - @Export("changedSkillsCount") - static int changedSkillsCount; + @Export("viewportWidth") + static int viewportWidth; + @ObfuscatedName("rf") + @ObfuscatedGetter( + intValue = -816916675 + ) + @Export("viewportHeight") + static int viewportHeight; + @ObfuscatedName("qm") + @ObfuscatedGetter( + intValue = -1444022859 + ) + @Export("soundEffectCount") + static int soundEffectCount; + @ObfuscatedName("pi") + static long[] field852; + @ObfuscatedName("qd") + @Export("soundEffectIds") + static int[] soundEffectIds; + @ObfuscatedName("rt") + static short field881; + @ObfuscatedName("qb") + @Export("queuedSoundEffectLoops") + static int[] queuedSoundEffectLoops; + @ObfuscatedName("qw") + @Export("isCameraLocked") + static boolean isCameraLocked; + @ObfuscatedName("ra") + static short field882; + @ObfuscatedName("rc") + static short field844; + @ObfuscatedName("qr") + @Export("queuedSoundEffectDelays") + static int[] queuedSoundEffectDelays; + @ObfuscatedName("re") + static short field888; + @ObfuscatedName("rx") + static short field886; + @ObfuscatedName("qy") + @ObfuscatedSignature( + signature = "[Lcg;" + ) + @Export("soundEffects") + static SoundEffect[] soundEffects; + @ObfuscatedName("qv") + @ObfuscatedGetter( + intValue = 398456721 + ) + static int field865; + @ObfuscatedName("pq") + @ObfuscatedGetter( + intValue = -87647027 + ) + static int field721; + @ObfuscatedName("rh") + @ObfuscatedGetter( + intValue = -1065055441 + ) + @Export("viewportZoom") + static int viewportZoom; + @ObfuscatedName("rj") + static short field885; + @ObfuscatedName("qf") + @ObfuscatedGetter( + intValue = -1999845863 + ) + static int field864; + @ObfuscatedName("qq") + @Export("soundLocations") + static int[] soundLocations; + @ObfuscatedName("pb") + @ObfuscatedGetter( + intValue = 1617941687 + ) + @Export("mapIconCount") + static int mapIconCount; + @ObfuscatedName("sq") + @ObfuscatedSignature( + signature = "Llb;" + ) + @Export("platformInfoProvider") + static PlatformInfoProvider platformInfoProvider; + @ObfuscatedName("pa") + @Export("mapIconXs") + static int[] mapIconXs; + @ObfuscatedName("pj") + @Export("mapIconYs") + static int[] mapIconYs; + @ObfuscatedName("pt") + @ObfuscatedSignature( + signature = "[Llx;" + ) + @Export("mapIcons") + static Sprite[] mapIcons; + @ObfuscatedName("ni") + @ObfuscatedGetter( + intValue = -406012573 + ) + static int field679; + @ObfuscatedName("nj") + @ObfuscatedGetter( + intValue = 581751417 + ) + @Export("chatCycle") + static int chatCycle; @ObfuscatedName("rp") - @Export("zoomWidth") - static short zoomWidth; - @ObfuscatedName("ma") - @ObfuscatedGetter( - intValue = 42533643 - ) - @Export("chatEffects") - static int chatEffects; - @ObfuscatedName("rg") @Export("zoomHeight") static short zoomHeight; - @ObfuscatedName("mr") + @ObfuscatedName("rk") + @Export("zoomWidth") + static short zoomWidth; + @ObfuscatedName("qt") @ObfuscatedGetter( - intValue = -382576035 + intValue = -1154555301 ) - static int field873; - @ObfuscatedName("sr") + @Export("soundEffectVolume") + static int soundEffectVolume; + @ObfuscatedName("nx") + static int[] field817; + @ObfuscatedName("sw") @ObfuscatedGetter( - intValue = -1773628049 + intValue = 1025711975 ) - static int field908; + static int field903; @ObfuscatedName("pf") + static String field849; + @ObfuscatedName("px") @ObfuscatedGetter( - intValue = -1367796571 + intValue = -131485607 ) - static int field857; - @ObfuscatedName("mq") - @ObfuscatedGetter( - intValue = 494577071 - ) - @Export("followerIndex") - static int followerIndex; + static int field866; @ObfuscatedName("mt") @Export("playerMod") static boolean playerMod; - @ObfuscatedName("pm") - static int[] field859; - @ObfuscatedName("po") - static int[] field858; - @ObfuscatedName("os") - @ObfuscatedSignature( - signature = "Ljv;" + @ObfuscatedName("pz") + @ObfuscatedGetter( + intValue = -1422495067 ) - static NodeDeque field836; - @ObfuscatedName("ob") - @ObfuscatedSignature( - signature = "Ljv;" + @Export("publicChatMode") + static int publicChatMode; + @ObfuscatedName("pn") + @ObfuscatedGetter( + intValue = -1887689269 ) - static NodeDeque field763; + @Export("tradeChatMode") + static int tradeChatMode; + @ObfuscatedName("pp") + static int[] field854; + @ObfuscatedName("py") + static int[] field853; + @ObfuscatedName("oc") + @ObfuscatedSignature( + signature = "Ljb;" + ) + static NodeDeque field813; + @ObfuscatedName("mj") + @ObfuscatedGetter( + intValue = 381105829 + ) + @Export("chatEffects") + static int chatEffects; + @ObfuscatedName("pv") + static int[] field829; + @ObfuscatedName("od") + @ObfuscatedSignature( + signature = "Ljb;" + ) + static NodeDeque field832; + @ObfuscatedName("nt") + @Export("changedSkills") + static int[] changedSkills; + @ObfuscatedName("my") + @ObfuscatedGetter( + intValue = 611257561 + ) + static int field907; + @ObfuscatedName("ny") + @ObfuscatedGetter( + intValue = -1741556813 + ) + @Export("changedSkillsCount") + static int changedSkillsCount; + @ObfuscatedName("nh") + @ObfuscatedGetter( + intValue = -1179398273 + ) + static int field825; + @ObfuscatedName("mq") + @ObfuscatedGetter( + intValue = 1191445113 + ) + @Export("followerIndex") + static int followerIndex; + @ObfuscatedName("md") + @ObfuscatedGetter( + intValue = -1252075313 + ) + static int field828; @ObfuscatedName("mc") @ObfuscatedGetter( - intValue = -1507863629 + intValue = 1310053169 ) - static int field798; - @ObfuscatedName("mz") - @ObfuscatedGetter( - intValue = -1296819247 - ) - static int field824; - @ObfuscatedName("ph") - static int[] field851; - @ObfuscatedName("pd") - static String field907; - @ObfuscatedName("sx") + static int field794; + @ObfuscatedName("sn") @ObfuscatedSignature( - signature = "Lbb;" + signature = "Lbm;" ) @Export("GrandExchangeEvents_worldComparator") static GrandExchangeOfferOwnWorldComparator GrandExchangeEvents_worldComparator; @ObfuscatedName("w") @ObfuscatedSignature( - signature = "[Lfa;" + signature = "[Lfm;" ) @Export("collisionMaps") static CollisionMap[] collisionMaps; - @ObfuscatedName("at") - static boolean field802; - @ObfuscatedName("bx") + @ObfuscatedName("as") + static boolean field791; + @ObfuscatedName("ba") @ObfuscatedGetter( - intValue = 1846758827 + intValue = -20471151 ) @Export("worldId") public static int worldId; - @ObfuscatedName("bh") + @ObfuscatedName("bg") @ObfuscatedGetter( - intValue = -1282298749 + intValue = -51989745 ) @Export("worldProperties") static int worldProperties; - @ObfuscatedName("bm") + @ObfuscatedName("bd") @ObfuscatedGetter( - intValue = -744372313 + intValue = -179388567 ) @Export("gameBuild") static int gameBuild; - @ObfuscatedName("bs") + @ObfuscatedName("bh") @Export("isMembersWorld") public static boolean isMembersWorld; - @ObfuscatedName("bz") + @ObfuscatedName("bu") @Export("isLowDetail") static boolean isLowDetail; - @ObfuscatedName("be") + @ObfuscatedName("bt") @ObfuscatedGetter( - intValue = -1434422805 + intValue = 257125477 ) @Export("clientType") static int clientType; - @ObfuscatedName("bu") + @ObfuscatedName("bs") @Export("onMobile") static boolean onMobile; - @ObfuscatedName("bi") + @ObfuscatedName("bj") @ObfuscatedGetter( - intValue = -1513198459 + intValue = -275274109 ) @Export("gameState") static int gameState; - @ObfuscatedName("cn") + @ObfuscatedName("cr") @Export("isLoading") static boolean isLoading; - @ObfuscatedName("cd") + @ObfuscatedName("ci") @ObfuscatedGetter( - intValue = 1080568465 + intValue = 240908191 ) @Export("cycle") static int cycle; @ObfuscatedName("cy") @ObfuscatedGetter( - longValue = -5290188514648997903L + longValue = -715337301000899145L ) @Export("mouseLastLastPressedTimeMillis") static long mouseLastLastPressedTimeMillis; - @ObfuscatedName("cb") + @ObfuscatedName("co") @ObfuscatedGetter( - intValue = -445977517 + intValue = -1508326543 ) - static int field646; - @ObfuscatedName("cr") + static int field644; + @ObfuscatedName("cu") @ObfuscatedGetter( - intValue = -624148243 + intValue = 309923467 ) - static int field647; - @ObfuscatedName("ct") + static int field905; + @ObfuscatedName("cz") @ObfuscatedGetter( - longValue = -8037513059658187963L + longValue = -6250089135032631577L ) - static long field648; - @ObfuscatedName("ci") + static long field646; + @ObfuscatedName("cq") @Export("hadFocus") static boolean hadFocus; - @ObfuscatedName("cu") + @ObfuscatedName("cj") @Export("displayFps") static boolean displayFps; - @ObfuscatedName("ce") + @ObfuscatedName("cm") @ObfuscatedGetter( - intValue = -1130052375 + intValue = 568076161 ) @Export("rebootTimer") static int rebootTimer; - @ObfuscatedName("cc") + @ObfuscatedName("cb") @ObfuscatedGetter( - intValue = 2049608033 + intValue = 1087784609 ) @Export("hintArrowType") static int hintArrowType; - @ObfuscatedName("cl") + @ObfuscatedName("cp") @ObfuscatedGetter( - intValue = 648504057 + intValue = 560832713 ) @Export("hintArrowNpcIndex") static int hintArrowNpcIndex; - @ObfuscatedName("cw") + @ObfuscatedName("cs") @ObfuscatedGetter( - intValue = 275182897 + intValue = 2097708219 ) @Export("hintArrowPlayerIndex") static int hintArrowPlayerIndex; - @ObfuscatedName("cq") + @ObfuscatedName("ck") @ObfuscatedGetter( - intValue = 1932039353 + intValue = -614355373 ) @Export("hintArrowX") static int hintArrowX; - @ObfuscatedName("ca") + @ObfuscatedName("ct") @ObfuscatedGetter( - intValue = -204101851 + intValue = -1984180121 ) @Export("hintArrowY") static int hintArrowY; - @ObfuscatedName("cf") + @ObfuscatedName("cc") @ObfuscatedGetter( - intValue = 1548574994 + intValue = -607598836 ) @Export("hintArrowHeight") static int hintArrowHeight; - @ObfuscatedName("cx") + @ObfuscatedName("ch") @ObfuscatedGetter( - intValue = -759871936 + intValue = -2044500288 ) @Export("hintArrowSubX") static int hintArrowSubX; - @ObfuscatedName("cm") + @ObfuscatedName("cg") @ObfuscatedGetter( - intValue = 99349824 + intValue = -848173760 ) @Export("hintArrowSubY") static int hintArrowSubY; - @ObfuscatedName("ch") + @ObfuscatedName("ca") @ObfuscatedSignature( - signature = "Lcn;" + signature = "Lcr;" ) @Export("playerAttackOption") static AttackOption playerAttackOption; - @ObfuscatedName("dt") + @ObfuscatedName("db") @ObfuscatedSignature( - signature = "Lcn;" + signature = "Lcr;" ) @Export("npcAttackOption") static AttackOption npcAttackOption; - @ObfuscatedName("dm") + @ObfuscatedName("dd") @ObfuscatedGetter( - intValue = 963568873 + intValue = 355773429 ) @Export("titleLoadingStage") static int titleLoadingStage; - @ObfuscatedName("dy") + @ObfuscatedName("dm") + @ObfuscatedSignature( + signature = "Lku;" + ) + @Export("js5Socket") + static AbstractSocket js5Socket; + @ObfuscatedName("di") @ObfuscatedGetter( - intValue = 584801883 + intValue = -1799860723 ) @Export("js5ConnectState") static int js5ConnectState; - @ObfuscatedName("de") + @ObfuscatedName("dn") @ObfuscatedGetter( - intValue = -900928897 + intValue = -762525009 ) - static int field664; - @ObfuscatedName("dd") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive10") - static Archive archive10; - @ObfuscatedName("ef") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive17") - static Archive archive17; - @ObfuscatedName("ew") + static int field819; + @ObfuscatedName("ee") @ObfuscatedGetter( - intValue = 982456973 + intValue = 1297064295 ) @Export("js5Errors") static int js5Errors; - @ObfuscatedName("eq") + @ObfuscatedName("ef") @ObfuscatedGetter( - intValue = -14383853 + intValue = -1775311529 ) @Export("loginState") static int loginState; - @ObfuscatedName("er") - @ObfuscatedGetter( - intValue = -1286153331 - ) - static int field669; - @ObfuscatedName("eo") - @ObfuscatedGetter( - intValue = 1787272407 - ) - static int field670; - @ObfuscatedName("ee") - @ObfuscatedGetter( - intValue = 460753713 - ) - static int field671; @ObfuscatedName("ep") - @ObfuscatedSignature( - signature = "Lff;" + @ObfuscatedGetter( + intValue = -1375640047 ) - static class160 field672; - @ObfuscatedName("ev") + static int field666; + @ObfuscatedName("et") + @ObfuscatedGetter( + intValue = -589488051 + ) + static int field667; + @ObfuscatedName("eq") + @ObfuscatedGetter( + intValue = -627164889 + ) + static int field668; + @ObfuscatedName("em") + @ObfuscatedSignature( + signature = "Lfp;" + ) + static class160 field850; + @ObfuscatedName("es") @Export("Login_isUsernameRemembered") static boolean Login_isUsernameRemembered; - @ObfuscatedName("ez") + @ObfuscatedName("en") @ObfuscatedSignature( - signature = "Lcb;" + signature = "Lco;" ) @Export("secureRandomFuture") static SecureRandomFuture secureRandomFuture; - @ObfuscatedName("ed") + @ObfuscatedName("ea") @Export("randomDatData") static byte[] randomDatData; - @ObfuscatedName("et") + @ObfuscatedName("ej") @ObfuscatedSignature( - signature = "[Lck;" + signature = "[Lcv;" ) @Export("npcs") static NPC[] npcs; - @ObfuscatedName("eb") + @ObfuscatedName("el") @ObfuscatedGetter( - intValue = -347893507 + intValue = 1003307959 ) @Export("npcCount") static int npcCount; - @ObfuscatedName("fb") + @ObfuscatedName("ft") @Export("npcIndices") static int[] npcIndices; @ObfuscatedName("fe") @ObfuscatedGetter( - intValue = -1928648709 + intValue = 9572479 ) - static int field633; - @ObfuscatedName("fd") - static int[] field681; - @ObfuscatedName("fo") + static int field676; + @ObfuscatedName("fs") + static int[] field677; + @ObfuscatedName("fu") @ObfuscatedSignature( - signature = "Lcl;" + signature = "Lcp;" ) @Export("packetWriter") public static final PacketWriter packetWriter; - @ObfuscatedName("fq") + @ObfuscatedName("fn") @ObfuscatedGetter( - intValue = -1810258911 + intValue = -1045918939 ) @Export("logoutTimer") static int logoutTimer; - @ObfuscatedName("fc") - static boolean field730; - @ObfuscatedName("fv") + @ObfuscatedName("fg") + static boolean field680; + @ObfuscatedName("fw") @Export("useBufferedSocket") static boolean useBufferedSocket; - @ObfuscatedName("fm") + @ObfuscatedName("ff") @ObfuscatedSignature( - signature = "Ljd;" + signature = "Ljt;" ) @Export("timer") static Timer timer; - @ObfuscatedName("fh") - @ObfuscatedSignature( - signature = "Len;" - ) - @Export("urlRequester") - static UrlRequester urlRequester; - @ObfuscatedName("fa") + @ObfuscatedName("fm") @Export("fontsMap") static HashMap fontsMap; - @ObfuscatedName("fj") + @ObfuscatedName("fb") @ObfuscatedGetter( - intValue = 543460729 + intValue = 287183653 ) - static int field689; - @ObfuscatedName("fx") + static int field684; + @ObfuscatedName("fd") @ObfuscatedGetter( - intValue = -1697289513 + intValue = 887047471 ) - static int field690; - @ObfuscatedName("fp") + static int field685; + @ObfuscatedName("fo") @ObfuscatedGetter( - intValue = -355199335 + intValue = 202768591 ) - static int field691; - @ObfuscatedName("gv") + static int field686; + @ObfuscatedName("ga") @ObfuscatedGetter( - intValue = 1416543095 + intValue = -1491451085 ) - static int field692; - @ObfuscatedName("gy") + static int field687; + @ObfuscatedName("gx") @ObfuscatedGetter( - intValue = 1539626603 + intValue = -331520367 ) - static int field693; - @ObfuscatedName("gl") + static int field688; + @ObfuscatedName("gt") @Export("isInInstance") static boolean isInInstance; - @ObfuscatedName("gs") + @ObfuscatedName("gm") @Export("instanceChunkTemplates") static int[][][] instanceChunkTemplates; - @ObfuscatedName("gm") - static final int[] field697; - @ObfuscatedName("gf") + @ObfuscatedName("gj") + static final int[] field692; + @ObfuscatedName("gp") @ObfuscatedGetter( - intValue = -2045474947 + intValue = 1121540223 ) - static int field698; - @ObfuscatedName("hh") + static int field693; + @ObfuscatedName("hg") @ObfuscatedGetter( - intValue = -1078673109 + intValue = 10829207 ) - static int field699; - @ObfuscatedName("ht") + static int field895; + @ObfuscatedName("hx") @ObfuscatedGetter( - intValue = 1330821821 + intValue = -1992997175 ) - static int field700; - @ObfuscatedName("hk") + static int field661; + @ObfuscatedName("hw") @ObfuscatedGetter( - intValue = -1693078415 + intValue = 1623441797 ) - static int field701; - @ObfuscatedName("hz") + static int field683; + @ObfuscatedName("hn") @ObfuscatedGetter( - intValue = -572241931 + intValue = 7192417 ) - static int field702; - @ObfuscatedName("hl") - static boolean field703; - @ObfuscatedName("hb") + static int field790; + @ObfuscatedName("hj") + static boolean field698; + @ObfuscatedName("hf") @ObfuscatedGetter( - intValue = -1280891227 + intValue = -78158007 ) @Export("alternativeScrollbarWidth") static int alternativeScrollbarWidth; - @ObfuscatedName("hm") + @ObfuscatedName("hd") @ObfuscatedGetter( - intValue = -851788043 + intValue = 1116385961 ) @Export("camAngleX") static int camAngleX; - @ObfuscatedName("hu") + @ObfuscatedName("hz") @ObfuscatedGetter( - intValue = 1157777555 + intValue = -683972071 ) @Export("camAngleY") static int camAngleY; - @ObfuscatedName("hi") + @ObfuscatedName("hu") @ObfuscatedGetter( - intValue = 56611529 + intValue = 1986559825 ) @Export("camAngleDY") static int camAngleDY; - @ObfuscatedName("hx") + @ObfuscatedName("hm") @ObfuscatedGetter( - intValue = 594555395 + intValue = 1107670461 ) @Export("camAngleDX") static int camAngleDX; - @ObfuscatedName("hf") + @ObfuscatedName("ht") @ObfuscatedGetter( - intValue = 1391902969 + intValue = 749134913 ) @Export("mouseCamClickedX") static int mouseCamClickedX; - @ObfuscatedName("hd") + @ObfuscatedName("hc") @ObfuscatedGetter( - intValue = -148858111 + intValue = -1131712939 ) @Export("mouseCamClickedY") static int mouseCamClickedY; - @ObfuscatedName("hw") + @ObfuscatedName("hl") @ObfuscatedGetter( - intValue = 1963305499 + intValue = -1055821533 ) @Export("oculusOrbState") static int oculusOrbState; - @ObfuscatedName("hj") + @ObfuscatedName("hy") @ObfuscatedGetter( - intValue = -844153885 + intValue = -344634531 ) @Export("camFollowHeight") static int camFollowHeight; - @ObfuscatedName("hc") + @ObfuscatedName("ho") @ObfuscatedGetter( - intValue = -1192657817 + intValue = 1262882711 ) - static int field766; - @ObfuscatedName("hp") + static int field876; + @ObfuscatedName("hq") @ObfuscatedGetter( - intValue = -1637520021 + intValue = -1868446673 ) - static int field714; - @ObfuscatedName("ih") + static int field709; + @ObfuscatedName("ig") @ObfuscatedGetter( - intValue = -1473797019 + intValue = -1777737639 ) - static int field715; - @ObfuscatedName("io") + static int field710; + @ObfuscatedName("ip") @ObfuscatedGetter( - intValue = -925368297 + intValue = -934038365 ) @Export("oculusOrbNormalSpeed") static int oculusOrbNormalSpeed; - @ObfuscatedName("ib") + @ObfuscatedName("if") @ObfuscatedGetter( - intValue = -1611804213 + intValue = -1149402609 ) @Export("oculusOrbSlowedSpeed") static int oculusOrbSlowedSpeed; - @ObfuscatedName("im") - @ObfuscatedGetter( - intValue = -1513473005 - ) - static int field718; - @ObfuscatedName("ig") - static boolean field879; - @ObfuscatedName("iq") - @ObfuscatedGetter( - intValue = 773031175 - ) - static int field720; - @ObfuscatedName("ij") - static boolean field721; - @ObfuscatedName("is") - @ObfuscatedGetter( - intValue = 130801757 - ) - static int field722; @ObfuscatedName("ik") @ObfuscatedGetter( - intValue = -1967946355 + intValue = -1869232701 + ) + public static int field799; + @ObfuscatedName("iq") + static boolean field645; + @ObfuscatedName("iu") + @ObfuscatedGetter( + intValue = -979694055 + ) + static int field715; + @ObfuscatedName("ie") + static boolean field733; + @ObfuscatedName("im") + @ObfuscatedGetter( + intValue = -843916833 + ) + static int field717; + @ObfuscatedName("ir") + @ObfuscatedGetter( + intValue = -1954915145 ) @Export("overheadTextCount") static int overheadTextCount; - @ObfuscatedName("iu") + @ObfuscatedName("io") @ObfuscatedGetter( - intValue = 2101736993 + intValue = -1863882285 ) @Export("overheadTextLimit") static int overheadTextLimit; - @ObfuscatedName("iy") + @ObfuscatedName("il") @Export("overheadTextXs") static int[] overheadTextXs; - @ObfuscatedName("ip") + @ObfuscatedName("ic") @Export("overheadTextYs") static int[] overheadTextYs; - @ObfuscatedName("iw") + @ObfuscatedName("ib") @Export("overheadTextAscents") static int[] overheadTextAscents; - @ObfuscatedName("id") + @ObfuscatedName("iy") @Export("overheadTextXOffsets") static int[] overheadTextXOffsets; - @ObfuscatedName("if") + @ObfuscatedName("id") @Export("overheadTextColors") static int[] overheadTextColors; - @ObfuscatedName("ir") + @ObfuscatedName("ih") @Export("overheadTextEffects") static int[] overheadTextEffects; - @ObfuscatedName("ia") + @ObfuscatedName("ii") @Export("overheadTextCyclesRemaining") static int[] overheadTextCyclesRemaining; - @ObfuscatedName("iv") + @ObfuscatedName("iw") @Export("overheadText") static String[] overheadText; - @ObfuscatedName("it") - @Export("selectedItemName") - static String selectedItemName; @ObfuscatedName("in") @Export("tileLastDrawnActor") static int[][] tileLastDrawnActor; - @ObfuscatedName("il") + @ObfuscatedName("it") + @Export("selectedItemName") + static String selectedItemName; + @ObfuscatedName("is") @ObfuscatedGetter( - intValue = -1976595977 + intValue = 1250054919 ) @Export("viewportDrawCount") static int viewportDrawCount; - @ObfuscatedName("ii") + @ObfuscatedName("iv") @ObfuscatedGetter( - intValue = -1627292871 + intValue = 556959165 ) @Export("viewportTempX") static int viewportTempX; - @ObfuscatedName("ic") + @ObfuscatedName("ia") @ObfuscatedGetter( - intValue = -527920877 + intValue = -393888855 ) @Export("viewportTempY") static int viewportTempY; - @ObfuscatedName("js") + @ObfuscatedName("jm") @ObfuscatedGetter( - intValue = 978670267 + intValue = 584317187 ) @Export("mouseCrossX") static int mouseCrossX; - @ObfuscatedName("jv") + @ObfuscatedName("jb") @ObfuscatedGetter( - intValue = -1556961545 + intValue = 719414467 ) @Export("mouseCrossY") static int mouseCrossY; - @ObfuscatedName("je") + @ObfuscatedName("ja") @ObfuscatedGetter( - intValue = 1573914060 + intValue = 1435356244 ) @Export("mouseCrossState") static int mouseCrossState; - @ObfuscatedName("jt") + @ObfuscatedName("jd") @ObfuscatedGetter( - intValue = -588599615 + intValue = 339244279 ) @Export("mouseCrossColor") static int mouseCrossColor; - @ObfuscatedName("jx") + @ObfuscatedName("jk") @Export("showMouseCross") static boolean showMouseCross; - @ObfuscatedName("jf") + @ObfuscatedName("jy") @ObfuscatedGetter( - intValue = 2052271037 + intValue = 1508339329 ) - static int field750; - @ObfuscatedName("jc") + static int field753; + @ObfuscatedName("jl") @ObfuscatedGetter( - intValue = 2007699929 + intValue = -306605903 ) - static int field743; - @ObfuscatedName("jp") + static int field665; + @ObfuscatedName("jw") @ObfuscatedGetter( - intValue = -1979890787 + intValue = -577138959 ) @Export("dragItemSlotSource") static int dragItemSlotSource; - @ObfuscatedName("jd") + @ObfuscatedName("jt") @ObfuscatedGetter( - intValue = -438601773 + intValue = 1983943063 ) - static int field745; - @ObfuscatedName("jo") + static int field729; + @ObfuscatedName("jn") @ObfuscatedGetter( - intValue = -1643414129 + intValue = -1896878651 ) - static int field746; - @ObfuscatedName("jh") + static int field741; + @ObfuscatedName("jg") @ObfuscatedGetter( - intValue = 1036462411 + intValue = -2099734901 ) @Export("dragItemSlotDestination") static int dragItemSlotDestination; @ObfuscatedName("jr") - static boolean field748; - @ObfuscatedName("jw") + static boolean field743; + @ObfuscatedName("je") @ObfuscatedGetter( - intValue = -1965230699 + intValue = 2041162413 ) @Export("itemDragDuration") static int itemDragDuration; - @ObfuscatedName("jb") + @ObfuscatedName("jc") @ObfuscatedGetter( - intValue = 1577400495 + intValue = -1234034497 ) - static int field634; - @ObfuscatedName("jl") + static int field745; + @ObfuscatedName("jx") @Export("showLoadingMessages") static boolean showLoadingMessages; - @ObfuscatedName("jm") + @ObfuscatedName("js") @ObfuscatedSignature( - signature = "[Lbi;" + signature = "[Lbj;" ) @Export("players") static Player[] players; - @ObfuscatedName("jq") + @ObfuscatedName("ju") @ObfuscatedGetter( - intValue = 87159269 + intValue = 1889062631 ) @Export("localPlayerIndex") static int localPlayerIndex; - @ObfuscatedName("jy") + @ObfuscatedName("jf") @ObfuscatedGetter( - intValue = 1781220751 + intValue = -1181575857 ) - static int field636; + static int field749; @ObfuscatedName("jj") @Export("renderSelf") static boolean renderSelf; - @ObfuscatedName("ki") + @ObfuscatedName("kw") @ObfuscatedGetter( - intValue = -2014818077 + intValue = 2026004463 ) @Export("drawPlayerNames") static int drawPlayerNames; - @ObfuscatedName("ko") + @ObfuscatedName("kq") @ObfuscatedGetter( - intValue = 729085131 + intValue = -299289873 ) - static int field640; - @ObfuscatedName("kr") - static int[] field758; - @ObfuscatedName("kn") + static int field752; + @ObfuscatedName("ko") + static int[] field870; + @ObfuscatedName("ks") @Export("playerMenuOpcodes") static final int[] playerMenuOpcodes; - @ObfuscatedName("kh") + @ObfuscatedName("kx") @Export("playerMenuActions") static String[] playerMenuActions; - @ObfuscatedName("kb") + @ObfuscatedName("ka") @Export("playerOptionsPriorities") static boolean[] playerOptionsPriorities; - @ObfuscatedName("kz") + @ObfuscatedName("kj") @Export("defaultRotations") static int[] defaultRotations; @ObfuscatedName("kf") @ObfuscatedGetter( - intValue = 722101389 + intValue = -201752719 ) @Export("combatTargetPlayerIndex") static int combatTargetPlayerIndex; - @ObfuscatedName("kl") + @ObfuscatedName("kc") @ObfuscatedSignature( - signature = "[[[Ljv;" + signature = "[[[Ljb;" ) @Export("groundItems") static NodeDeque[][][] groundItems; - @ObfuscatedName("ka") + @ObfuscatedName("ki") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("pendingSpawns") static NodeDeque pendingSpawns; - @ObfuscatedName("kt") + @ObfuscatedName("kz") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("projectiles") static NodeDeque projectiles; - @ObfuscatedName("kj") + @ObfuscatedName("ky") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("graphicsObjects") static NodeDeque graphicsObjects; - @ObfuscatedName("km") + @ObfuscatedName("kd") @Export("currentLevels") static int[] currentLevels; - @ObfuscatedName("ky") + @ObfuscatedName("ku") @Export("levels") static int[] levels; - @ObfuscatedName("kd") + @ObfuscatedName("kg") @Export("experience") static int[] experience; - @ObfuscatedName("kv") + @ObfuscatedName("kn") @ObfuscatedGetter( - intValue = 421096745 + intValue = -629997959 ) @Export("leftClickOpensMenu") static int leftClickOpensMenu; - @ObfuscatedName("kg") + @ObfuscatedName("ke") @Export("isMenuOpen") static boolean isMenuOpen; - @ObfuscatedName("lw") + @ObfuscatedName("la") @ObfuscatedGetter( - intValue = 813297127 + intValue = -1431664981 ) @Export("menuOptionsCount") static int menuOptionsCount; - @ObfuscatedName("ld") + @ObfuscatedName("lq") @Export("menuArguments1") static int[] menuArguments1; - @ObfuscatedName("lb") + @ObfuscatedName("lr") @Export("menuArguments2") static int[] menuArguments2; - @ObfuscatedName("ls") + @ObfuscatedName("ll") @Export("menuOpcodes") static int[] menuOpcodes; - @ObfuscatedName("lq") + @ObfuscatedName("lh") @Export("menuIdentifiers") static int[] menuIdentifiers; - @ObfuscatedName("ll") + @ObfuscatedName("ls") @Export("menuActions") static String[] menuActions; - @ObfuscatedName("ln") + @ObfuscatedName("li") @Export("menuTargets") static String[] menuTargets; - @ObfuscatedName("lx") + @ObfuscatedName("lv") @Export("menuShiftClick") static boolean[] menuShiftClick; - @ObfuscatedName("lm") + @ObfuscatedName("lu") @Export("followerOpsLowPriority") static boolean followerOpsLowPriority; - @ObfuscatedName("lp") + @ObfuscatedName("lw") @Export("shiftClickDrop") static boolean shiftClickDrop; - @ObfuscatedName("lf") + @ObfuscatedName("lx") @Export("tapToDrop") static boolean tapToDrop; - @ObfuscatedName("lo") + @ObfuscatedName("ld") @Export("showMouseOverText") static boolean showMouseOverText; - @ObfuscatedName("lh") + @ObfuscatedName("lz") @ObfuscatedGetter( - intValue = -1819095265 + intValue = 1922593219 ) @Export("viewportX") static int viewportX; - @ObfuscatedName("lg") + @ObfuscatedName("lm") @ObfuscatedGetter( - intValue = -546279315 + intValue = 1274966975 ) @Export("viewportY") static int viewportY; + @ObfuscatedName("lp") + @ObfuscatedGetter( + intValue = -365534183 + ) + static int field782; + @ObfuscatedName("lo") + @ObfuscatedGetter( + intValue = 230985687 + ) + static int field783; @ObfuscatedName("lj") @ObfuscatedGetter( - intValue = 509497683 - ) - static int field787; - @ObfuscatedName("la") - @ObfuscatedGetter( - intValue = 1721267483 - ) - static int field788; - @ObfuscatedName("lr") - @ObfuscatedGetter( - intValue = 241697491 + intValue = -27300387 ) @Export("isItemSelected") static int isItemSelected; - @ObfuscatedName("lz") + @ObfuscatedName("lg") @Export("isSpellSelected") static boolean isSpellSelected; - @ObfuscatedName("li") + @ObfuscatedName("ln") @ObfuscatedGetter( - intValue = -133249451 + intValue = 151795301 ) @Export("selectedSpellChildIndex") static int selectedSpellChildIndex; - @ObfuscatedName("mp") + @ObfuscatedName("mg") @ObfuscatedGetter( - intValue = -1549196691 + intValue = -1039451535 ) - static int field793; + static int field788; @ObfuscatedName("mf") @Export("selectedSpellActionName") static String selectedSpellActionName; - @ObfuscatedName("mm") + @ObfuscatedName("mz") @Export("selectedSpellName") static String selectedSpellName; @ObfuscatedName("mh") @ObfuscatedGetter( - intValue = 1431344687 + intValue = 1866987545 ) @Export("rootInterface") static int rootInterface; static { - field802 = true; + field791 = true; worldId = 1; worldProperties = 0; gameBuild = 0; @@ -1288,10 +1273,10 @@ public final class Client extends GameShell implements Usernamed { gameState = 0; isLoading = true; cycle = 0; - mouseLastLastPressedTimeMillis = -1L; - field646 = -1; - field647 = -1; - field648 = -1L; + mouseLastLastPressedTimeMillis = 1L; + field644 = -1; + field905 = -1; + field646 = -1L; hadFocus = true; displayFps = false; rebootTimer = 0; @@ -1307,42 +1292,42 @@ public final class Client extends GameShell implements Usernamed { npcAttackOption = AttackOption.AttackOption_hidden; titleLoadingStage = 0; js5ConnectState = 0; - field664 = 0; + field819 = 0; js5Errors = 0; loginState = 0; - field669 = 0; - field670 = 0; - field671 = 0; - field672 = class160.field1985; + field666 = 0; + field667 = 0; + field668 = 0; + field850 = class160.field1982; Login_isUsernameRemembered = false; secureRandomFuture = new SecureRandomFuture(); randomDatData = null; npcs = new NPC[32768]; npcCount = 0; npcIndices = new int[32768]; - field633 = 0; - field681 = new int[250]; + field676 = 0; + field677 = new int[250]; packetWriter = new PacketWriter(); logoutTimer = 0; - field730 = false; + field680 = false; useBufferedSocket = true; timer = new Timer(); fontsMap = new HashMap(); - field689 = 0; - field690 = 1; - field691 = 0; - field692 = 1; - field693 = 0; + field684 = 0; + field685 = 1; + field686 = 0; + field687 = 1; + field688 = 0; collisionMaps = new CollisionMap[4]; isInInstance = false; instanceChunkTemplates = new int[4][13][13]; - field697 = new int[]{0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3}; - field698 = 0; - field699 = 2301979; - field700 = 5063219; - field701 = 3353893; - field702 = 7759444; - field703 = false; + field692 = new int[]{0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3}; + field693 = 0; + field895 = 2301979; + field661 = 5063219; + field683 = 3353893; + field790 = 7759444; + field698 = false; alternativeScrollbarWidth = 0; camAngleX = 128; camAngleY = 0; @@ -1352,16 +1337,16 @@ public final class Client extends GameShell implements Usernamed { mouseCamClickedY = 0; oculusOrbState = 0; camFollowHeight = 50; - field766 = 0; - field714 = 0; - field715 = 0; + field876 = 0; + field709 = 0; + field710 = 0; oculusOrbNormalSpeed = 12; oculusOrbSlowedSpeed = 6; - field718 = 0; - field879 = false; - field720 = 0; - field721 = false; - field722 = 0; + field799 = 0; + field645 = false; + field715 = 0; + field733 = false; + field717 = 0; overheadTextCount = 0; overheadTextLimit = 50; overheadTextXs = new int[overheadTextLimit]; @@ -1381,23 +1366,23 @@ public final class Client extends GameShell implements Usernamed { mouseCrossState = 0; mouseCrossColor = 0; showMouseCross = true; - field750 = 0; - field743 = 0; + field753 = 0; + field665 = 0; dragItemSlotSource = 0; - field745 = 0; - field746 = 0; + field729 = 0; + field741 = 0; dragItemSlotDestination = 0; - field748 = false; + field743 = false; itemDragDuration = 0; - field634 = 0; + field745 = 0; showLoadingMessages = true; players = new Player[2048]; localPlayerIndex = -1; - field636 = 0; + field749 = 0; renderSelf = true; drawPlayerNames = 0; - field640 = 0; - field758 = new int[1000]; + field752 = 0; + field870 = new int[1000]; playerMenuOpcodes = new int[]{44, 45, 46, 47, 48, 49, 50, 51}; playerMenuActions = new String[8]; playerOptionsPriorities = new boolean[8]; @@ -1426,21 +1411,21 @@ public final class Client extends GameShell implements Usernamed { showMouseOverText = true; viewportX = -1; viewportY = -1; - field787 = 0; - field788 = 50; + field782 = 0; + field783 = 50; isItemSelected = 0; selectedItemName = null; isSpellSelected = false; selectedSpellChildIndex = -1; - field793 = -1; + field788 = -1; selectedSpellActionName = null; selectedSpellName = null; rootInterface = -1; interfaceParents = new NodeHashTable(8); - field798 = 0; - field824 = -1; + field828 = 0; + field794 = -1; chatEffects = 0; - field873 = 0; + field907 = 0; meslayerContinueWidget = null; runEnergy = 0; weight = 0; @@ -1453,54 +1438,54 @@ public final class Client extends GameShell implements Usernamed { widgetClickX = 0; widgetClickY = 0; draggedOnWidget = null; - field814 = false; - field695 = -1; - field816 = -1; - field817 = false; - field818 = -1; - field819 = -1; + field809 = false; + field748 = -1; + field751 = -1; + field695 = false; + field846 = -1; + field814 = -1; isDraggingWidget = false; cycleCntr = 1; - field782 = new int[32]; - field823 = 0; - field820 = new int[32]; - field825 = 0; + field817 = new int[32]; + field679 = 0; + field816 = new int[32]; + field820 = 0; changedSkills = new int[32]; changedSkillsCount = 0; chatCycle = 0; - field744 = 0; - field830 = 0; - field831 = 0; - field832 = 0; - field833 = 0; + field824 = 0; + field825 = 0; + field826 = 0; + field652 = 0; + field834 = 0; mouseWheelRotation = 0; scriptEvents = new NodeDeque(); - field836 = new NodeDeque(); - field763 = new NodeDeque(); + field813 = new NodeDeque(); + field832 = new NodeDeque(); widgetClickMasks = new NodeHashTable(512); rootWidgetCount = 0; - field638 = -2; - field841 = new boolean[100]; + field835 = -2; field842 = new boolean[100]; - field847 = new boolean[100]; + field837 = new boolean[100]; + field631 = new boolean[100]; rootWidgetXs = new int[100]; rootWidgetYs = new int[100]; rootWidgetWidths = new int[100]; rootWidgetHeights = new int[100]; gameDrawingMode = 0; - field754 = 0L; + field736 = 0L; isResizable = true; - field851 = new int[]{16776960, 16711680, 65280, 65535, 16711935, 16777215}; + field829 = new int[]{16776960, 16711680, 65280, 65535, 16711935, 16777215}; publicChatMode = 0; tradeChatMode = 0; - field907 = ""; - field889 = new long[100]; - field856 = 0; - field857 = 0; - field858 = new int[128]; - field859 = new int[128]; - field860 = -1L; - field643 = -1; + field849 = ""; + field852 = new long[100]; + field721 = 0; + field866 = 0; + field853 = new int[128]; + field854 = new int[128]; + field663 = -1L; + field856 = -1; mapIconCount = 0; mapIconXs = new int[1000]; mapIconYs = new int[1000]; @@ -1508,9 +1493,9 @@ public final class Client extends GameShell implements Usernamed { destinationX = 0; destinationY = 0; minimapState = 0; - field761 = 255; - field666 = -1; - field759 = false; + field864 = 255; + field865 = -1; + field855 = false; soundEffectVolume = 127; field868 = 127; soundEffectCount = 0; @@ -1520,47 +1505,47 @@ public final class Client extends GameShell implements Usernamed { soundLocations = new int[50]; soundEffects = new SoundEffect[50]; isCameraLocked = false; - field835 = new boolean[5]; - field882 = new int[5]; - field883 = new int[5]; - field884 = new int[5]; - field885 = new int[5]; - field880 = 256; - field887 = 205; + field641 = new boolean[5]; + field877 = new int[5]; + field795 = new int[5]; + field879 = new int[5]; + field880 = new int[5]; + field881 = 256; + field882 = 205; zoomHeight = 256; zoomWidth = 320; - field686 = 1; - field891 = 32767; - field892 = 1; - field893 = 32767; + field885 = 1; + field886 = 32767; + field844 = 1; + field888 = 32767; viewportOffsetX = 0; viewportOffsetY = 0; viewportWidth = 0; viewportHeight = 0; viewportZoom = 0; playerAppearance = new PlayerAppearance(); - field900 = -1; - field901 = -1; + field818 = -1; + field896 = -1; platformInfoProvider = new DesktopPlatformInfoProvider(); grandExchangeOffers = new GrandExchangeOffer[8]; GrandExchangeEvents_worldComparator = new GrandExchangeOfferOwnWorldComparator(); - field905 = -1; + field900 = -1; archiveLoaders = new ArrayList(10); archiveLoadersDone = 0; - field908 = 0; - field909 = new class65(); - field910 = new int[50]; - field911 = new int[50]; + field903 = 0; + field904 = new class65(); + field890 = new int[50]; + field906 = new int[50]; } - @ObfuscatedName("b") + @ObfuscatedName("x") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "2027797509" + garbageValue = "2060332880" ) @Export("resizeGame") protected final void resizeGame() { - field754 = class30.currentTimeMillis() + 500L; + field736 = PlayerAppearance.currentTimeMillis() + 500L; this.resizeJS(); if (rootInterface != -1) { this.resizeRoot(true); @@ -1568,61 +1553,41 @@ public final class Client extends GameShell implements Usernamed { } - @ObfuscatedName("ar") + @ObfuscatedName("aj") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "16" + signature = "(I)V", + garbageValue = "-1799342365" ) @Export("setUp") protected final void setUp() { - int[] var1 = new int[]{20, 260, 10000}; - int[] var2 = new int[]{1000, 100, 500}; - if (var1 != null && var2 != null) { - ByteArrayPool.ByteArrayPool_alternativeSizes = var1; - ByteArrayPool.ByteArrayPool_altSizeArrayCounts = new int[var1.length]; - class81.ByteArrayPool_arrays = new byte[var1.length][][]; - - for (int var5 = 0; var5 < ByteArrayPool.ByteArrayPool_alternativeSizes.length; ++var5) { - class81.ByteArrayPool_arrays[var5] = new byte[var2[var5]][]; - } - } else { - ByteArrayPool.ByteArrayPool_alternativeSizes = null; - ByteArrayPool.ByteArrayPool_altSizeArrayCounts = null; - class81.ByteArrayPool_arrays = null; - } - - HitSplatDefinition.port1 = gameBuild == 0 ? 43594 : worldId + 40000; - BZip2State.port2 = gameBuild == 0 ? 443 : worldId + 50000; - NPC.port3 = HitSplatDefinition.port1; - HorizontalAlignment.field3447 = class215.field2531; - PlayerAppearance.field2519 = class215.field2530; - PlayerAppearance.field2525 = class215.field2532; - DevicePcmPlayerProvider.field390 = class215.field2529; - urlRequester = new UrlRequester(); + Huffman.method4104(new int[]{20, 260, 10000}, new int[]{1000, 100, 500}); + class222.port1 = gameBuild == 0 ? 43594 : worldId + 40000; + Decimator.port2 = gameBuild == 0 ? 443 : worldId + 50000; + GrandExchangeOfferUnitPriceComparator.port3 = class222.port1; + PlayerAppearance.field2519 = class215.field2524; + PlayerAppearance.field2520 = class215.field2527; + class326.field3881 = class215.field2526; + class195.field2359 = class215.field2525; + Skills.urlRequester = new UrlRequester(); this.setUpKeyboard(); this.setUpMouse(); KeyHandler.mouseWheel = this.mouseWheel(); - WorldMapData_0.masterDisk = new ArchiveDisk(255, JagexCache.JagexCache_dat2File, JagexCache.JagexCache_idx255File, 500000); - AbstractArchive.clientPreferences = ItemDefinition.method4667(); + WorldMapSectionType.masterDisk = new ArchiveDisk(255, JagexCache.JagexCache_dat2File, JagexCache.JagexCache_idx255File, 500000); + ScriptEvent.clientPreferences = Skeleton.method3201(); this.setUpClipboard(); - String var4 = WorldMapManager.null_string; - class51.applet = this; - if (var4 != null) { - class51.field406 = var4; - } - + NetCache.method4472(this, MusicPatchPcmStream.null_string); if (gameBuild != 0) { displayFps = true; } - UserComparator8.setWindowedMode(AbstractArchive.clientPreferences.windowMode); - Tiles.friendSystem = new FriendSystem(WorldMapSection1.loginType); + FontName.setWindowedMode(ScriptEvent.clientPreferences.windowMode); + PacketWriter.friendSystem = new FriendSystem(class60.loginType); } - @ObfuscatedName("ab") + @ObfuscatedName("ae") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-60" + garbageValue = "-127" ) @Export("doCycle") protected final void doCycle() { @@ -1636,267 +1601,1192 @@ public final class Client extends GameShell implements Usernamed { } if (var1 == null) { - break; + int var45; + try { + if (class197.field2377 == 1) { + var45 = class197.midiPcmStream.method3848(); + if (var45 > 0 && class197.midiPcmStream.isReady()) { + var45 -= class197.field2384; + if (var45 < 0) { + var45 = 0; + } + + class197.midiPcmStream.method3942(var45); + } else { + class197.midiPcmStream.clear(); + class197.midiPcmStream.removeAll(); + if (class247.musicTrackArchive != null) { + class197.field2377 = 2; + } else { + class197.field2377 = 0; + } + + class197.musicTrack = null; + ByteArrayPool.soundCache = null; + } + } + } catch (Exception var68) { + var68.printStackTrace(); + class197.midiPcmStream.clear(); + class197.field2377 = 0; + class197.musicTrack = null; + ByteArrayPool.soundCache = null; + class247.musicTrackArchive = null; + } + + ChatChannel.playPcmPlayers(); + int var46; + synchronized(KeyHandler.KeyHandler_instance) { + ++KeyHandler.KeyHandler_idleCycles; + KeyHandler.field385 = KeyHandler.field370; + KeyHandler.field384 = 0; + if (KeyHandler.field380 >= 0) { + while (KeyHandler.field380 != KeyHandler.field379) { + var46 = KeyHandler.field378[KeyHandler.field379]; + KeyHandler.field379 = KeyHandler.field379 + 1 & 127; + if (var46 < 0) { + KeyHandler.KeyHandler_pressedKeys[~var46] = false; + } else { + if (!KeyHandler.KeyHandler_pressedKeys[var46] && KeyHandler.field384 < KeyHandler.field383.length - 1) { + KeyHandler.field383[++KeyHandler.field384 - 1] = var46; + } + + KeyHandler.KeyHandler_pressedKeys[var46] = true; + } + } + } else { + for (var46 = 0; var46 < 112; ++var46) { + KeyHandler.KeyHandler_pressedKeys[var46] = false; + } + + KeyHandler.field380 = KeyHandler.field379; + } + + if (KeyHandler.field384 > 0) { + KeyHandler.KeyHandler_idleCycles = 0; + } + + KeyHandler.field370 = KeyHandler.field387; + } + + synchronized(MouseHandler.MouseHandler_instance) { + MouseHandler.MouseHandler_currentButton = MouseHandler.MouseHandler_currentButtonVolatile; + MouseHandler.MouseHandler_x = MouseHandler.MouseHandler_xVolatile; + MouseHandler.MouseHandler_y = MouseHandler.MouseHandler_yVolatile; + MouseHandler.MouseHandler_millis = MouseHandler.MouseHandler_lastMovedVolatile; + MouseHandler.MouseHandler_lastButton = MouseHandler.MouseHandler_lastButtonVolatile; + MouseHandler.MouseHandler_lastPressedX = MouseHandler.MouseHandler_lastPressedXVolatile; + MouseHandler.MouseHandler_lastPressedY = MouseHandler.MouseHandler_lastPressedYVolatile; + MouseHandler.MouseHandler_lastPressedTimeMillis = MouseHandler.MouseHandler_lastPressedTimeMillisVolatile; + MouseHandler.MouseHandler_lastButtonVolatile = 0; + } + + if (KeyHandler.mouseWheel != null) { + var45 = KeyHandler.mouseWheel.useRotation(); + mouseWheelRotation = var45; + } + + if (gameState == 0) { + NetCache.load(); + HealthBar.method2161(); + } else if (gameState == 5) { + class189.doCycleTitle(this); + NetCache.load(); + HealthBar.method2161(); + } else if (gameState != 10 && gameState != 11) { + if (gameState == 20) { + class189.doCycleTitle(this); + this.doCycleLoggedOut(); + } else if (gameState == 25) { + GrandExchangeOfferNameComparator.method172(false); + field684 = 0; + boolean var79 = true; + + for (var46 = 0; var46 < UrlRequester.regionLandArchives.length; ++var46) { + if (class338.regionMapArchiveIds[var46] != -1 && UrlRequester.regionLandArchives[var46] == null) { + UrlRequester.regionLandArchives[var46] = WorldMapRectangle.archive5.takeFile(class338.regionMapArchiveIds[var46], 0); + if (UrlRequester.regionLandArchives[var46] == null) { + var79 = false; + ++field684; + } + } + + if (WorldMapCacheName.regionLandArchiveIds[var46] != -1 && UserComparator3.regionMapArchives[var46] == null) { + UserComparator3.regionMapArchives[var46] = WorldMapRectangle.archive5.takeFileEncrypted(WorldMapCacheName.regionLandArchiveIds[var46], 0, ClientPacket.xteaKeys[var46]); + if (UserComparator3.regionMapArchives[var46] == null) { + var79 = false; + ++field684; + } + } + } + + if (!var79) { + field688 = 1; + } else { + field686 = 0; + var79 = true; + + Buffer var9; + int var10; + int var11; + int var12; + int var14; + int var15; + int var16; + int var17; + int var18; + int var19; + int var47; + int var48; + for (var46 = 0; var46 < UrlRequester.regionLandArchives.length; ++var46) { + byte[] var3 = UserComparator3.regionMapArchives[var46]; + if (var3 != null) { + var47 = (GrandExchangeOfferOwnWorldComparator.regions[var46] >> 8) * 64 - UserComparator8.baseX * 64; + var48 = (GrandExchangeOfferOwnWorldComparator.regions[var46] & 255) * 64 - HealthBar.baseY * 64; + if (isInInstance) { + var47 = 10; + var48 = 10; + } + + boolean var8 = true; + var9 = new Buffer(var3); + var10 = -1; + + label1395: + while (true) { + var11 = var9.method5623(); + if (var11 == 0) { + var79 &= var8; + break; + } + + var10 += var11; + var12 = 0; + boolean var13 = false; + + while (true) { + while (!var13) { + var14 = var9.readUShortSmart(); + if (var14 == 0) { + continue label1395; + } + + var12 += var14 - 1; + var15 = var12 & 63; + var16 = var12 >> 6 & 63; + var17 = var9.readUnsignedByte() >> 2; + var18 = var16 + var47; + var19 = var48 + var15; + if (var18 > 0 && var19 > 0 && var18 < 103 && var19 < 103) { + ObjectDefinition var20 = WorldMapDecorationType.getObjectDefinition(var10); + if (var17 != 22 || !isLowDetail || var20.int1 != 0 || var20.interactType == 1 || var20.boolean2) { + if (!var20.needsModelFiles()) { + ++field686; + var8 = false; + } + + var13 = true; + } + } + } + + var14 = var9.readUShortSmart(); + if (var14 == 0) { + break; + } + + var9.readUnsignedByte(); + } + } + } + } + + if (!var79) { + field688 = 2; + } else { + if (field688 != 0) { + GrandExchangeEvents.drawLoadingMessage("Loading - please wait." + "
" + " (" + 100 + "%" + ")", true); + } + + ChatChannel.playPcmPlayers(); + WorldMapArea.scene.clear(); + + for (var46 = 0; var46 < 4; ++var46) { + collisionMaps[var46].clear(); + } + + int var49; + for (var46 = 0; var46 < 4; ++var46) { + for (var49 = 0; var49 < 104; ++var49) { + for (var47 = 0; var47 < 104; ++var47) { + Tiles.Tiles_renderFlags[var46][var49][var47] = 0; + } + } + } + + ChatChannel.playPcmPlayers(); + MusicPatchPcmStream.method4038(); + var46 = UrlRequester.regionLandArchives.length; + GameShell.method1141(); + GrandExchangeOfferNameComparator.method172(true); + int var6; + int var21; + int var22; + int var53; + int var73; + if (!isInInstance) { + byte[] var50; + for (var49 = 0; var49 < var46; ++var49) { + var47 = (GrandExchangeOfferOwnWorldComparator.regions[var49] >> 8) * 64 - UserComparator8.baseX * 64; + var48 = (GrandExchangeOfferOwnWorldComparator.regions[var49] & 255) * 64 - HealthBar.baseY * 64; + var50 = UrlRequester.regionLandArchives[var49]; + if (var50 != null) { + ChatChannel.playPcmPlayers(); + TilePaint.method3200(var50, var47, var48, WorldMapSectionType.field140 * 8 - 48, ScriptEvent.field563 * 8 - 48, collisionMaps); + } + } + + for (var49 = 0; var49 < var46; ++var49) { + var47 = (GrandExchangeOfferOwnWorldComparator.regions[var49] >> 8) * 64 - UserComparator8.baseX * 64; + var48 = (GrandExchangeOfferOwnWorldComparator.regions[var49] & 255) * 64 - HealthBar.baseY * 64; + var50 = UrlRequester.regionLandArchives[var49]; + if (var50 == null && ScriptEvent.field563 < 800) { + ChatChannel.playPcmPlayers(); + class30.method609(var47, var48, 64, 64); + } + } + + GrandExchangeOfferNameComparator.method172(true); + + for (var49 = 0; var49 < var46; ++var49) { + byte[] var4 = UserComparator3.regionMapArchives[var49]; + if (var4 != null) { + var48 = (GrandExchangeOfferOwnWorldComparator.regions[var49] >> 8) * 64 - UserComparator8.baseX * 64; + var6 = (GrandExchangeOfferOwnWorldComparator.regions[var49] & 255) * 64 - HealthBar.baseY * 64; + ChatChannel.playPcmPlayers(); + Scene var51 = WorldMapArea.scene; + CollisionMap[] var52 = collisionMaps; + var9 = new Buffer(var4); + var10 = -1; + + while (true) { + var11 = var9.method5623(); + if (var11 == 0) { + break; + } + + var10 += var11; + var12 = 0; + + while (true) { + var73 = var9.readUShortSmart(); + if (var73 == 0) { + break; + } + + var12 += var73 - 1; + var14 = var12 & 63; + var15 = var12 >> 6 & 63; + var16 = var12 >> 12; + var17 = var9.readUnsignedByte(); + var18 = var17 >> 2; + var19 = var17 & 3; + var53 = var15 + var48; + var21 = var14 + var6; + if (var53 > 0 && var21 > 0 && var53 < 103 && var21 < 103) { + var22 = var16; + if ((Tiles.Tiles_renderFlags[1][var53][var21] & 2) == 2) { + var22 = var16 - 1; + } + + CollisionMap var23 = null; + if (var22 >= 0) { + var23 = var52[var22]; + } + + class247.method4637(var16, var53, var21, var10, var19, var18, var51, var23); + } + } + } + } + } + } + + int var7; + int[] var10000; + int var27; + int var28; + int var29; + int var30; + int var33; + int var35; + int var36; + int var37; + int var54; + int var57; + int var72; + if (isInInstance) { + var49 = 0; + + label1300: + while (true) { + if (var49 >= 4) { + for (var49 = 0; var49 < 13; ++var49) { + for (var47 = 0; var47 < 13; ++var47) { + var48 = instanceChunkTemplates[0][var49][var47]; + if (var48 == -1) { + class30.method609(var49 * 8, var47 * 8, 8, 8); + } + } + } + + GrandExchangeOfferNameComparator.method172(true); + var49 = 0; + + while (true) { + if (var49 >= 4) { + break label1300; + } + + ChatChannel.playPcmPlayers(); + + for (var47 = 0; var47 < 13; ++var47) { + for (var48 = 0; var48 < 13; ++var48) { + var6 = instanceChunkTemplates[var49][var47][var48]; + if (var6 != -1) { + var7 = var6 >> 24 & 3; + var72 = var6 >> 1 & 3; + var54 = var6 >> 14 & 1023; + var10 = var6 >> 3 & 2047; + var11 = (var54 / 8 << 8) + var10 / 8; + + for (var12 = 0; var12 < GrandExchangeOfferOwnWorldComparator.regions.length; ++var12) { + if (GrandExchangeOfferOwnWorldComparator.regions[var12] == var11 && UserComparator3.regionMapArchives[var12] != null) { + class218.method4263(UserComparator3.regionMapArchives[var12], var49, var47 * 8, var48 * 8, var7, (var54 & 7) * 8, (var10 & 7) * 8, var72, WorldMapArea.scene, collisionMaps); + break; + } + } + } + } + } + + ++var49; + } + } + + ChatChannel.playPcmPlayers(); + + for (var47 = 0; var47 < 13; ++var47) { + for (var48 = 0; var48 < 13; ++var48) { + boolean var71 = false; + var7 = instanceChunkTemplates[var49][var47][var48]; + if (var7 != -1) { + var72 = var7 >> 24 & 3; + var54 = var7 >> 1 & 3; + var10 = var7 >> 14 & 1023; + var11 = var7 >> 3 & 2047; + var12 = (var10 / 8 << 8) + var11 / 8; + + for (var73 = 0; var73 < GrandExchangeOfferOwnWorldComparator.regions.length; ++var73) { + if (GrandExchangeOfferOwnWorldComparator.regions[var73] == var12 && UrlRequester.regionLandArchives[var73] != null) { + byte[] var55 = UrlRequester.regionLandArchives[var73]; + var15 = var47 * 8; + var16 = var48 * 8; + var17 = (var10 & 7) * 8; + var18 = (var11 & 7) * 8; + CollisionMap[] var56 = collisionMaps; + + for (var53 = 0; var53 < 8; ++var53) { + for (var21 = 0; var21 < 8; ++var21) { + if (var53 + var15 > 0 && var53 + var15 < 103 && var16 + var21 > 0 && var16 + var21 < 103) { + var10000 = var56[var49].flags[var53 + var15]; + var10000[var21 + var16] &= -16777217; + } + } + } + + Buffer var74 = new Buffer(var55); + + for (var21 = 0; var21 < 4; ++var21) { + for (var22 = 0; var22 < 64; ++var22) { + for (var57 = 0; var57 < 64; ++var57) { + if (var72 == var21 && var22 >= var17 && var22 < var17 + 8 && var57 >= var18 && var57 < var18 + 8) { + var28 = var22 & 7; + var29 = var57 & 7; + var30 = var54 & 3; + if (var30 == 0) { + var27 = var28; + } else if (var30 == 1) { + var27 = var29; + } else if (var30 == 2) { + var27 = 7 - var28; + } else { + var27 = 7 - var29; + } + + var33 = var27 + var15; + var36 = var22 & 7; + var37 = var57 & 7; + int var38 = var54 & 3; + if (var38 == 0) { + var35 = var37; + } else if (var38 == 1) { + var35 = 7 - var36; + } else if (var38 == 2) { + var35 = 7 - var37; + } else { + var35 = var36; + } + + class312.loadTerrain(var74, var49, var33, var35 + var16, 0, 0, var54); + } else { + class312.loadTerrain(var74, 0, -1, -1, 0, 0, 0); + } + } + } + } + + var71 = true; + break; + } + } + } + + if (!var71) { + class160.method3585(var49, var47 * 8, var48 * 8); + } + } + } + + ++var49; + } + } + + GrandExchangeOfferNameComparator.method172(true); + ChatChannel.playPcmPlayers(); + Scene var69 = WorldMapArea.scene; + CollisionMap[] var70 = collisionMaps; + + for (var48 = 0; var48 < 4; ++var48) { + for (var6 = 0; var6 < 104; ++var6) { + for (var7 = 0; var7 < 104; ++var7) { + if ((Tiles.Tiles_renderFlags[var48][var6][var7] & 1) == 1) { + var72 = var48; + if ((Tiles.Tiles_renderFlags[1][var6][var7] & 2) == 2) { + var72 = var48 - 1; + } + + if (var72 >= 0) { + var70[var72].setBlockedByFloor(var6, var7); + } + } + } + } + } + + Tiles.field495 += (int)(Math.random() * 5.0D) - 2; + if (Tiles.field495 < -8) { + Tiles.field495 = -8; + } + + if (Tiles.field495 > 8) { + Tiles.field495 = 8; + } + + Tiles.field496 += (int)(Math.random() * 5.0D) - 2; + if (Tiles.field496 < -16) { + Tiles.field496 = -16; + } + + if (Tiles.field496 > 16) { + Tiles.field496 = 16; + } + + for (var48 = 0; var48 < 4; ++var48) { + byte[][] var80 = class96.field1300[var48]; + var12 = (int)Math.sqrt(5100.0D); + var73 = var12 * 768 >> 8; + + for (var14 = 1; var14 < 103; ++var14) { + for (var15 = 1; var15 < 103; ++var15) { + var16 = Tiles.Tiles_heights[var48][var15 + 1][var14] - Tiles.Tiles_heights[var48][var15 - 1][var14]; + var17 = Tiles.Tiles_heights[var48][var15][var14 + 1] - Tiles.Tiles_heights[var48][var15][var14 - 1]; + var18 = (int)Math.sqrt((double)(var16 * var16 + var17 * var17 + 65536)); + var19 = (var16 << 8) / var18; + var53 = 65536 / var18; + var21 = (var17 << 8) / var18; + var22 = (var19 * -50 + var21 * -50 + var53 * -10) / var73 + 96; + var57 = (var80[var15][var14 + 1] >> 3) + (var80[var15 - 1][var14] >> 2) + (var80[var15][var14 - 1] >> 2) + (var80[var15 + 1][var14] >> 3) + (var80[var15][var14] >> 1); + UserComparator10.field1964[var15][var14] = var22 - var57; + } + } + + for (var14 = 0; var14 < 104; ++var14) { + Tiles.Tiles_hue[var14] = 0; + Tiles.Tiles_saturation[var14] = 0; + Tiles.Tiles_lightness[var14] = 0; + Tiles.Tiles_hueMultiplier[var14] = 0; + PlayerType.field3083[var14] = 0; + } + + for (var14 = -5; var14 < 109; ++var14) { + for (var15 = 0; var15 < 104; ++var15) { + var16 = var14 + 5; + int var10002; + if (var16 >= 0 && var16 < 104) { + var17 = SoundSystem.field1414[var48][var16][var15] & 255; + if (var17 > 0) { + var19 = var17 - 1; + FloorUnderlayDefinition var75 = (FloorUnderlayDefinition)FloorUnderlayDefinition.FloorUnderlayDefinition_cached.get((long)var19); + FloorUnderlayDefinition var58; + if (var75 != null) { + var58 = var75; + } else { + byte[] var59 = FloorUnderlayDefinition.FloorUnderlayDefinition_archive.takeFile(1, var19); + var75 = new FloorUnderlayDefinition(); + if (var59 != null) { + var75.decode(new Buffer(var59), var19); + } + + var75.postDecode(); + FloorUnderlayDefinition.FloorUnderlayDefinition_cached.put(var75, (long)var19); + var58 = var75; + } + + var10000 = Tiles.Tiles_hue; + var10000[var15] += var58.hue; + var10000 = Tiles.Tiles_saturation; + var10000[var15] += var58.saturation; + var10000 = Tiles.Tiles_lightness; + var10000[var15] += var58.lightness; + var10000 = Tiles.Tiles_hueMultiplier; + var10000[var15] += var58.hueMultiplier; + var10002 = PlayerType.field3083[var15]++; + } + } + + var17 = var14 - 5; + if (var17 >= 0 && var17 < 104) { + var18 = SoundSystem.field1414[var48][var17][var15] & 255; + if (var18 > 0) { + var53 = var18 - 1; + FloorUnderlayDefinition var84 = (FloorUnderlayDefinition)FloorUnderlayDefinition.FloorUnderlayDefinition_cached.get((long)var53); + FloorUnderlayDefinition var83; + if (var84 != null) { + var83 = var84; + } else { + byte[] var60 = FloorUnderlayDefinition.FloorUnderlayDefinition_archive.takeFile(1, var53); + var84 = new FloorUnderlayDefinition(); + if (var60 != null) { + var84.decode(new Buffer(var60), var53); + } + + var84.postDecode(); + FloorUnderlayDefinition.FloorUnderlayDefinition_cached.put(var84, (long)var53); + var83 = var84; + } + + var10000 = Tiles.Tiles_hue; + var10000[var15] -= var83.hue; + var10000 = Tiles.Tiles_saturation; + var10000[var15] -= var83.saturation; + var10000 = Tiles.Tiles_lightness; + var10000[var15] -= var83.lightness; + var10000 = Tiles.Tiles_hueMultiplier; + var10000[var15] -= var83.hueMultiplier; + var10002 = PlayerType.field3083[var15]--; + } + } + } + + if (var14 >= 1 && var14 < 103) { + var15 = 0; + var16 = 0; + var17 = 0; + var18 = 0; + var19 = 0; + + for (var53 = -5; var53 < 109; ++var53) { + var21 = var53 + 5; + if (var21 >= 0 && var21 < 104) { + var15 += Tiles.Tiles_hue[var21]; + var16 += Tiles.Tiles_saturation[var21]; + var17 += Tiles.Tiles_lightness[var21]; + var18 += Tiles.Tiles_hueMultiplier[var21]; + var19 += PlayerType.field3083[var21]; + } + + var22 = var53 - 5; + if (var22 >= 0 && var22 < 104) { + var15 -= Tiles.Tiles_hue[var22]; + var16 -= Tiles.Tiles_saturation[var22]; + var17 -= Tiles.Tiles_lightness[var22]; + var18 -= Tiles.Tiles_hueMultiplier[var22]; + var19 -= PlayerType.field3083[var22]; + } + + if (var53 >= 1 && var53 < 103 && (!isLowDetail || (Tiles.Tiles_renderFlags[0][var14][var53] & 2) != 0 || (Tiles.Tiles_renderFlags[var48][var14][var53] & 16) == 0)) { + if (var48 < Tiles.Tiles_minPlane) { + Tiles.Tiles_minPlane = var48; + } + + var57 = SoundSystem.field1414[var48][var14][var53] & 255; + int var61 = Tiles.field485[var48][var14][var53] & 255; + if (var57 > 0 || var61 > 0) { + int var25 = Tiles.Tiles_heights[var48][var14][var53]; + int var26 = Tiles.Tiles_heights[var48][var14 + 1][var53]; + var27 = Tiles.Tiles_heights[var48][var14 + 1][var53 + 1]; + var28 = Tiles.Tiles_heights[var48][var14][var53 + 1]; + var29 = UserComparator10.field1964[var14][var53]; + var30 = UserComparator10.field1964[var14 + 1][var53]; + int var62 = UserComparator10.field1964[var14 + 1][var53 + 1]; + int var32 = UserComparator10.field1964[var14][var53 + 1]; + var33 = -1; + int var34 = -1; + if (var57 > 0) { + var35 = var15 * 256 / var18; + var36 = var16 / var19; + var37 = var17 / var19; + var33 = EnumDefinition.hslToRgb(var35, var36, var37); + var35 = var35 + Tiles.field495 & 255; + var37 += Tiles.field496; + if (var37 < 0) { + var37 = 0; + } else if (var37 > 255) { + var37 = 255; + } + + var34 = EnumDefinition.hslToRgb(var35, var36, var37); + } + + if (var48 > 0) { + boolean var77 = true; + if (var57 == 0 && Tiles.field482[var48][var14][var53] != 0) { + var77 = false; + } + + if (var61 > 0 && !WorldMapDecoration.FloorUnderlayDefinition_get(var61 - 1).hideUnderlay) { + var77 = false; + } + + if (var77 && var25 == var26 && var25 == var27 && var28 == var25) { + var10000 = Tiles.field488[var48][var14]; + var10000[var53] |= 2340; + } + } + + var35 = 0; + if (var34 != -1) { + var35 = Rasterizer3D.Rasterizer3D_colorPalette[WorldMapCacheName.method686(var34, 96)]; + } + + if (var61 == 0) { + var69.addTile(var48, var14, var53, 0, 0, -1, var25, var26, var27, var28, WorldMapCacheName.method686(var33, var29), WorldMapCacheName.method686(var33, var30), WorldMapCacheName.method686(var33, var62), WorldMapCacheName.method686(var33, var32), 0, 0, 0, 0, var35, 0); + } else { + var36 = Tiles.field482[var48][var14][var53] + 1; + byte var78 = Tiles.field483[var48][var14][var53]; + FloorOverlayDefinition var63 = WorldMapDecoration.FloorUnderlayDefinition_get(var61 - 1); + int var39 = var63.texture; + int var40; + int var41; + int var42; + int var43; + if (var39 >= 0) { + var41 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var39); + var40 = -1; + } else if (var63.primaryRgb == 16711935) { + var40 = -2; + var39 = -1; + var41 = -2; + } else { + var40 = EnumDefinition.hslToRgb(var63.hue, var63.saturation, var63.lightness); + var42 = var63.hue + Tiles.field495 & 255; + var43 = var63.lightness + Tiles.field496; + if (var43 < 0) { + var43 = 0; + } else if (var43 > 255) { + var43 = 255; + } + + var41 = EnumDefinition.hslToRgb(var42, var63.saturation, var43); + } + + var42 = 0; + if (var41 != -2) { + var42 = Rasterizer3D.Rasterizer3D_colorPalette[HealthBarUpdate.method1880(var41, 96)]; + } + + if (var63.secondaryRgb != -1) { + var43 = var63.secondaryHue + Tiles.field495 & 255; + int var44 = var63.secondaryLightness + Tiles.field496; + if (var44 < 0) { + var44 = 0; + } else if (var44 > 255) { + var44 = 255; + } + + var41 = EnumDefinition.hslToRgb(var43, var63.secondarySaturation, var44); + var42 = Rasterizer3D.Rasterizer3D_colorPalette[HealthBarUpdate.method1880(var41, 96)]; + } + + var69.addTile(var48, var14, var53, var36, var78, var39, var25, var26, var27, var28, WorldMapCacheName.method686(var33, var29), WorldMapCacheName.method686(var33, var30), WorldMapCacheName.method686(var33, var62), WorldMapCacheName.method686(var33, var32), HealthBarUpdate.method1880(var40, var29), HealthBarUpdate.method1880(var40, var30), HealthBarUpdate.method1880(var40, var62), HealthBarUpdate.method1880(var40, var32), var35, var42); + } + } + } + } + } + } + + for (var14 = 1; var14 < 103; ++var14) { + for (var15 = 1; var15 < 103; ++var15) { + if ((Tiles.Tiles_renderFlags[var48][var15][var14] & 8) != 0) { + var53 = 0; + } else if (var48 > 0 && (Tiles.Tiles_renderFlags[1][var15][var14] & 2) != 0) { + var53 = var48 - 1; + } else { + var53 = var48; + } + + var69.setTileMinPlane(var48, var15, var14, var53); + } + } + + SoundSystem.field1414[var48] = null; + Tiles.field485[var48] = null; + Tiles.field482[var48] = null; + Tiles.field483[var48] = null; + class96.field1300[var48] = null; + } + + var69.method3234(-50, -10, -50); + + for (var48 = 0; var48 < 104; ++var48) { + for (var6 = 0; var6 < 104; ++var6) { + if ((Tiles.Tiles_renderFlags[1][var48][var6] & 2) == 2) { + var69.setLinkBelow(var48, var6); + } + } + } + + var48 = 1; + var6 = 2; + var7 = 4; + + for (var72 = 0; var72 < 4; ++var72) { + if (var72 > 0) { + var48 <<= 3; + var6 <<= 3; + var7 <<= 3; + } + + for (var54 = 0; var54 <= var72; ++var54) { + for (var10 = 0; var10 <= 104; ++var10) { + for (var11 = 0; var11 <= 104; ++var11) { + short var76; + if ((Tiles.field488[var54][var11][var10] & var48) != 0) { + var12 = var10; + var73 = var10; + var14 = var54; + + for (var15 = var54; var12 > 0 && (Tiles.field488[var54][var11][var12 - 1] & var48) != 0; --var12) { + } + + while (var73 < 104 && (Tiles.field488[var54][var11][var73 + 1] & var48) != 0) { + ++var73; + } + + label951: + while (var14 > 0) { + for (var16 = var12; var16 <= var73; ++var16) { + if ((Tiles.field488[var14 - 1][var11][var16] & var48) == 0) { + break label951; + } + } + + --var14; + } + + label940: + while (var15 < var72) { + for (var16 = var12; var16 <= var73; ++var16) { + if ((Tiles.field488[var15 + 1][var11][var16] & var48) == 0) { + break label940; + } + } + + ++var15; + } + + var16 = (var73 - var12 + 1) * (var15 + 1 - var14); + if (var16 >= 8) { + var76 = 240; + var18 = Tiles.Tiles_heights[var15][var11][var12] - var76; + var19 = Tiles.Tiles_heights[var14][var11][var12]; + Scene.Scene_addOccluder(var72, 1, var11 * 128, var11 * 128, var12 * 128, var73 * 128 + 128, var18, var19); + + for (var53 = var14; var53 <= var15; ++var53) { + for (var21 = var12; var21 <= var73; ++var21) { + var10000 = Tiles.field488[var53][var11]; + var10000[var21] &= ~var48; + } + } + } + } + + if ((Tiles.field488[var54][var11][var10] & var6) != 0) { + var12 = var11; + var73 = var11; + var14 = var54; + + for (var15 = var54; var12 > 0 && (Tiles.field488[var54][var12 - 1][var10] & var6) != 0; --var12) { + } + + while (var73 < 104 && (Tiles.field488[var54][var73 + 1][var10] & var6) != 0) { + ++var73; + } + + label1004: + while (var14 > 0) { + for (var16 = var12; var16 <= var73; ++var16) { + if ((Tiles.field488[var14 - 1][var16][var10] & var6) == 0) { + break label1004; + } + } + + --var14; + } + + label993: + while (var15 < var72) { + for (var16 = var12; var16 <= var73; ++var16) { + if ((Tiles.field488[var15 + 1][var16][var10] & var6) == 0) { + break label993; + } + } + + ++var15; + } + + var16 = (var73 - var12 + 1) * (var15 + 1 - var14); + if (var16 >= 8) { + var76 = 240; + var18 = Tiles.Tiles_heights[var15][var12][var10] - var76; + var19 = Tiles.Tiles_heights[var14][var12][var10]; + Scene.Scene_addOccluder(var72, 2, var12 * 128, var73 * 128 + 128, var10 * 128, var10 * 128, var18, var19); + + for (var53 = var14; var53 <= var15; ++var53) { + for (var21 = var12; var21 <= var73; ++var21) { + var10000 = Tiles.field488[var53][var21]; + var10000[var10] &= ~var6; + } + } + } + } + + if ((Tiles.field488[var54][var11][var10] & var7) != 0) { + var12 = var11; + var73 = var11; + var14 = var10; + + for (var15 = var10; var14 > 0 && (Tiles.field488[var54][var11][var14 - 1] & var7) != 0; --var14) { + } + + while (var15 < 104 && (Tiles.field488[var54][var11][var15 + 1] & var7) != 0) { + ++var15; + } + + label1057: + while (var12 > 0) { + for (var16 = var14; var16 <= var15; ++var16) { + if ((Tiles.field488[var54][var12 - 1][var16] & var7) == 0) { + break label1057; + } + } + + --var12; + } + + label1046: + while (var73 < 104) { + for (var16 = var14; var16 <= var15; ++var16) { + if ((Tiles.field488[var54][var73 + 1][var16] & var7) == 0) { + break label1046; + } + } + + ++var73; + } + + if ((var15 - var14 + 1) * (var73 - var12 + 1) >= 4) { + var16 = Tiles.Tiles_heights[var54][var12][var14]; + Scene.Scene_addOccluder(var72, 4, var12 * 128, var73 * 128 + 128, var14 * 128, var15 * 128 + 128, var16, var16); + + for (var17 = var12; var17 <= var73; ++var17) { + for (var18 = var14; var18 <= var15; ++var18) { + var10000 = Tiles.field488[var54][var17]; + var10000[var18] &= ~var7; + } + } + } + } + } + } + } + } + + GrandExchangeOfferNameComparator.method172(true); + var48 = Tiles.Tiles_minPlane; + if (var48 > Player.Scene_plane) { + var48 = Player.Scene_plane; + } + + if (var48 < Player.Scene_plane - 1) { + var48 = Player.Scene_plane - 1; + } + + if (isLowDetail) { + WorldMapArea.scene.init(Tiles.Tiles_minPlane); + } else { + WorldMapArea.scene.init(0); + } + + for (var6 = 0; var6 < 104; ++var6) { + for (var7 = 0; var7 < 104; ++var7) { + class4.updateItemPile(var6, var7); + } + } + + ChatChannel.playPcmPlayers(); + + for (PendingSpawn var81 = (PendingSpawn)pendingSpawns.last(); var81 != null; var81 = (PendingSpawn)pendingSpawns.previous()) { + if (var81.hitpoints == -1) { + var81.delay = 0; + FaceNormal.method3396(var81); + } else { + var81.remove(); + } + } + + ObjectDefinition.ObjectDefinition_cachedModelData.clear(); + PacketBufferNode var82; + if (WorldMapID.client.hasFrame()) { + var82 = SoundSystem.getPacketBufferNode(ClientPacket.field2271, packetWriter.isaacCipher); + var82.packetBuffer.writeInt(1057001181); + packetWriter.addNode(var82); + } + + if (!isInInstance) { + var6 = (WorldMapSectionType.field140 - 6) / 8; + var7 = (WorldMapSectionType.field140 + 6) / 8; + var72 = (ScriptEvent.field563 - 6) / 8; + var54 = (ScriptEvent.field563 + 6) / 8; + + for (var10 = var6 - 1; var10 <= var7 + 1; ++var10) { + for (var11 = var72 - 1; var11 <= var54 + 1; ++var11) { + if (var10 < var6 || var10 > var7 || var11 < var72 || var11 > var54) { + WorldMapRectangle.archive5.loadRegionFromName("m" + var10 + "_" + var11); + WorldMapRectangle.archive5.loadRegionFromName("l" + var10 + "_" + var11); + } + } + } + } + + Tile.updateGameState(30); + ChatChannel.playPcmPlayers(); + SoundSystem.field1414 = null; + Tiles.field485 = null; + Tiles.field482 = null; + Tiles.field483 = null; + Tiles.field488 = null; + class96.field1300 = null; + UserComparator10.field1964 = null; + Tiles.Tiles_hue = null; + Tiles.Tiles_saturation = null; + Tiles.Tiles_lightness = null; + Tiles.Tiles_hueMultiplier = null; + PlayerType.field3083 = null; + var82 = SoundSystem.getPacketBufferNode(ClientPacket.field2280, packetWriter.isaacCipher); + packetWriter.addNode(var82); + HealthBar.method2161(); + } + } + } + } else { + class189.doCycleTitle(this); + } + + if (gameState == 30) { + this.doCycleLoggedIn(); + } else if (gameState == 40 || gameState == 45) { + this.doCycleLoggedOut(); + } + + return; } var1.archive.load(var1.archiveDisk, (int)var1.key, var1.data, false); } - - try { - if (class197.field2386 == 1) { - int var5 = class49.midiPcmStream.method3745(); - if (var5 > 0 && class49.midiPcmStream.isReady()) { - var5 -= MusicPatchNode2.field2382; - if (var5 < 0) { - var5 = 0; - } - - class49.midiPcmStream.method3760(var5); - } else { - class49.midiPcmStream.clear(); - class49.midiPcmStream.removeAll(); - if (class197.musicTrackArchive != null) { - class197.field2386 = 2; - } else { - class197.field2386 = 0; - } - - class197.musicTrack = null; - FriendLoginUpdate.soundCache = null; - } - } - } catch (Exception var9) { - var9.printStackTrace(); - class49.midiPcmStream.clear(); - class197.field2386 = 0; - class197.musicTrack = null; - FriendLoginUpdate.soundCache = null; - class197.musicTrackArchive = null; - } - - WorldMapID.playPcmPlayers(); - synchronized(KeyHandler.KeyHandler_instance) { - ++KeyHandler.KeyHandler_idleCycles; - KeyHandler.field378 = KeyHandler.field380; - KeyHandler.field361 = 0; - int var6; - if (KeyHandler.field373 >= 0) { - while (KeyHandler.field373 != KeyHandler.field372) { - var6 = KeyHandler.field365[KeyHandler.field372]; - KeyHandler.field372 = KeyHandler.field372 + 1 & 127; - if (var6 < 0) { - KeyHandler.KeyHandler_pressedKeys[~var6] = false; - } else { - if (!KeyHandler.KeyHandler_pressedKeys[var6] && KeyHandler.field361 < KeyHandler.field376.length - 1) { - KeyHandler.field376[++KeyHandler.field361 - 1] = var6; - } - - KeyHandler.KeyHandler_pressedKeys[var6] = true; - } - } - } else { - for (var6 = 0; var6 < 112; ++var6) { - KeyHandler.KeyHandler_pressedKeys[var6] = false; - } - - KeyHandler.field373 = KeyHandler.field372; - } - - if (KeyHandler.field361 > 0) { - KeyHandler.KeyHandler_idleCycles = 0; - } - - KeyHandler.field380 = KeyHandler.field371; - } - - VertexNormal.method2959(); - if (KeyHandler.mouseWheel != null) { - int var5 = KeyHandler.mouseWheel.useRotation(); - mouseWheelRotation = var5; - } - - if (gameState == 0) { - class189.load(); - WorldMapDecoration.method343(); - } else if (gameState == 5) { - LoginPacket.doCycleTitle(this); - class189.load(); - WorldMapDecoration.method343(); - } else if (gameState == 10 || gameState == 11) { - LoginPacket.doCycleTitle(this); - } else if (gameState == 20) { - LoginPacket.doCycleTitle(this); - this.doCycleLoggedOut(); - } else if (gameState == 25) { - KeyHandler.method851(); - } - - if (gameState == 30) { - this.doCycleLoggedIn(); - } else if (gameState == 40 || gameState == 45) { - this.doCycleLoggedOut(); - } } - @ObfuscatedName("ax") + @ObfuscatedName("au") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "-1679134607" + garbageValue = "-1361952953" ) @Export("draw") protected final void draw(boolean var1) { boolean var2; - label168: { + label170: { try { - if (class197.field2386 == 2) { + if (class197.field2377 == 2) { if (class197.musicTrack == null) { - class197.musicTrack = MusicTrack.readTrack(class197.musicTrackArchive, class188.musicTrackGroupId, class49.musicTrackFileId); + class197.musicTrack = MusicTrack.readTrack(class247.musicTrackArchive, class189.musicTrackGroupId, class197.musicTrackFileId); if (class197.musicTrack == null) { var2 = false; - break label168; + break label170; } } - if (FriendLoginUpdate.soundCache == null) { - FriendLoginUpdate.soundCache = new SoundCache(class197.soundEffectsArchive, SecureRandomCallable.musicSamplesArchive); + if (ByteArrayPool.soundCache == null) { + ByteArrayPool.soundCache = new SoundCache(class197.soundEffectsArchive, class197.musicSamplesArchive); } - if (class49.midiPcmStream.loadMusicTrack(class197.musicTrack, class197.musicPatchesArchive, FriendLoginUpdate.soundCache, 22050)) { - class49.midiPcmStream.clearAll(); - class49.midiPcmStream.method3760(TileItem.field1223); - class49.midiPcmStream.setMusicTrack(class197.musicTrack, WorldMapSectionType.musicTrackBoolean); - class197.field2386 = 0; + if (class197.midiPcmStream.loadMusicTrack(class197.musicTrack, class197.musicPatchesArchive, ByteArrayPool.soundCache, 22050)) { + class197.midiPcmStream.clearAll(); + class197.midiPcmStream.method3942(class197.field2379); + class197.midiPcmStream.setMusicTrack(class197.musicTrack, ScriptFrame.musicTrackBoolean); + class197.field2377 = 0; class197.musicTrack = null; - FriendLoginUpdate.soundCache = null; - class197.musicTrackArchive = null; + ByteArrayPool.soundCache = null; + class247.musicTrackArchive = null; var2 = true; - break label168; + break label170; } } } catch (Exception var6) { var6.printStackTrace(); - class49.midiPcmStream.clear(); - class197.field2386 = 0; + class197.midiPcmStream.clear(); + class197.field2377 = 0; class197.musicTrack = null; - FriendLoginUpdate.soundCache = null; - class197.musicTrackArchive = null; + ByteArrayPool.soundCache = null; + class247.musicTrackArchive = null; } var2 = false; } - if (var2 && field759 && class219.pcmPlayer0 != null) { - class219.pcmPlayer0.tryDiscard(); + if (var2 && field855 && class80.pcmPlayer0 != null) { + class80.pcmPlayer0.tryDiscard(); } - if ((gameState == 10 || gameState == 20 || gameState == 30) && 0L != field754 && class30.currentTimeMillis() > field754) { - UserComparator8.setWindowedMode(class247.getWindowedMode()); + if ((gameState == 10 || gameState == 20 || gameState == 30) && field736 != 0L && PlayerAppearance.currentTimeMillis() > field736) { + FontName.setWindowedMode(WallDecoration.getWindowedMode()); } int var4; if (var1) { for (var4 = 0; var4 < 100; ++var4) { - field841[var4] = true; + field842[var4] = true; } } if (gameState == 0) { this.drawInitial(Login.Login_loadingPercent, Login.Login_loadingText, var1); } else if (gameState == 5) { - VarbitDefinition.drawTitle(class173.fontBold12, GrandExchangeOfferOwnWorldComparator.fontPlain11, GraphicsDefaults.fontPlain12); + class1.drawTitle(class43.fontBold12, class51.fontPlain11, ArchiveDiskActionHandler.fontPlain12); } else if (gameState != 10 && gameState != 11) { if (gameState == 20) { - VarbitDefinition.drawTitle(class173.fontBold12, GrandExchangeOfferOwnWorldComparator.fontPlain11, GraphicsDefaults.fontPlain12); + class1.drawTitle(class43.fontBold12, class51.fontPlain11, ArchiveDiskActionHandler.fontPlain12); } else if (gameState == 25) { - if (field693 == 1) { - if (field689 > field690) { - field690 = field689; + if (field688 == 1) { + if (field684 > field685) { + field685 = field684; } - var4 = (field690 * 50 - field689 * 50) / field690; - WorldMapSprite.drawLoadingMessage("Loading - please wait." + "
" + " (" + var4 + "%" + ")", false); - } else if (field693 == 2) { - if (field691 > field692) { - field692 = field691; + var4 = (field685 * 50 - field684 * 50) / field685; + GrandExchangeEvents.drawLoadingMessage("Loading - please wait." + "
" + " (" + var4 + "%" + ")", false); + } else if (field688 == 2) { + if (field686 > field687) { + field687 = field686; } - var4 = (field692 * 50 - field691 * 50) / field692 + 50; - WorldMapSprite.drawLoadingMessage("Loading - please wait." + "
" + " (" + var4 + "%" + ")", false); + var4 = (field687 * 50 - field686 * 50) / field687 + 50; + GrandExchangeEvents.drawLoadingMessage("Loading - please wait." + "
" + " (" + var4 + "%" + ")", false); } else { - WorldMapSprite.drawLoadingMessage("Loading - please wait.", false); + GrandExchangeEvents.drawLoadingMessage("Loading - please wait.", false); } } else if (gameState == 30) { this.drawLoggedIn(); } else if (gameState == 40) { - WorldMapSprite.drawLoadingMessage("Connection lost" + "
" + "Please wait - attempting to reestablish", false); + GrandExchangeEvents.drawLoadingMessage("Connection lost" + "
" + "Please wait - attempting to reestablish", false); } else if (gameState == 45) { - WorldMapSprite.drawLoadingMessage("Please wait...", false); + GrandExchangeEvents.drawLoadingMessage("Please wait...", false); } } else { - VarbitDefinition.drawTitle(class173.fontBold12, GrandExchangeOfferOwnWorldComparator.fontPlain11, GraphicsDefaults.fontPlain12); + class1.drawTitle(class43.fontBold12, class51.fontPlain11, ArchiveDiskActionHandler.fontPlain12); } if (gameState == 30 && gameDrawingMode == 0 && !var1 && !isResizable) { for (var4 = 0; var4 < rootWidgetCount; ++var4) { - if (field842[var4]) { - class42.rasterProvider.draw(rootWidgetXs[var4], rootWidgetYs[var4], rootWidgetWidths[var4], rootWidgetHeights[var4]); - field842[var4] = false; + if (field837[var4]) { + AbstractWorldMapData.rasterProvider.draw(rootWidgetXs[var4], rootWidgetYs[var4], rootWidgetWidths[var4], rootWidgetHeights[var4]); + field837[var4] = false; } } } else if (gameState > 0) { - class42.rasterProvider.drawFull(0, 0); + AbstractWorldMapData.rasterProvider.drawFull(0, 0); for (var4 = 0; var4 < rootWidgetCount; ++var4) { - field842[var4] = false; + field837[var4] = false; } } } - @ObfuscatedName("as") + @ObfuscatedName("ah") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "87" + signature = "(I)V", + garbageValue = "-1838623985" ) @Export("kill0") protected final void kill0() { - if (class197.varcs.hasUnwrittenChanges()) { - class197.varcs.write(); + if (class1.varcs.hasUnwrittenChanges()) { + class1.varcs.write(); } - if (WorldMapLabel.mouseRecorder != null) { - WorldMapLabel.mouseRecorder.isRunning = false; + if (class3.mouseRecorder != null) { + class3.mouseRecorder.isRunning = false; } - WorldMapLabel.mouseRecorder = null; + class3.mouseRecorder = null; packetWriter.close(); - class191.method3640(); - method1566(); + class43.method880(); + NPCDefinition.method4880(); KeyHandler.mouseWheel = null; - if (class219.pcmPlayer0 != null) { - class219.pcmPlayer0.shutdown(); + if (class80.pcmPlayer0 != null) { + class80.pcmPlayer0.shutdown(); } - if (GrandExchangeOfferWorldComparator.pcmPlayer1 != null) { - GrandExchangeOfferWorldComparator.pcmPlayer1.shutdown(); + if (MenuAction.pcmPlayer1 != null) { + MenuAction.pcmPlayer1.shutdown(); } - class80.method2057(); - UrlRequest.method3269(); - if (urlRequester != null) { - urlRequester.close(); - urlRequester = null; + class185.method3774(); + class218.method4255(); + if (Skills.urlRequester != null) { + Skills.urlRequester.close(); + Skills.urlRequester = null; } - Occluder.method3252(); + Tile.method3023(); } - @ObfuscatedName("am") + @ObfuscatedName("at") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-2052837160" + signature = "(B)V", + garbageValue = "-22" ) - protected final void vmethod1307() { + protected final void vmethod1393() { } public final void init() { @@ -1905,6 +2795,7 @@ public final class Client extends GameShell implements Usernamed { for (int var1 = 0; var1 <= 19; ++var1) { String var2 = this.getParameter(Integer.toString(var1)); if (var2 != null) { + int var4; switch(var1) { case 1: useBufferedSocket = Integer.parseInt(var2) != 0; @@ -1930,200 +2821,314 @@ public final class Client extends GameShell implements Usernamed { worldProperties = Integer.parseInt(var2); break; case 6: - WorldMapLabelSize.clientLanguage = Language.method3618(Integer.parseInt(var2)); + var4 = Integer.parseInt(var2); + Language var13; + if (var4 >= 0 && var4 < Language.Language_valuesOrdered.length) { + var13 = Language.Language_valuesOrdered[var4]; + } else { + var13 = null; + } + + WorldMapSection1.clientLanguage = var13; break; case 7: - VertexNormal.field1726 = FloorDecoration.method2841(Integer.parseInt(var2)); + var4 = Integer.parseInt(var2); + ServerBuild[] var5 = new ServerBuild[]{ServerBuild.BUILDLIVE, ServerBuild.WIP, ServerBuild.RC, ServerBuild.LIVE}; + ServerBuild[] var6 = var5; + int var7 = 0; + + ServerBuild var3; + while (true) { + if (var7 >= var6.length) { + var3 = null; + break; + } + + ServerBuild var8 = var6[var7]; + if (var4 == var8.field3088) { + var3 = var8; + break; + } + + ++var7; + } + + class32.field265 = var3; break; case 8: if (var2.equalsIgnoreCase("true")) { } break; case 9: - class197.field2390 = var2; + MilliClock.field1994 = var2; break; case 10: - StudioGame[] var3 = new StudioGame[]{StudioGame.game3, StudioGame.runescape, StudioGame.stellardawn, StudioGame.oldscape, StudioGame.game4, StudioGame.game5}; - class16.field101 = (StudioGame)NetSocket.findEnumerated(var3, Integer.parseInt(var2)); - if (class16.field101 == StudioGame.oldscape) { - WorldMapSection1.loginType = LoginType.oldscape; + MouseHandler.field458 = (StudioGame)WorldMapIcon_1.findEnumerated(class60.method1260(), Integer.parseInt(var2)); + if (StudioGame.oldscape == MouseHandler.field458) { + class60.loginType = LoginType.oldscape; } else { - WorldMapSection1.loginType = LoginType.field4032; + class60.loginType = LoginType.field4032; } break; case 12: worldId = Integer.parseInt(var2); break; case 14: - WorldMapArea.field218 = Integer.parseInt(var2); + class339.field4041 = Integer.parseInt(var2); break; case 15: gameBuild = Integer.parseInt(var2); break; case 17: - WorldMapSectionType.field150 = var2; + class335.field4016 = var2; } } } - GrandExchangeOfferUnitPriceComparator.method139(); - class160.worldHost = this.getCodeBase().getHost(); - String var11 = VertexNormal.field1726.name; - byte var12 = 0; + class13.method199(); + WorldMapAreaData.worldHost = this.getCodeBase().getHost(); + String var9 = class32.field265.name; + byte var10 = 0; try { - JagexCache.idxCount = 21; - BufferedNetSocket.cacheGamebuild = var12; - - try { - HealthBarUpdate.field993 = System.getProperty("os.name"); - } catch (Exception var19) { - HealthBarUpdate.field993 = "Unknown"; - } - - class162.field1990 = HealthBarUpdate.field993.toLowerCase(); - - try { - JagexCache.userHomeDirectory = System.getProperty("user.home"); - if (JagexCache.userHomeDirectory != null) { - JagexCache.userHomeDirectory = JagexCache.userHomeDirectory + "/"; - } - } catch (Exception var18) { - } - - try { - if (class162.field1990.startsWith("win")) { - if (JagexCache.userHomeDirectory == null) { - JagexCache.userHomeDirectory = System.getenv("USERPROFILE"); - } - } else if (JagexCache.userHomeDirectory == null) { - JagexCache.userHomeDirectory = System.getenv("HOME"); - } - - if (JagexCache.userHomeDirectory != null) { - JagexCache.userHomeDirectory = JagexCache.userHomeDirectory + "/"; - } - } catch (Exception var17) { - } - - if (JagexCache.userHomeDirectory == null) { - JagexCache.userHomeDirectory = "~/"; - } - - UserComparator4.field1948 = new String[]{"c:/rscache/", "/rscache/", "c:/windows/", "c:/winnt/", "c:/", JagexCache.userHomeDirectory, "/tmp/", ""}; - class266.field3537 = new String[]{".jagex_cache_" + BufferedNetSocket.cacheGamebuild, ".file_store_" + BufferedNetSocket.cacheGamebuild}; - - int var6; - File var7; - label176: - for (int var13 = 0; var13 < 4; ++var13) { - GrandExchangeOfferOwnWorldComparator.cacheDir = WorldMapRegion.getCacheDir("oldschool", var11, var13); - if (!GrandExchangeOfferOwnWorldComparator.cacheDir.exists()) { - GrandExchangeOfferOwnWorldComparator.cacheDir.mkdirs(); - } - - File[] var4 = GrandExchangeOfferOwnWorldComparator.cacheDir.listFiles(); - if (var4 == null) { - break; - } - - File[] var5 = var4; - var6 = 0; - - while (true) { - if (var6 >= var5.length) { - break label176; - } - - var7 = var5[var6]; - - boolean var8; - try { - RandomAccessFile var9 = new RandomAccessFile(var7, "rw"); - int var10 = var9.read(); - var9.seek(0L); - var9.write(var10); - var9.seek(0L); - var9.close(); - var8 = true; - } catch (Exception var16) { - var8 = false; - } - - if (!var8) { - break; - } - - ++var6; - } - } - - File var23 = GrandExchangeOfferOwnWorldComparator.cacheDir; - FileSystem.FileSystem_cacheDir = var23; - if (!FileSystem.FileSystem_cacheDir.exists()) { - throw new RuntimeException(""); - } - - FileSystem.FileSystem_hasPermissions = true; - - try { - File var24 = new File(JagexCache.userHomeDirectory, "random.dat"); - if (var24.exists()) { - JagexCache.JagexCache_randomDat = new BufferedFile(new AccessFile(var24, "rw", 25L), 24, 0); - } else { - label153: - for (int var14 = 0; var14 < class266.field3537.length; ++var14) { - for (var6 = 0; var6 < UserComparator4.field1948.length; ++var6) { - var7 = new File(UserComparator4.field1948[var6] + class266.field3537[var14] + File.separatorChar + "random.dat"); - if (var7.exists()) { - JagexCache.JagexCache_randomDat = new BufferedFile(new AccessFile(var7, "rw", 25L), 24, 0); - break label153; - } - } - } - } - - if (JagexCache.JagexCache_randomDat == null) { - RandomAccessFile var25 = new RandomAccessFile(var24, "rw"); - var6 = var25.read(); - var25.seek(0L); - var25.write(var6); - var25.seek(0L); - var25.close(); - JagexCache.JagexCache_randomDat = new BufferedFile(new AccessFile(var24, "rw", 25L), 24, 0); - } - } catch (IOException var20) { - } - - JagexCache.JagexCache_dat2File = new BufferedFile(new AccessFile(UserComparator8.getFile("main_file_cache.dat2"), "rw", 1048576000L), 5200, 0); - JagexCache.JagexCache_idx255File = new BufferedFile(new AccessFile(UserComparator8.getFile("main_file_cache.idx255"), "rw", 1048576L), 6000, 0); - class189.JagexCache_idxFiles = new BufferedFile[JagexCache.idxCount]; - - for (int var15 = 0; var15 < JagexCache.idxCount; ++var15) { - class189.JagexCache_idxFiles[var15] = new BufferedFile(new AccessFile(UserComparator8.getFile("main_file_cache.idx" + var15), "rw", 1048576L), 6000, 0); - } - } catch (Exception var21) { - class32.RunException_sendStackTrace((String)null, var21); + class192.method3814("oldschool", var9, var10, 21); + } catch (Exception var11) { + User.RunException_sendStackTrace((String)null, var11); } - ViewportMouse.client = this; - ClientType.clientType = clientType; - this.startThread(765, 503, 184); + WorldMapID.client = this; + TileItem.clientType = clientType; + this.startThread(765, 503, 185); } - } catch (RuntimeException var22) { - throw class14.newRunException(var22, "client.init(" + ')'); + } catch (RuntimeException var12) { + throw ByteArrayPool.newRunException(var12, "client.init(" + ')'); } } - @ObfuscatedName("en") + @ObfuscatedName("fu") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "942594737" + garbageValue = "773781799" ) @Export("doCycleJs5") void doCycleJs5() { if (gameState != 1000) { - boolean var1 = PlayerAppearance.method4010(); + long var2 = PlayerAppearance.currentTimeMillis(); + int var4 = (int)(var2 - NetCache.field3149); + NetCache.field3149 = var2; + if (var4 > 200) { + var4 = 200; + } + + NetCache.NetCache_loadTime += var4; + boolean var1; + if (NetCache.NetCache_pendingResponsesCount == 0 && NetCache.NetCache_pendingPriorityResponsesCount == 0 && NetCache.NetCache_pendingWritesCount == 0 && NetCache.NetCache_pendingPriorityWritesCount == 0) { + var1 = true; + } else if (NetCache.NetCache_socket == null) { + var1 = false; + } else { + try { + label247: { + if (NetCache.NetCache_loadTime > 30000) { + throw new IOException(); + } + + NetFileRequest var5; + Buffer var6; + while (NetCache.NetCache_pendingPriorityResponsesCount < 200 && NetCache.NetCache_pendingPriorityWritesCount > 0) { + var5 = (NetFileRequest)NetCache.NetCache_pendingPriorityWrites.first(); + var6 = new Buffer(4); + var6.writeByte(1); + var6.writeMedium((int)var5.key); + NetCache.NetCache_socket.write(var6.array, 0, 4); + NetCache.NetCache_pendingPriorityResponses.put(var5, var5.key); + --NetCache.NetCache_pendingPriorityWritesCount; + ++NetCache.NetCache_pendingPriorityResponsesCount; + } + + while (NetCache.NetCache_pendingResponsesCount < 200 && NetCache.NetCache_pendingWritesCount > 0) { + var5 = (NetFileRequest)NetCache.NetCache_pendingWritesQueue.removeLast(); + var6 = new Buffer(4); + var6.writeByte(0); + var6.writeMedium((int)var5.key); + NetCache.NetCache_socket.write(var6.array, 0, 4); + var5.removeDual(); + NetCache.NetCache_pendingResponses.put(var5, var5.key); + --NetCache.NetCache_pendingWritesCount; + ++NetCache.NetCache_pendingResponsesCount; + } + + for (int var17 = 0; var17 < 100; ++var17) { + int var18 = NetCache.NetCache_socket.available(); + if (var18 < 0) { + throw new IOException(); + } + + if (var18 == 0) { + break; + } + + NetCache.NetCache_loadTime = 0; + byte var7 = 0; + if (UserComparator6.NetCache_currentResponse == null) { + var7 = 8; + } else if (NetCache.field3161 == 0) { + var7 = 1; + } + + int var8; + int var9; + int var10; + int var12; + byte[] var10000; + int var10001; + Buffer var25; + if (var7 > 0) { + var8 = var7 - NetCache.NetCache_responseHeaderBuffer.offset; + if (var8 > var18) { + var8 = var18; + } + + NetCache.NetCache_socket.read(NetCache.NetCache_responseHeaderBuffer.array, NetCache.NetCache_responseHeaderBuffer.offset, var8); + if (NetCache.field3165 != 0) { + for (var9 = 0; var9 < var8; ++var9) { + var10000 = NetCache.NetCache_responseHeaderBuffer.array; + var10001 = var9 + NetCache.NetCache_responseHeaderBuffer.offset; + var10000[var10001] ^= NetCache.field3165; + } + } + + var25 = NetCache.NetCache_responseHeaderBuffer; + var25.offset += var8; + if (NetCache.NetCache_responseHeaderBuffer.offset < var7) { + break; + } + + if (UserComparator6.NetCache_currentResponse == null) { + NetCache.NetCache_responseHeaderBuffer.offset = 0; + var9 = NetCache.NetCache_responseHeaderBuffer.readUnsignedByte(); + var10 = NetCache.NetCache_responseHeaderBuffer.readUnsignedShort(); + int var11 = NetCache.NetCache_responseHeaderBuffer.readUnsignedByte(); + var12 = NetCache.NetCache_responseHeaderBuffer.readInt(); + long var13 = (long)(var10 + (var9 << 16)); + NetFileRequest var15 = (NetFileRequest)NetCache.NetCache_pendingPriorityResponses.get(var13); + AttackOption.field1151 = true; + if (var15 == null) { + var15 = (NetFileRequest)NetCache.NetCache_pendingResponses.get(var13); + AttackOption.field1151 = false; + } + + if (var15 == null) { + throw new IOException(); + } + + int var16 = var11 == 0 ? 5 : 9; + UserComparator6.NetCache_currentResponse = var15; + Frames.NetCache_responseArchiveBuffer = new Buffer(var16 + var12 + UserComparator6.NetCache_currentResponse.padding); + Frames.NetCache_responseArchiveBuffer.writeByte(var11); + Frames.NetCache_responseArchiveBuffer.writeInt(var12); + NetCache.field3161 = 8; + NetCache.NetCache_responseHeaderBuffer.offset = 0; + } else if (NetCache.field3161 == 0) { + if (NetCache.NetCache_responseHeaderBuffer.array[0] == -1) { + NetCache.field3161 = 1; + NetCache.NetCache_responseHeaderBuffer.offset = 0; + } else { + UserComparator6.NetCache_currentResponse = null; + } + } + } else { + var8 = Frames.NetCache_responseArchiveBuffer.array.length - UserComparator6.NetCache_currentResponse.padding; + var9 = 512 - NetCache.field3161; + if (var9 > var8 - Frames.NetCache_responseArchiveBuffer.offset) { + var9 = var8 - Frames.NetCache_responseArchiveBuffer.offset; + } + + if (var9 > var18) { + var9 = var18; + } + + NetCache.NetCache_socket.read(Frames.NetCache_responseArchiveBuffer.array, Frames.NetCache_responseArchiveBuffer.offset, var9); + if (NetCache.field3165 != 0) { + for (var10 = 0; var10 < var9; ++var10) { + var10000 = Frames.NetCache_responseArchiveBuffer.array; + var10001 = Frames.NetCache_responseArchiveBuffer.offset + var10; + var10000[var10001] ^= NetCache.field3165; + } + } + + var25 = Frames.NetCache_responseArchiveBuffer; + var25.offset += var9; + NetCache.field3161 += var9; + if (var8 == Frames.NetCache_responseArchiveBuffer.offset) { + if (UserComparator6.NetCache_currentResponse.key == 16711935L) { + Calendar.NetCache_reference = Frames.NetCache_responseArchiveBuffer; + + for (var10 = 0; var10 < 256; ++var10) { + Archive var19 = NetCache.NetCache_archives[var10]; + if (var19 != null) { + Calendar.NetCache_reference.offset = var10 * 8 + 5; + var12 = Calendar.NetCache_reference.readInt(); + int var20 = Calendar.NetCache_reference.readInt(); + var19.loadIndex(var12, var20); + } + } + } else { + NetCache.NetCache_crc.reset(); + NetCache.NetCache_crc.update(Frames.NetCache_responseArchiveBuffer.array, 0, var8); + var10 = (int)NetCache.NetCache_crc.getValue(); + if (var10 != UserComparator6.NetCache_currentResponse.crc) { + try { + NetCache.NetCache_socket.close(); + } catch (Exception var23) { + } + + ++NetCache.NetCache_crcMismatches; + NetCache.NetCache_socket = null; + NetCache.field3165 = (byte)((int)(Math.random() * 255.0D + 1.0D)); + var1 = false; + break label247; + } + + NetCache.NetCache_crcMismatches = 0; + NetCache.NetCache_ioExceptions = 0; + UserComparator6.NetCache_currentResponse.archive.write((int)(UserComparator6.NetCache_currentResponse.key & 65535L), Frames.NetCache_responseArchiveBuffer.array, 16711680L == (UserComparator6.NetCache_currentResponse.key & 16711680L), AttackOption.field1151); + } + + UserComparator6.NetCache_currentResponse.remove(); + if (AttackOption.field1151) { + --NetCache.NetCache_pendingPriorityResponsesCount; + } else { + --NetCache.NetCache_pendingResponsesCount; + } + + NetCache.field3161 = 0; + UserComparator6.NetCache_currentResponse = null; + Frames.NetCache_responseArchiveBuffer = null; + } else { + if (NetCache.field3161 != 512) { + break; + } + + NetCache.field3161 = 0; + } + } + } + + var1 = true; + } + } catch (IOException var24) { + try { + NetCache.NetCache_socket.close(); + } catch (Exception var22) { + } + + ++NetCache.NetCache_ioExceptions; + NetCache.NetCache_socket = null; + var1 = false; + } + } + if (!var1) { this.doCycleJs5Connect(); } @@ -2131,10 +3136,10 @@ public final class Client extends GameShell implements Usernamed { } } - @ObfuscatedName("eh") + @ObfuscatedName("fy") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1951808439" + signature = "(B)V", + garbageValue = "40" ) @Export("doCycleJs5Connect") void doCycleJs5Connect() { @@ -2149,68 +3154,66 @@ public final class Client extends GameShell implements Usernamed { return; } - field664 = 3000; + field819 = 3000; NetCache.NetCache_ioExceptions = 3; } - if (--field664 + 1 <= 0) { + if (--field819 + 1 <= 0) { try { if (js5ConnectState == 0) { - Login.js5SocketTask = GameShell.taskHandler.newSocketTask(class160.worldHost, NPC.port3); + Entity.js5SocketTask = GameShell.taskHandler.newSocketTask(WorldMapAreaData.worldHost, GrandExchangeOfferUnitPriceComparator.port3); ++js5ConnectState; } if (js5ConnectState == 1) { - if (Login.js5SocketTask.status == 2) { + if (Entity.js5SocketTask.status == 2) { this.js5Error(-1); return; } - if (Login.js5SocketTask.status == 1) { + if (Entity.js5SocketTask.status == 1) { ++js5ConnectState; } } if (js5ConnectState == 2) { if (useBufferedSocket) { - Socket var2 = (Socket)Login.js5SocketTask.result; - BufferedNetSocket var1 = new BufferedNetSocket(var2, 40000, 5000); - class43.js5Socket = var1; + js5Socket = class40.method839((Socket)Entity.js5SocketTask.result, 40000, 5000); } else { - class43.js5Socket = new NetSocket((Socket)Login.js5SocketTask.result, GameShell.taskHandler, 5000); + js5Socket = new NetSocket((Socket)Entity.js5SocketTask.result, GameShell.taskHandler, 5000); } - Buffer var5 = new Buffer(5); - var5.writeByte(15); - var5.writeInt(184); - class43.js5Socket.write(var5.array, 0, 5); + Buffer var1 = new Buffer(5); + var1.writeByte(15); + var1.writeInt(185); + js5Socket.write(var1.array, 0, 5); ++js5ConnectState; - VerticalAlignment.field3175 = class30.currentTimeMillis(); + ArchiveDiskActionHandler.field3130 = PlayerAppearance.currentTimeMillis(); } if (js5ConnectState == 3) { - if (class43.js5Socket.available() > 0 || !useBufferedSocket && gameState <= 5) { - int var3 = class43.js5Socket.readUnsignedByte(); - if (var3 != 0) { - this.js5Error(var3); + if (js5Socket.available() > 0 || !useBufferedSocket && gameState <= 5) { + int var2 = js5Socket.readUnsignedByte(); + if (var2 != 0) { + this.js5Error(var2); return; } ++js5ConnectState; - } else if (class30.currentTimeMillis() - VerticalAlignment.field3175 > 30000L) { + } else if (PlayerAppearance.currentTimeMillis() - ArchiveDiskActionHandler.field3130 > 30000L) { this.js5Error(-2); return; } } if (js5ConnectState == 4) { - MenuAction.method2067(class43.js5Socket, gameState > 20); - Login.js5SocketTask = null; - class43.js5Socket = null; + VerticalAlignment.method4503(js5Socket, gameState > 20); + Entity.js5SocketTask = null; + js5Socket = null; js5ConnectState = 0; js5Errors = 0; } - } catch (IOException var4) { + } catch (IOException var3) { this.js5Error(-3); } @@ -2218,20 +3221,20 @@ public final class Client extends GameShell implements Usernamed { } } - @ObfuscatedName("em") + @ObfuscatedName("fn") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "0" + signature = "(II)V", + garbageValue = "-1648884107" ) @Export("js5Error") void js5Error(int var1) { - Login.js5SocketTask = null; - class43.js5Socket = null; + Entity.js5SocketTask = null; + js5Socket = null; js5ConnectState = 0; - if (NPC.port3 == HitSplatDefinition.port1) { - NPC.port3 = BZip2State.port2; + if (GrandExchangeOfferUnitPriceComparator.port3 == class222.port1) { + GrandExchangeOfferUnitPriceComparator.port3 = Decimator.port2; } else { - NPC.port3 = HitSplatDefinition.port1; + GrandExchangeOfferUnitPriceComparator.port3 = class222.port1; } ++js5Errors; @@ -2240,7 +3243,7 @@ public final class Client extends GameShell implements Usernamed { this.error("js5connect_full"); gameState = 1000; } else { - field664 = 3000; + field819 = 3000; } } else if (js5Errors >= 2 && var1 == 6) { this.error("js5connect_outofdate"); @@ -2250,16 +3253,16 @@ public final class Client extends GameShell implements Usernamed { this.error("js5connect"); gameState = 1000; } else { - field664 = 3000; + field819 = 3000; } } } - @ObfuscatedName("ey") + @ObfuscatedName("fk") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "684778966" + garbageValue = "2145880760" ) @Export("doCycleLoggedOut") final void doCycleLoggedOut() { @@ -2268,87 +3271,94 @@ public final class Client extends GameShell implements Usernamed { try { if (loginState == 0) { - if (GraphicsObject.secureRandom == null && (secureRandomFuture.isDone() || field669 > 250)) { - GraphicsObject.secureRandom = secureRandomFuture.get(); + if (GZipDecompressor.secureRandom == null && (secureRandomFuture.isDone() || field666 > 250)) { + GZipDecompressor.secureRandom = secureRandomFuture.get(); secureRandomFuture.shutdown(); secureRandomFuture = null; } - if (GraphicsObject.secureRandom != null) { + if (GZipDecompressor.secureRandom != null) { if (var1 != null) { ((AbstractSocket)var1).close(); var1 = null; } - LoginPacket.socketTask = null; - field730 = false; - field669 = 0; + AttackOption.socketTask = null; + field680 = false; + field666 = 0; loginState = 1; } } if (loginState == 1) { - if (LoginPacket.socketTask == null) { - LoginPacket.socketTask = GameShell.taskHandler.newSocketTask(class160.worldHost, NPC.port3); + if (AttackOption.socketTask == null) { + AttackOption.socketTask = GameShell.taskHandler.newSocketTask(WorldMapAreaData.worldHost, GrandExchangeOfferUnitPriceComparator.port3); } - if (LoginPacket.socketTask.status == 2) { + if (AttackOption.socketTask.status == 2) { throw new IOException(); } - if (LoginPacket.socketTask.status == 1) { + if (AttackOption.socketTask.status == 1) { if (useBufferedSocket) { - Socket var4 = (Socket)LoginPacket.socketTask.result; - BufferedNetSocket var3 = new BufferedNetSocket(var4, 40000, 5000); - var1 = var3; + var1 = class40.method839((Socket)AttackOption.socketTask.result, 40000, 5000); } else { - var1 = new NetSocket((Socket)LoginPacket.socketTask.result, GameShell.taskHandler, 5000); + var1 = new NetSocket((Socket)AttackOption.socketTask.result, GameShell.taskHandler, 5000); } packetWriter.setSocket((AbstractSocket)var1); - LoginPacket.socketTask = null; + AttackOption.socketTask = null; loginState = 2; } } + PacketBufferNode var4; if (loginState == 2) { packetWriter.clearBuffer(); - PacketBufferNode var22 = Tile.method2849(); - var22.packetBuffer.writeByte(LoginPacket.field2289.id); - packetWriter.addNode(var22); + if (PacketBufferNode.PacketBufferNode_packetBufferNodeCount == 0) { + var4 = new PacketBufferNode(); + } else { + var4 = PacketBufferNode.PacketBufferNode_packetBufferNodes[--PacketBufferNode.PacketBufferNode_packetBufferNodeCount]; + } + + var4.clientPacket = null; + var4.clientPacketLength = 0; + var4.packetBuffer = new PacketBuffer(5000); + var4.packetBuffer.writeByte(LoginPacket.field2283.id); + packetWriter.addNode(var4); packetWriter.flush(); var2.offset = 0; loginState = 3; } - boolean var13; - int var14; + boolean var14; + int var15; if (loginState == 3) { - if (class219.pcmPlayer0 != null) { - class219.pcmPlayer0.method2397(); + if (class80.pcmPlayer0 != null) { + class80.pcmPlayer0.method2581(); } - if (GrandExchangeOfferWorldComparator.pcmPlayer1 != null) { - GrandExchangeOfferWorldComparator.pcmPlayer1.method2397(); + if (MenuAction.pcmPlayer1 != null) { + MenuAction.pcmPlayer1.method2581(); } - var13 = true; + var14 = true; if (useBufferedSocket && !((AbstractSocket)var1).isAvailable(1)) { - var13 = false; + var14 = false; } - if (var13) { - var14 = ((AbstractSocket)var1).readUnsignedByte(); - if (class219.pcmPlayer0 != null) { - class219.pcmPlayer0.method2397(); + if (var14) { + var15 = ((AbstractSocket)var1).readUnsignedByte(); + if (class80.pcmPlayer0 != null) { + class80.pcmPlayer0.method2581(); } - if (GrandExchangeOfferWorldComparator.pcmPlayer1 != null) { - GrandExchangeOfferWorldComparator.pcmPlayer1.method2397(); + if (MenuAction.pcmPlayer1 != null) { + MenuAction.pcmPlayer1.method2581(); } - if (var14 != 0) { - ArchiveDisk.getLoginError(var14); + if (var15 != 0) { + AbstractArchive.getLoginError(var15); return; } @@ -2357,171 +3367,179 @@ public final class Client extends GameShell implements Usernamed { } } - int var33; + int var30; if (loginState == 4) { if (var2.offset < 8) { - var33 = ((AbstractSocket)var1).available(); - if (var33 > 8 - var2.offset) { - var33 = 8 - var2.offset; + var30 = ((AbstractSocket)var1).available(); + if (var30 > 8 - var2.offset) { + var30 = 8 - var2.offset; } - if (var33 > 0) { - ((AbstractSocket)var1).read(var2.array, var2.offset, var33); - var2.offset += var33; + if (var30 > 0) { + ((AbstractSocket)var1).read(var2.array, var2.offset, var30); + var2.offset += var30; } } if (var2.offset == 8) { var2.offset = 0; - Tiles.field495 = var2.readLong(); + Message.field577 = var2.readLong(); loginState = 5; } } - int var6; if (loginState == 5) { packetWriter.packetBuffer.offset = 0; packetWriter.clearBuffer(); - PacketBuffer var23 = new PacketBuffer(500); - int[] var25 = new int[]{GraphicsObject.secureRandom.nextInt(), GraphicsObject.secureRandom.nextInt(), GraphicsObject.secureRandom.nextInt(), GraphicsObject.secureRandom.nextInt()}; - var23.offset = 0; - var23.writeByte(1); - var23.writeInt(var25[0]); - var23.writeInt(var25[1]); - var23.writeInt(var25[2]); - var23.writeInt(var25[3]); - var23.writeLong(Tiles.field495); + PacketBuffer var3 = new PacketBuffer(500); + int[] var24 = new int[]{GZipDecompressor.secureRandom.nextInt(), GZipDecompressor.secureRandom.nextInt(), GZipDecompressor.secureRandom.nextInt(), GZipDecompressor.secureRandom.nextInt()}; + var3.offset = 0; + var3.writeByte(1); + var3.writeInt(var24[0]); + var3.writeInt(var24[1]); + var3.writeInt(var24[2]); + var3.writeInt(var24[3]); + var3.writeLong(Message.field577); if (gameState == 40) { - var23.writeInt(DirectByteArrayCopier.field2482[0]); - var23.writeInt(DirectByteArrayCopier.field2482[1]); - var23.writeInt(DirectByteArrayCopier.field2482[2]); - var23.writeInt(DirectByteArrayCopier.field2482[3]); + var3.writeInt(class173.field2074[0]); + var3.writeInt(class173.field2074[1]); + var3.writeInt(class173.field2074[2]); + var3.writeInt(class173.field2074[3]); } else { - var23.writeByte(field672.rsOrdinal()); - switch(field672.field1984) { + var3.writeByte(field850.rsOrdinal()); + switch(field850.field1983) { case 0: case 1: - var23.writeMedium(class185.field2305); - ++var23.offset; + var3.writeMedium(Huffman.field2491); + ++var3.offset; break; case 2: - var23.offset += 4; + var3.writeInt((Integer)ScriptEvent.clientPreferences.parameters.get(GrandExchangeEvents.method108(Login.Login_username))); break; case 3: - var23.writeInt((Integer)AbstractArchive.clientPreferences.parameters.get(class288.method5224(Login.Login_username))); + var3.offset += 4; } - var23.writeByte(class312.field3818.rsOrdinal()); - var23.writeStringCp1252NullTerminated(Login.Login_password); + var3.writeByte(class312.field3799.rsOrdinal()); + var3.writeStringCp1252NullTerminated(Login.Login_password); } - var23.encryptRsa(class83.field1148, class83.field1149); - DirectByteArrayCopier.field2482 = var25; - PacketBufferNode var5 = Tile.method2849(); - var5.packetBuffer.offset = 0; + var3.encryptRsa(class83.field1144, class83.field1145); + class173.field2074 = var24; + PacketBufferNode var6; + if (PacketBufferNode.PacketBufferNode_packetBufferNodeCount == 0) { + var6 = new PacketBufferNode(); + } else { + var6 = PacketBufferNode.PacketBufferNode_packetBufferNodes[--PacketBufferNode.PacketBufferNode_packetBufferNodeCount]; + } + + var6.clientPacket = null; + var6.clientPacketLength = 0; + var6.packetBuffer = new PacketBuffer(5000); + var6.packetBuffer.offset = 0; if (gameState == 40) { - var5.packetBuffer.writeByte(LoginPacket.field2290.id); + var6.packetBuffer.writeByte(LoginPacket.field2286.id); } else { - var5.packetBuffer.writeByte(LoginPacket.field2287.id); + var6.packetBuffer.writeByte(LoginPacket.field2285.id); } - var5.packetBuffer.writeShort(0); - var6 = var5.packetBuffer.offset; - var5.packetBuffer.writeInt(184); - var5.packetBuffer.writeInt(1); - var5.packetBuffer.writeByte(clientType); - var5.packetBuffer.writeBytes(var23.array, 0, var23.offset); - int var7 = var5.packetBuffer.offset; - var5.packetBuffer.writeStringCp1252NullTerminated(Login.Login_username); - var5.packetBuffer.writeByte((isResizable ? 1 : 0) << 1 | (isLowDetail ? 1 : 0)); - var5.packetBuffer.writeShort(FloorDecoration.canvasWidth); - var5.packetBuffer.writeShort(WallDecoration.canvasHeight); - PacketBuffer var8 = var5.packetBuffer; - int var11; + var6.packetBuffer.writeShort(0); + int var16 = var6.packetBuffer.offset; + var6.packetBuffer.writeInt(185); + var6.packetBuffer.writeInt(1); + var6.packetBuffer.writeByte(clientType); + var6.packetBuffer.writeBytes(var3.array, 0, var3.offset); + int var8 = var6.packetBuffer.offset; + var6.packetBuffer.writeStringCp1252NullTerminated(Login.Login_username); + var6.packetBuffer.writeByte((isResizable ? 1 : 0) << 1 | (isLowDetail ? 1 : 0)); + var6.packetBuffer.writeShort(class286.canvasWidth); + var6.packetBuffer.writeShort(FloorUnderlayDefinition.canvasHeight); + PacketBuffer var9 = var6.packetBuffer; + int var12; if (randomDatData != null) { - var8.writeBytes(randomDatData, 0, randomDatData.length); + var9.writeBytes(randomDatData, 0, randomDatData.length); } else { - byte[] var10 = new byte[24]; + byte[] var11 = new byte[24]; try { JagexCache.JagexCache_randomDat.seek(0L); - JagexCache.JagexCache_randomDat.readFully(var10); + JagexCache.JagexCache_randomDat.readFully(var11); - for (var11 = 0; var11 < 24 && var10[var11] == 0; ++var11) { + for (var12 = 0; var12 < 24 && var11[var12] == 0; ++var12) { } - if (var11 >= 24) { + if (var12 >= 24) { throw new IOException(); } - } catch (Exception var20) { - for (int var12 = 0; var12 < 24; ++var12) { - var10[var12] = -1; + } catch (Exception var21) { + for (int var13 = 0; var13 < 24; ++var13) { + var11[var13] = -1; } } - var8.writeBytes(var10, 0, var10.length); + var9.writeBytes(var11, 0, var11.length); } - var5.packetBuffer.writeStringCp1252NullTerminated(class197.field2390); - var5.packetBuffer.writeInt(WorldMapArea.field218); - Buffer var9 = new Buffer(class269.platformInfo.size()); - class269.platformInfo.write(var9); - var5.packetBuffer.writeBytes(var9.array, 0, var9.array.length); - var5.packetBuffer.writeByte(clientType); - var5.packetBuffer.writeInt(0); - var5.packetBuffer.writeInt(class1.archive0.hash); - var5.packetBuffer.writeInt(WorldMapLabelSize.archive1.hash); - var5.packetBuffer.writeInt(FaceNormal.archive2.hash); - var5.packetBuffer.writeInt(BoundaryObject.archive3.hash); - var5.packetBuffer.writeInt(GrandExchangeOfferAgeComparator.archive4.hash); - var5.packetBuffer.writeInt(class3.archive5.hash); - var5.packetBuffer.writeInt(class225.archive6.hash); - var5.packetBuffer.writeInt(Language.archive7.hash); - var5.packetBuffer.writeInt(GrandExchangeOfferAgeComparator.archive8.hash); - var5.packetBuffer.writeInt(AttackOption.archive9.hash); - var5.packetBuffer.writeInt(archive10.hash); - var5.packetBuffer.writeInt(ClanMate.archive11.hash); - var5.packetBuffer.writeInt(GrandExchangeOfferOwnWorldComparator.archive12.hash); - var5.packetBuffer.writeInt(Tile.archive13.hash); - var5.packetBuffer.writeInt(WorldMapData_1.archive14.hash); - var5.packetBuffer.writeInt(Script.archive15.hash); - var5.packetBuffer.writeInt(0); - var5.packetBuffer.writeInt(archive17.hash); - var5.packetBuffer.writeInt(VarcInt.archive18.hash); - var5.packetBuffer.writeInt(WorldMapLabel.archive19.hash); - var5.packetBuffer.writeInt(WorldMapEvent.archive20.hash); - var5.packetBuffer.xteaEncrypt(var25, var7, var5.packetBuffer.offset); - var5.packetBuffer.writeLengthShort(var5.packetBuffer.offset - var6); - packetWriter.addNode(var5); + var6.packetBuffer.writeStringCp1252NullTerminated(MilliClock.field1994); + var6.packetBuffer.writeInt(class339.field4041); + Buffer var10 = new Buffer(class216.platformInfo.size()); + class216.platformInfo.write(var10); + var6.packetBuffer.writeBytes(var10.array, 0, var10.array.length); + var6.packetBuffer.writeByte(clientType); + var6.packetBuffer.writeInt(0); + var6.packetBuffer.writeInt(BuddyRankComparator.archive0.hash); + var6.packetBuffer.writeInt(LoginPacket.archive1.hash); + var6.packetBuffer.writeInt(AbstractWorldMapIcon.archive2.hash); + var6.packetBuffer.writeInt(SpriteMask.archive3.hash); + var6.packetBuffer.writeInt(NetFileRequest.archive4.hash); + var6.packetBuffer.writeInt(WorldMapRectangle.archive5.hash); + var6.packetBuffer.writeInt(class216.archive6.hash); + var6.packetBuffer.writeInt(Language.archive7.hash); + var6.packetBuffer.writeInt(GrandExchangeOfferUnitPriceComparator.archive8.hash); + var6.packetBuffer.writeInt(WorldMapSprite.archive9.hash); + var6.packetBuffer.writeInt(WorldMapID.archive10.hash); + var6.packetBuffer.writeInt(Decimator.archive11.hash); + var6.packetBuffer.writeInt(Occluder.archive12.hash); + var6.packetBuffer.writeInt(UrlRequest.archive13.hash); + var6.packetBuffer.writeInt(class192.archive14.hash); + var6.packetBuffer.writeInt(Coord.archive15.hash); + var6.packetBuffer.writeInt(0); + var6.packetBuffer.writeInt(DesktopPlatformInfoProvider.archive17.hash); + var6.packetBuffer.writeInt(WorldMapDecoration.archive18.hash); + var6.packetBuffer.writeInt(ReflectionCheck.archive19.hash); + var6.packetBuffer.writeInt(Actor.archive20.hash); + var6.packetBuffer.xteaEncrypt(var24, var8, var6.packetBuffer.offset); + var6.packetBuffer.writeLengthShort(var6.packetBuffer.offset - var16); + packetWriter.addNode(var6); packetWriter.flush(); - packetWriter.isaacCipher = new IsaacCipher(var25); - int[] var32 = new int[4]; + packetWriter.isaacCipher = new IsaacCipher(var24); + int[] var29 = new int[4]; - for (var11 = 0; var11 < 4; ++var11) { - var32[var11] = var25[var11] + 50; + for (var12 = 0; var12 < 4; ++var12) { + var29[var12] = var24[var12] + 50; } - var2.newIsaacCipher(var32); + var2.newIsaacCipher(var29); loginState = 6; } if (loginState == 6 && ((AbstractSocket)var1).available() > 0) { - var33 = ((AbstractSocket)var1).readUnsignedByte(); - if (var33 == 21 && gameState == 20) { + var30 = ((AbstractSocket)var1).readUnsignedByte(); + if (var30 == 21 && gameState == 20) { loginState = 9; - } else if (var33 == 2) { + } else if (var30 == 2) { loginState = 11; - } else if (var33 == 15 && gameState == 40) { + } else if (var30 == 15 && gameState == 40) { packetWriter.serverPacketLength = -1; loginState = 16; - } else if (var33 == 64) { + } else if (var30 == 64) { loginState = 7; - } else if (var33 == 23 && field670 < 1) { - ++field670; + } else if (var30 == 23 && field667 < 1) { + ++field667; loginState = 0; } else { - if (var33 != 29) { - ArchiveDisk.getLoginError(var33); + if (var30 != 29) { + AbstractArchive.getLoginError(var30); return; } @@ -2530,85 +3548,84 @@ public final class Client extends GameShell implements Usernamed { } if (loginState == 7 && ((AbstractSocket)var1).available() > 0) { - Message.field592 = ((AbstractSocket)var1).readUnsignedByte(); + WorldMapAreaData.field329 = ((AbstractSocket)var1).readUnsignedByte(); loginState = 8; } - if (loginState == 8 && ((AbstractSocket)var1).available() >= Message.field592) { - ((AbstractSocket)var1).read(var2.array, 0, Message.field592); + if (loginState == 8 && ((AbstractSocket)var1).available() >= WorldMapAreaData.field329) { + ((AbstractSocket)var1).read(var2.array, 0, WorldMapAreaData.field329); var2.offset = 0; loginState = 6; } if (loginState == 9 && ((AbstractSocket)var1).available() > 0) { - field671 = (((AbstractSocket)var1).readUnsignedByte() + 3) * 60; + field668 = (((AbstractSocket)var1).readUnsignedByte() + 3) * 60; loginState = 10; } if (loginState == 10) { - field669 = 0; - PlayerType.setLoginResponseString("You have only just left another world.", "Your profile will be transferred in:", field671 / 60 + " seconds."); - if (--field671 <= 0) { + field666 = 0; + GrandExchangeOffer.setLoginResponseString("You have only just left another world.", "Your profile will be transferred in:", field668 / 60 + " seconds."); + if (--field668 <= 0) { loginState = 0; } } else { if (loginState == 11 && ((AbstractSocket)var1).available() >= 1) { - World.field1012 = ((AbstractSocket)var1).readUnsignedByte(); + class49.field399 = ((AbstractSocket)var1).readUnsignedByte(); loginState = 12; } - int var16; - if (loginState == 12 && ((AbstractSocket)var1).available() >= World.field1012) { - var13 = ((AbstractSocket)var1).readUnsignedByte() == 1; + if (loginState == 12 && ((AbstractSocket)var1).available() >= class49.field399) { + var14 = ((AbstractSocket)var1).readUnsignedByte() == 1; ((AbstractSocket)var1).read(var2.array, 0, 4); var2.offset = 0; - boolean var34 = false; - if (var13) { - var14 = var2.readByteIsaac() << 24; - var14 |= var2.readByteIsaac() << 16; - var14 |= var2.readByteIsaac() << 8; - var14 |= var2.readByteIsaac(); - var16 = class288.method5224(Login.Login_username); - if (AbstractArchive.clientPreferences.parameters.size() >= 10 && !AbstractArchive.clientPreferences.parameters.containsKey(var16)) { - Iterator var17 = AbstractArchive.clientPreferences.parameters.entrySet().iterator(); - var17.next(); - var17.remove(); + boolean var31 = false; + if (var14) { + var15 = var2.readByteIsaac() << 24; + var15 |= var2.readByteIsaac() << 16; + var15 |= var2.readByteIsaac() << 8; + var15 |= var2.readByteIsaac(); + int var18 = GrandExchangeEvents.method108(Login.Login_username); + if (ScriptEvent.clientPreferences.parameters.size() >= 10 && !ScriptEvent.clientPreferences.parameters.containsKey(var18)) { + Iterator var28 = ScriptEvent.clientPreferences.parameters.entrySet().iterator(); + var28.next(); + var28.remove(); } - AbstractArchive.clientPreferences.parameters.put(var16, var14); + ScriptEvent.clientPreferences.parameters.put(var18, var15); } if (Login_isUsernameRemembered) { - AbstractArchive.clientPreferences.rememberedUsername = Login.Login_username; + ScriptEvent.clientPreferences.rememberedUsername = Login.Login_username; } else { - AbstractArchive.clientPreferences.rememberedUsername = null; + ScriptEvent.clientPreferences.rememberedUsername = null; } - Language.savePreferences(); + HitSplatDefinition.savePreferences(); staffModLevel = ((AbstractSocket)var1).readUnsignedByte(); playerMod = ((AbstractSocket)var1).readUnsignedByte() == 1; localPlayerIndex = ((AbstractSocket)var1).readUnsignedByte(); localPlayerIndex <<= 8; localPlayerIndex += ((AbstractSocket)var1).readUnsignedByte(); - field636 = ((AbstractSocket)var1).readUnsignedByte(); + field749 = ((AbstractSocket)var1).readUnsignedByte(); ((AbstractSocket)var1).read(var2.array, 0, 1); var2.offset = 0; - ServerPacket[] var29 = class96.ServerPacket_values(); - var6 = var2.readSmartByteShortIsaac(); - if (var6 < 0 || var6 >= var29.length) { - throw new IOException(var6 + " " + var2.offset); + ServerPacket[] var5 = SecureRandomCallable.ServerPacket_values(); + int var19 = var2.readSmartByteShortIsaac(); + if (var19 < 0 || var19 >= var5.length) { + throw new IOException(var19 + " " + var2.offset); } - packetWriter.serverPacket = var29[var6]; + packetWriter.serverPacket = var5[var19]; packetWriter.serverPacketLength = packetWriter.serverPacket.length; ((AbstractSocket)var1).read(var2.array, 0, 2); var2.offset = 0; packetWriter.serverPacketLength = var2.readUnsignedShort(); try { - class47.method881(ViewportMouse.client, "zap"); - } catch (Throwable var19) { + class47.method923(WorldMapID.client, "zap"); + } catch (Throwable var20) { } loginState = 13; @@ -2618,112 +3635,11 @@ public final class Client extends GameShell implements Usernamed { if (((AbstractSocket)var1).available() >= packetWriter.serverPacketLength) { var2.offset = 0; ((AbstractSocket)var1).read(var2.array, 0, packetWriter.serverPacketLength); - timer.method4939(); - mouseLastLastPressedTimeMillis = -1L; - WorldMapLabel.mouseRecorder.index = 0; - TaskHandler.hasFocus = true; - hadFocus = true; - field860 = -1L; - class96.reflectionChecks = new IterableNodeDeque(); - packetWriter.clearBuffer(); - packetWriter.packetBuffer.offset = 0; - packetWriter.serverPacket = null; - packetWriter.field1300 = null; - packetWriter.field1291 = null; - packetWriter.field1301 = null; - packetWriter.serverPacketLength = 0; - packetWriter.field1297 = 0; - rebootTimer = 0; - logoutTimer = 0; - hintArrowType = 0; - ScriptEvent.method1205(); - MouseHandler.MouseHandler_idleCycles = 0; - WorldMapDecoration.method349(); - isItemSelected = 0; - isSpellSelected = false; - soundEffectCount = 0; - camAngleY = 0; - oculusOrbState = 0; - StudioGame.field3086 = null; - minimapState = 0; - field643 = -1; - destinationX = 0; - destinationY = 0; - playerAttackOption = AttackOption.AttackOption_hidden; - npcAttackOption = AttackOption.AttackOption_hidden; - npcCount = 0; - ClientPreferences.method1861(); - - for (var33 = 0; var33 < 2048; ++var33) { - players[var33] = null; - } - - for (var33 = 0; var33 < 32768; ++var33) { - npcs[var33] = null; - } - - combatTargetPlayerIndex = -1; - projectiles.clear(); - graphicsObjects.clear(); - - for (var33 = 0; var33 < 4; ++var33) { - for (var14 = 0; var14 < 104; ++var14) { - for (var16 = 0; var16 < 104; ++var16) { - groundItems[var33][var14][var16] = null; - } - } - } - - pendingSpawns = new NodeDeque(); - Tiles.friendSystem.clear(); - - for (var33 = 0; var33 < VarpDefinition.VarpDefinition_fileCount; ++var33) { - VarpDefinition var28 = AbstractWorldMapData.method288(var33); - if (var28 != null) { - Varps.Varps_temp[var33] = 0; - Varps.Varps_main[var33] = 0; - } - } - - class197.varcs.clearTransient(); - followerIndex = -1; - if (rootInterface != -1) { - InterfaceParent.method1192(rootInterface); - } - - for (InterfaceParent var26 = (InterfaceParent)interfaceParents.first(); var26 != null; var26 = (InterfaceParent)interfaceParents.next()) { - FontName.closeInterface(var26, true); - } - - rootInterface = -1; - interfaceParents = new NodeHashTable(8); - meslayerContinueWidget = null; - ScriptEvent.method1205(); - playerAppearance.update((int[])null, new int[]{0, 0, 0, 0, 0}, false, -1); - - for (var33 = 0; var33 < 8; ++var33) { - playerMenuActions[var33] = null; - playerOptionsPriorities[var33] = false; - } - - FontName.method5266(); - isLoading = true; - - for (var33 = 0; var33 < 100; ++var33) { - field841[var33] = true; - } - - class210.method3948(); - Varps.clanChat = null; - - for (var33 = 0; var33 < 8; ++var33) { - grandExchangeOffers[var33] = new GrandExchangeOffer(); - } - - TileItem.grandExchangeEvents = null; - AttackOption.updatePlayer(var2); - ServerPacket.field2131 = -1; - PlayerType.loadRegions(false, var2); + timer.method5119(); + GrandExchangeOfferTotalQuantityComparator.method130(); + ArchiveLoader.updatePlayer(var2); + WorldMapSectionType.field140 = -1; + Clock.loadRegions(false, var2); packetWriter.serverPacket = null; } @@ -2732,35 +3648,35 @@ public final class Client extends GameShell implements Usernamed { var2.offset = 0; ((AbstractSocket)var1).read(var2.array, 0, 2); var2.offset = 0; - class40.field329 = var2.readUnsignedShort(); + WorldMapData_0.field92 = var2.readUnsignedShort(); loginState = 15; } - if (loginState == 15 && ((AbstractSocket)var1).available() >= class40.field329) { + if (loginState == 15 && ((AbstractSocket)var1).available() >= WorldMapData_0.field92) { var2.offset = 0; - ((AbstractSocket)var1).read(var2.array, 0, class40.field329); + ((AbstractSocket)var1).read(var2.array, 0, WorldMapData_0.field92); var2.offset = 0; - String var24 = var2.readStringCp1252NullTerminated(); - String var27 = var2.readStringCp1252NullTerminated(); - String var30 = var2.readStringCp1252NullTerminated(); - PlayerType.setLoginResponseString(var24, var27, var30); - MouseRecorder.updateGameState(10); + String var23 = var2.readStringCp1252NullTerminated(); + String var25 = var2.readStringCp1252NullTerminated(); + String var26 = var2.readStringCp1252NullTerminated(); + GrandExchangeOffer.setLoginResponseString(var23, var25, var26); + Tile.updateGameState(10); } if (loginState != 16) { - ++field669; - if (field669 > 2000) { - if (field670 < 1) { - if (HitSplatDefinition.port1 == NPC.port3) { - NPC.port3 = BZip2State.port2; + ++field666; + if (field666 > 2000) { + if (field667 < 1) { + if (GrandExchangeOfferUnitPriceComparator.port3 == class222.port1) { + GrandExchangeOfferUnitPriceComparator.port3 = Decimator.port2; } else { - NPC.port3 = HitSplatDefinition.port1; + GrandExchangeOfferUnitPriceComparator.port3 = class222.port1; } - ++field670; + ++field667; loginState = 0; } else { - ArchiveDisk.getLoginError(-3); + AbstractArchive.getLoginError(-3); } } } else { @@ -2777,71 +3693,76 @@ public final class Client extends GameShell implements Usernamed { if (((AbstractSocket)var1).available() >= packetWriter.serverPacketLength) { ((AbstractSocket)var1).read(var2.array, 0, packetWriter.serverPacketLength); var2.offset = 0; - var33 = packetWriter.serverPacketLength; - timer.method4941(); + var30 = packetWriter.serverPacketLength; + timer.method5121(); packetWriter.clearBuffer(); packetWriter.packetBuffer.offset = 0; packetWriter.serverPacket = null; - packetWriter.field1300 = null; - packetWriter.field1291 = null; - packetWriter.field1301 = null; + packetWriter.field1290 = null; + packetWriter.field1286 = null; + packetWriter.field1292 = null; packetWriter.serverPacketLength = 0; - packetWriter.field1297 = 0; + packetWriter.field1291 = 0; rebootTimer = 0; - ScriptEvent.method1205(); + menuOptionsCount = 0; + isMenuOpen = false; minimapState = 0; destinationX = 0; - for (var14 = 0; var14 < 2048; ++var14) { - players[var14] = null; + for (var15 = 0; var15 < 2048; ++var15) { + players[var15] = null; } - class223.localPlayer = null; + class215.localPlayer = null; - for (var14 = 0; var14 < npcs.length; ++var14) { - NPC var31 = npcs[var14]; - if (var31 != null) { - var31.targetIndex = -1; - var31.false0 = false; + for (var15 = 0; var15 < npcs.length; ++var15) { + NPC var27 = npcs[var15]; + if (var27 != null) { + var27.targetIndex = -1; + var27.false0 = false; } } - FontName.method5266(); - MouseRecorder.updateGameState(30); + ItemContainer.itemContainers = new NodeHashTable(32); + Tile.updateGameState(30); - for (var14 = 0; var14 < 100; ++var14) { - field841[var14] = true; + for (var15 = 0; var15 < 100; ++var15) { + field842[var15] = true; } - class210.method3948(); - AttackOption.updatePlayer(var2); - if (var33 != var2.offset) { + var4 = SoundSystem.getPacketBufferNode(ClientPacket.field2257, packetWriter.isaacCipher); + var4.packetBuffer.writeByte(WallDecoration.getWindowedMode()); + var4.packetBuffer.writeShort(class286.canvasWidth); + var4.packetBuffer.writeShort(FloorUnderlayDefinition.canvasHeight); + packetWriter.addNode(var4); + ArchiveLoader.updatePlayer(var2); + if (var30 != var2.offset) { throw new RuntimeException(); } } } } } - } catch (IOException var21) { - if (field670 < 1) { - if (NPC.port3 == HitSplatDefinition.port1) { - NPC.port3 = BZip2State.port2; + } catch (IOException var22) { + if (field667 < 1) { + if (class222.port1 == GrandExchangeOfferUnitPriceComparator.port3) { + GrandExchangeOfferUnitPriceComparator.port3 = Decimator.port2; } else { - NPC.port3 = HitSplatDefinition.port1; + GrandExchangeOfferUnitPriceComparator.port3 = class222.port1; } - ++field670; + ++field667; loginState = 0; } else { - ArchiveDisk.getLoginError(-2); + AbstractArchive.getLoginError(-2); } } } - @ObfuscatedName("fd") + @ObfuscatedName("fq") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1173156947" + signature = "(B)V", + garbageValue = "80" ) @Export("doCycleLoggedIn") final void doCycleLoggedIn() { @@ -2853,15 +3774,16 @@ public final class Client extends GameShell implements Usernamed { --logoutTimer; } - if (field730) { - field730 = false; - MouseRecorder.method1213(); + if (field680) { + field680 = false; + AbstractWorldMapIcon.method652(); } else { if (!isMenuOpen) { - KeyHandler.addCancelMenuEntry(); + ClientPacket.addCancelMenuEntry(); } - for (int var1 = 0; var1 < 100 && this.method1607(packetWriter); ++var1) { + int var1; + for (var1 = 0; var1 < 100 && this.method1720(packetWriter); ++var1) { } if (gameState == 30) { @@ -2879,14 +3801,14 @@ public final class Client extends GameShell implements Usernamed { if (!var29) { PacketBufferNode var14; int var15; - if (timer.field3563) { - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2187, packetWriter.isaacCipher); + if (timer.field3568) { + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2201, packetWriter.isaacCipher); var14.packetBuffer.writeByte(0); var15 = var14.packetBuffer.offset; timer.write(var14.packetBuffer); var14.packetBuffer.writeLengthByte(var14.packetBuffer.offset - var15); packetWriter.addNode(var14); - timer.method4940(); + timer.method5120(); } int var4; @@ -2898,56 +3820,57 @@ public final class Client extends GameShell implements Usernamed { int var10; int var11; int var12; - synchronized(WorldMapLabel.mouseRecorder.lock) { - if (!field802) { - WorldMapLabel.mouseRecorder.index = 0; - } else if (MouseHandler.MouseHandler_lastButton != 0 || WorldMapLabel.mouseRecorder.index >= 40) { + PacketBuffer var10000; + synchronized(class3.mouseRecorder.lock) { + if (!field791) { + class3.mouseRecorder.index = 0; + } else if (MouseHandler.MouseHandler_lastButton != 0 || class3.mouseRecorder.index >= 40) { var30 = null; var3 = 0; var4 = 0; var5 = 0; var6 = 0; - for (var7 = 0; var7 < WorldMapLabel.mouseRecorder.index && (var30 == null || var30.packetBuffer.offset - var3 < 246); ++var7) { + for (var7 = 0; var7 < class3.mouseRecorder.index && (var30 == null || var30.packetBuffer.offset - var3 < 246); ++var7) { var4 = var7; - var8 = WorldMapLabel.mouseRecorder.ys[var7]; + var8 = class3.mouseRecorder.ys[var7]; if (var8 < -1) { var8 = -1; } else if (var8 > 65534) { var8 = 65534; } - var9 = WorldMapLabel.mouseRecorder.xs[var7]; + var9 = class3.mouseRecorder.xs[var7]; if (var9 < -1) { var9 = -1; } else if (var9 > 65534) { var9 = 65534; } - if (var9 != field646 || var8 != field647) { + if (var9 != field644 || var8 != field905) { if (var30 == null) { - var30 = InterfaceParent.getPacketBufferNode(ClientPacket.field2188, packetWriter.isaacCipher); + var30 = SoundSystem.getPacketBufferNode(ClientPacket.field2183, packetWriter.isaacCipher); var30.packetBuffer.writeByte(0); var3 = var30.packetBuffer.offset; - PacketBuffer var10000 = var30.packetBuffer; + var10000 = var30.packetBuffer; var10000.offset += 2; var5 = 0; var6 = 0; } - if (field648 != -1L) { - var10 = var9 - field646; - var11 = var8 - field647; - var12 = (int)((WorldMapLabel.mouseRecorder.millis[var7] - field648) / 20L); - var5 = (int)((long)var5 + (WorldMapLabel.mouseRecorder.millis[var7] - field648) % 20L); + if (field646 != -1L) { + var10 = var9 - field644; + var11 = var8 - field905; + var12 = (int)((class3.mouseRecorder.millis[var7] - field646) / 20L); + var5 = (int)((long)var5 + (class3.mouseRecorder.millis[var7] - field646) % 20L); } else { var10 = var9; var11 = var8; var12 = Integer.MAX_VALUE; } - field646 = var9; - field647 = var8; + field644 = var9; + field905 = var8; if (var12 < 8 && var10 >= -32 && var10 <= 31 && var11 >= -32 && var11 <= 31) { var10 += 32; var11 += 32; @@ -2974,7 +3897,7 @@ public final class Client extends GameShell implements Usernamed { } ++var6; - field648 = WorldMapLabel.mouseRecorder.millis[var7]; + field646 = class3.mouseRecorder.millis[var7]; } } @@ -2988,152 +3911,234 @@ public final class Client extends GameShell implements Usernamed { packetWriter.addNode(var30); } - if (var4 >= WorldMapLabel.mouseRecorder.index) { - WorldMapLabel.mouseRecorder.index = 0; + if (var4 >= class3.mouseRecorder.index) { + class3.mouseRecorder.index = 0; } else { - MouseRecorder var42 = WorldMapLabel.mouseRecorder; - var42.index -= var4; - System.arraycopy(WorldMapLabel.mouseRecorder.xs, var4, WorldMapLabel.mouseRecorder.xs, 0, WorldMapLabel.mouseRecorder.index); - System.arraycopy(WorldMapLabel.mouseRecorder.ys, var4, WorldMapLabel.mouseRecorder.ys, 0, WorldMapLabel.mouseRecorder.index); - System.arraycopy(WorldMapLabel.mouseRecorder.millis, var4, WorldMapLabel.mouseRecorder.millis, 0, WorldMapLabel.mouseRecorder.index); + MouseRecorder var47 = class3.mouseRecorder; + var47.index -= var4; + System.arraycopy(class3.mouseRecorder.xs, var4, class3.mouseRecorder.xs, 0, class3.mouseRecorder.index); + System.arraycopy(class3.mouseRecorder.ys, var4, class3.mouseRecorder.ys, 0, class3.mouseRecorder.index); + System.arraycopy(class3.mouseRecorder.millis, var4, class3.mouseRecorder.millis, 0, class3.mouseRecorder.index); } } } PacketBufferNode var18; - if (MouseHandler.MouseHandler_lastButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_lastButton == 4 || MouseHandler.MouseHandler_lastButton == 2) { - long var16 = (MouseHandler.MouseHandler_lastPressedTimeMillis - mouseLastLastPressedTimeMillis) / 50L; + if (MouseHandler.MouseHandler_lastButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_lastButton == 4 || MouseHandler.MouseHandler_lastButton == 2) { + long var16 = (MouseHandler.MouseHandler_lastPressedTimeMillis - mouseLastLastPressedTimeMillis * -1L) / 50L; if (var16 > 4095L) { var16 = 4095L; } - mouseLastLastPressedTimeMillis = MouseHandler.MouseHandler_lastPressedTimeMillis; + mouseLastLastPressedTimeMillis = MouseHandler.MouseHandler_lastPressedTimeMillis * -1L; var3 = MouseHandler.MouseHandler_lastPressedY; if (var3 < 0) { var3 = 0; - } else if (var3 > WallDecoration.canvasHeight) { - var3 = WallDecoration.canvasHeight; + } else if (var3 > FloorUnderlayDefinition.canvasHeight) { + var3 = FloorUnderlayDefinition.canvasHeight; } var4 = MouseHandler.MouseHandler_lastPressedX; if (var4 < 0) { var4 = 0; - } else if (var4 > FloorDecoration.canvasWidth) { - var4 = FloorDecoration.canvasWidth; + } else if (var4 > class286.canvasWidth) { + var4 = class286.canvasWidth; } var5 = (int)var16; - var18 = InterfaceParent.getPacketBufferNode(ClientPacket.field2210, packetWriter.isaacCipher); + var18 = SoundSystem.getPacketBufferNode(ClientPacket.field2216, packetWriter.isaacCipher); var18.packetBuffer.writeShort((MouseHandler.MouseHandler_lastButton == 2 ? 1 : 0) + (var5 << 1)); var18.packetBuffer.writeShort(var4); var18.packetBuffer.writeShort(var3); packetWriter.addNode(var18); } - if (KeyHandler.field361 > 0) { - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2224, packetWriter.isaacCipher); + if (KeyHandler.field384 > 0) { + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2187, packetWriter.isaacCipher); var14.packetBuffer.writeShort(0); var15 = var14.packetBuffer.offset; - long var19 = class30.currentTimeMillis(); + long var19 = PlayerAppearance.currentTimeMillis(); - for (var5 = 0; var5 < KeyHandler.field361; ++var5) { - long var21 = var19 - field860; + for (var5 = 0; var5 < KeyHandler.field384; ++var5) { + long var21 = var19 - field663; if (var21 > 16777215L) { var21 = 16777215L; } - field860 = var19; - var14.packetBuffer.method5485((int)var21); - var14.packetBuffer.method5461(KeyHandler.field376[var5]); + field663 = var19; + var14.packetBuffer.writeMedium((int)var21); + var14.packetBuffer.writeByte(KeyHandler.field383[var5]); } var14.packetBuffer.writeLengthShort(var14.packetBuffer.offset - var15); packetWriter.addNode(var14); } - if (field720 > 0) { - --field720; + if (field715 > 0) { + --field715; } if (KeyHandler.KeyHandler_pressedKeys[96] || KeyHandler.KeyHandler_pressedKeys[97] || KeyHandler.KeyHandler_pressedKeys[98] || KeyHandler.KeyHandler_pressedKeys[99]) { - field721 = true; + field733 = true; } - if (field721 && field720 <= 0) { - field720 = 20; - field721 = false; - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2209, packetWriter.isaacCipher); + if (field733 && field715 <= 0) { + field715 = 20; + field733 = false; + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2220, packetWriter.isaacCipher); + var14.packetBuffer.method5644(camAngleY); var14.packetBuffer.writeShortLE(camAngleX); - var14.packetBuffer.method5476(camAngleY); packetWriter.addNode(var14); } - if (TaskHandler.hasFocus && !hadFocus) { + if (class30.hasFocus && !hadFocus) { hadFocus = true; - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2186, packetWriter.isaacCipher); + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2209, packetWriter.isaacCipher); var14.packetBuffer.writeByte(1); packetWriter.addNode(var14); } - if (!TaskHandler.hasFocus && hadFocus) { + if (!class30.hasFocus && hadFocus) { hadFocus = false; - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2186, packetWriter.isaacCipher); + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2209, packetWriter.isaacCipher); var14.packetBuffer.writeByte(0); packetWriter.addNode(var14); } - if (Tiles.worldMap != null) { - Tiles.worldMap.method6314(); + if (Login.worldMap != null) { + Login.worldMap.method6427(); } - if (GrandExchangeOfferAgeComparator.ClanChat_inClanChat) { - if (Varps.clanChat != null) { - Varps.clanChat.sort(); - } - - Archive.method4278(); - GrandExchangeOfferAgeComparator.ClanChat_inClanChat = false; - } - - class60.method1191(); + ModelData0.method3378(); + ScriptFrame.method1219(); if (gameState != 30) { return; } - class160.method3417(); - HealthBarUpdate.method1769(); - ++packetWriter.field1297; - if (packetWriter.field1297 > 750) { - MouseRecorder.method1213(); + for (PendingSpawn var37 = (PendingSpawn)pendingSpawns.last(); var37 != null; var37 = (PendingSpawn)pendingSpawns.previous()) { + if (var37.hitpoints > 0) { + --var37.hitpoints; + } + + if (var37.hitpoints == 0) { + if (var37.objectId < 0 || class296.method5547(var37.objectId, var37.field914)) { + GrandExchangeOfferUnitPriceComparator.addPendingSpawnToScene(var37.plane, var37.type, var37.x, var37.y, var37.objectId, var37.field913, var37.field914); + var37.remove(); + } + } else { + if (var37.delay > 0) { + --var37.delay; + } + + if (var37.delay == 0 && var37.x >= 1 && var37.y >= 1 && var37.x <= 102 && var37.y <= 102 && (var37.id < 0 || class296.method5547(var37.id, var37.field917))) { + GrandExchangeOfferUnitPriceComparator.addPendingSpawnToScene(var37.plane, var37.type, var37.x, var37.y, var37.id, var37.orientation, var37.field917); + var37.delay = -1; + if (var37.id == var37.objectId && var37.objectId == -1) { + var37.remove(); + } else if (var37.id == var37.objectId && var37.field913 == var37.orientation && var37.field917 == var37.field914) { + var37.remove(); + } + } + } + } + + int var10002; + for (var1 = 0; var1 < soundEffectCount; ++var1) { + var10002 = queuedSoundEffectDelays[var1]--; + if (queuedSoundEffectDelays[var1] >= -10) { + SoundEffect var31 = soundEffects[var1]; + if (var31 == null) { + var10000 = null; + var31 = SoundEffect.readSoundEffect(NetFileRequest.archive4, soundEffectIds[var1], 0); + if (var31 == null) { + continue; + } + + int[] var48 = queuedSoundEffectDelays; + var48[var1] += var31.calculateDelay(); + soundEffects[var1] = var31; + } + + if (queuedSoundEffectDelays[var1] < 0) { + if (soundLocations[var1] != 0) { + var4 = (soundLocations[var1] & 255) * 128; + var5 = soundLocations[var1] >> 16 & 255; + var6 = var5 * 128 + 64 - class215.localPlayer.x; + if (var6 < 0) { + var6 = -var6; + } + + var7 = soundLocations[var1] >> 8 & 255; + var8 = var7 * 128 + 64 - class215.localPlayer.y; + if (var8 < 0) { + var8 = -var8; + } + + var9 = var6 + var8 - 128; + if (var9 > var4) { + queuedSoundEffectDelays[var1] = -100; + continue; + } + + if (var9 < 0) { + var9 = 0; + } + + var3 = (var4 - var9) * field868 / var4; + } else { + var3 = soundEffectVolume; + } + + if (var3 > 0) { + RawSound var23 = var31.toRawSound().resample(AbstractWorldMapIcon.decimator); + RawPcmStream var24 = RawPcmStream.createRawPcmStream(var23, 100, var3); + var24.setNumLoops(queuedSoundEffectLoops[var1] - 1); + FloorUnderlayDefinition.pcmStreamMixer.addSubStream(var24); + } + + queuedSoundEffectDelays[var1] = -100; + } + } else { + --soundEffectCount; + + for (var15 = var1; var15 < soundEffectCount; ++var15) { + soundEffectIds[var15] = soundEffectIds[var15 + 1]; + soundEffects[var15] = soundEffects[var15 + 1]; + queuedSoundEffectLoops[var15] = queuedSoundEffectLoops[var15 + 1]; + queuedSoundEffectDelays[var15] = queuedSoundEffectDelays[var15 + 1]; + soundLocations[var15] = soundLocations[var15 + 1]; + } + + --var1; + } + } + + if (field855 && !Login.method2256()) { + if (field864 != 0 && field865 != -1) { + MusicPatchNode2.method3830(class216.archive6, field865, 0, field864, false); + } + + field855 = false; + } + + ++packetWriter.field1291; + if (packetWriter.field1291 > 750) { + AbstractWorldMapIcon.method652(); return; } - class32.method571(); - WallDecoration.method3255(); - int[] var36 = Players.Players_indices; + WorldMapData_1.method767(); - for (var15 = 0; var15 < Players.Players_count; ++var15) { - Player var23 = players[var36[var15]]; - if (var23 != null && var23.overheadTextCyclesRemaining > 0) { - --var23.overheadTextCyclesRemaining; - if (var23.overheadTextCyclesRemaining == 0) { - var23.overheadText = null; - } + for (var1 = 0; var1 < npcCount; ++var1) { + var15 = npcIndices[var1]; + NPC var25 = npcs[var15]; + if (var25 != null) { + HitSplatDefinition.calculateActorPosition(var25, var25.definition.size); } } - for (var15 = 0; var15 < npcCount; ++var15) { - var3 = npcIndices[var15]; - NPC var24 = npcs[var3]; - if (var24 != null && var24.overheadTextCyclesRemaining > 0) { - --var24.overheadTextCyclesRemaining; - if (var24.overheadTextCyclesRemaining == 0) { - var24.overheadText = null; - } - } - } - - ++field698; + KeyHandler.method913(); + ++field693; if (mouseCrossColor != 0) { mouseCrossState = mouseCrossState * 400 + 400; if (mouseCrossState * 20 >= 400) { @@ -3141,328 +4146,338 @@ public final class Client extends GameShell implements Usernamed { } } - if (GrandExchangeOfferOwnWorldComparator.field628 != null) { - ++field750; - if (field750 >= 15) { - WorldMapSectionType.invalidateWidget(GrandExchangeOfferOwnWorldComparator.field628); - GrandExchangeOfferOwnWorldComparator.field628 = null; + if (Login.field1165 != null) { + ++field753; + if (field753 >= 15) { + GrandExchangeOfferAgeComparator.invalidateWidget(Login.field1165); + Login.field1165 = null; } } - Widget var37 = NetSocket.mousedOverWidgetIf1; - Widget var31 = Strings.field2767; - NetSocket.mousedOverWidgetIf1 = null; - Strings.field2767 = null; + Widget var38 = ChatChannel.mousedOverWidgetIf1; + Widget var32 = GrandExchangeEvents.field39; + ChatChannel.mousedOverWidgetIf1 = null; + GrandExchangeEvents.field39 = null; draggedOnWidget = null; - field817 = false; - field814 = false; - field857 = 0; + field695 = false; + field809 = false; + field866 = 0; - while (DynamicObject.isKeyDown() && field857 < 128) { - if (staffModLevel >= 2 && KeyHandler.KeyHandler_pressedKeys[82] && SecureRandomFuture.field1230 == 66) { - String var39 = Entity.method3225(); - ViewportMouse.client.clipboardSetString(var39); - } else if (oculusOrbState != 1 || KeyHandler.field381 <= 0) { - field859[field857] = SecureRandomFuture.field1230; - field858[field857] = KeyHandler.field381; - ++field857; + while (class237.isKeyDown() && field866 < 128) { + if (staffModLevel >= 2 && KeyHandler.KeyHandler_pressedKeys[82] && WorldMapLabel.field229 == 66) { + String var40 = ""; + + Message var39; + for (Iterator var42 = Messages.Messages_hashTable.iterator(); var42.hasNext(); var40 = var40 + var39.sender + ':' + var39.text + '\n') { + var39 = (Message)var42.next(); + } + + WorldMapID.client.clipboardSetString(var40); + } else if (oculusOrbState != 1 || DevicePcmPlayerProvider.field395 <= 0) { + field854[field866] = WorldMapLabel.field229; + field853[field866] = DevicePcmPlayerProvider.field395; + ++field866; } } - boolean var32 = staffModLevel >= 2; - if (var32 && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81] && mouseWheelRotation != 0) { - var4 = class223.localPlayer.plane - mouseWheelRotation; - if (var4 < 0) { - var4 = 0; - } else if (var4 > 3) { - var4 = 3; + if (PendingSpawn.method1854() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81] && mouseWheelRotation != 0) { + var3 = class215.localPlayer.Scene_plane - mouseWheelRotation; + if (var3 < 0) { + var3 = 0; + } else if (var3 > 3) { + var3 = 3; } - if (var4 != class223.localPlayer.plane) { - class287.method5220(class223.localPlayer.pathX[0] + class223.baseX * 64, class223.localPlayer.pathY[0] + class286.baseY * 64, var4, false); + if (var3 != class215.localPlayer.Scene_plane) { + var4 = class215.localPlayer.pathX[0] + UserComparator8.baseX * 64; + var5 = class215.localPlayer.pathY[0] + HealthBar.baseY * 64; + var18 = SoundSystem.getPacketBufferNode(ClientPacket.field2228, packetWriter.isaacCipher); + var18.packetBuffer.writeIntME(0); + var18.packetBuffer.writeByte(var3); + var18.packetBuffer.method5644(var5); + var18.packetBuffer.writeShortLE(var4); + packetWriter.addNode(var18); } mouseWheelRotation = 0; } if (rootInterface != -1) { - AbstractWorldMapData.updateRootInterface(rootInterface, 0, 0, FloorDecoration.canvasWidth, WallDecoration.canvasHeight, 0, 0); + ServerBuild.updateRootInterface(rootInterface, 0, 0, class286.canvasWidth, FloorUnderlayDefinition.canvasHeight, 0, 0); } ++cycleCntr; while (true) { - Widget var25; - Widget var38; - ScriptEvent var40; + Widget var41; + Widget var43; + ScriptEvent var44; do { - var40 = (ScriptEvent)field836.removeLast(); - if (var40 == null) { + var44 = (ScriptEvent)field813.removeLast(); + if (var44 == null) { while (true) { do { - var40 = (ScriptEvent)field763.removeLast(); - if (var40 == null) { + var44 = (ScriptEvent)field832.removeLast(); + if (var44 == null) { while (true) { do { - var40 = (ScriptEvent)scriptEvents.removeLast(); - if (var40 == null) { + var44 = (ScriptEvent)scriptEvents.removeLast(); + if (var44 == null) { this.menu(); - if (Tiles.worldMap != null) { - Tiles.worldMap.method6272(WorldMapRectangle.plane, class223.baseX * 64 + (class223.localPlayer.x >> 7), class286.baseY * 64 + (class223.localPlayer.y >> 7), false); - Tiles.worldMap.loadCache(); - } - + JagexCache.method3624(); if (clickedWidget != null) { - this.method1328(); + this.method1414(); } - if (Frames.dragInventoryWidget != null) { - WorldMapSectionType.invalidateWidget(Frames.dragInventoryWidget); + if (GrandExchangeOffer.dragInventoryWidget != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(GrandExchangeOffer.dragInventoryWidget); ++itemDragDuration; if (MouseHandler.MouseHandler_currentButton == 0) { - if (field748) { - if (Frames.dragInventoryWidget == DevicePcmPlayerProvider.field391 && dragItemSlotDestination != dragItemSlotSource) { - Widget var41 = Frames.dragInventoryWidget; + if (field743) { + if (DirectByteArrayCopier.field2476 == GrandExchangeOffer.dragInventoryWidget && dragItemSlotSource != dragItemSlotDestination) { + Widget var46 = GrandExchangeOffer.dragInventoryWidget; byte var33 = 0; - if (field873 == 1 && var41.contentType == 206) { + if (field907 == 1 && var46.contentType == 206) { var33 = 1; } - if (var41.itemIds[dragItemSlotDestination] <= 0) { + if (var46.itemIds[dragItemSlotDestination] <= 0) { var33 = 0; } - if (WorldMapSection0.method249(class2.getWidgetClickMask(var41))) { - var6 = dragItemSlotSource; - var7 = dragItemSlotDestination; - var41.itemIds[var7] = var41.itemIds[var6]; - var41.itemQuantities[var7] = var41.itemQuantities[var6]; - var41.itemIds[var6] = -1; - var41.itemQuantities[var6] = 0; + var6 = class195.getWidgetClickMask(var46); + boolean var34 = (var6 >> 29 & 1) != 0; + if (var34) { + var7 = dragItemSlotSource; + var8 = dragItemSlotDestination; + var46.itemIds[var8] = var46.itemIds[var7]; + var46.itemQuantities[var8] = var46.itemQuantities[var7]; + var46.itemIds[var7] = -1; + var46.itemQuantities[var7] = 0; } else if (var33 == 1) { - var6 = dragItemSlotSource; - var7 = dragItemSlotDestination; + var7 = dragItemSlotSource; + var8 = dragItemSlotDestination; - while (var7 != var6) { - if (var6 > var7) { - var41.swapItems(var6 - 1, var6); - --var6; - } else if (var6 < var7) { - var41.swapItems(var6 + 1, var6); - ++var6; + while (var8 != var7) { + if (var7 > var8) { + var46.swapItems(var7 - 1, var7); + --var7; + } else if (var7 < var8) { + var46.swapItems(var7 + 1, var7); + ++var7; } } } else { - var41.swapItems(dragItemSlotDestination, dragItemSlotSource); + var46.swapItems(dragItemSlotDestination, dragItemSlotSource); } - var18 = InterfaceParent.getPacketBufferNode(ClientPacket.field2222, packetWriter.isaacCipher); - var18.packetBuffer.method5630(Frames.dragInventoryWidget.id); - var18.packetBuffer.writeShort(dragItemSlotDestination); - var18.packetBuffer.writeByte(var33); - var18.packetBuffer.method5476(dragItemSlotSource); - packetWriter.addNode(var18); + PacketBufferNode var26 = SoundSystem.getPacketBufferNode(ClientPacket.field2205, packetWriter.isaacCipher); + var26.packetBuffer.method5644(dragItemSlotSource); + var26.packetBuffer.method5653(GrandExchangeOffer.dragInventoryWidget.id); + var26.packetBuffer.method5643(dragItemSlotDestination); + var26.packetBuffer.method5636(var33); + packetWriter.addNode(var26); } } else if (this.shouldLeftClickOpenMenu()) { - this.openMenu(field745, field746); + this.openMenu(field729, field741); } else if (menuOptionsCount > 0) { - class3.method47(field745, field746); + AbstractWorldMapData.method325(field729, field741); } - field750 = 10; + field753 = 10; MouseHandler.MouseHandler_lastButton = 0; - Frames.dragInventoryWidget = null; - } else if (itemDragDuration >= 5 && (MouseHandler.MouseHandler_x > field745 + 5 || MouseHandler.MouseHandler_x < field745 - 5 || MouseHandler.MouseHandler_y > field746 + 5 || MouseHandler.MouseHandler_y < field746 - 5)) { - field748 = true; + GrandExchangeOffer.dragInventoryWidget = null; + } else if (itemDragDuration >= 5 && (MouseHandler.MouseHandler_x > field729 + 5 || MouseHandler.MouseHandler_x < field729 - 5 || MouseHandler.MouseHandler_y > field741 + 5 || MouseHandler.MouseHandler_y < field741 - 5)) { + field743 = true; } } - if (Scene.method3085()) { - var4 = Scene.Scene_selectedX; - var5 = Scene.Scene_selectedY; - var18 = InterfaceParent.getPacketBufferNode(ClientPacket.field2281, packetWriter.isaacCipher); - var18.packetBuffer.writeByte(5); - var18.packetBuffer.writeShortLE(class223.baseX * 64 + var4); - var18.packetBuffer.method5476(class286.baseY * 64 + var5); - var18.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? (KeyHandler.KeyHandler_pressedKeys[81] ? 2 : 1) : 0); - packetWriter.addNode(var18); - Scene.method3086(); + PacketBufferNode var45; + if (Scene.method3252()) { + var3 = Scene.Scene_selectedX; + var4 = Scene.Scene_selectedY; + var45 = SoundSystem.getPacketBufferNode(ClientPacket.field2243, packetWriter.isaacCipher); + var45.packetBuffer.writeByte(5); + var45.packetBuffer.writeShort(UserComparator8.baseX * 64 + var3); + var45.packetBuffer.method5634(KeyHandler.KeyHandler_pressedKeys[82] ? (KeyHandler.KeyHandler_pressedKeys[81] ? 2 : 1) : 0); + var45.packetBuffer.writeShort(HealthBar.baseY * 64 + var4); + packetWriter.addNode(var45); + Scene.method3281(); mouseCrossX = MouseHandler.MouseHandler_lastPressedX; mouseCrossY = MouseHandler.MouseHandler_lastPressedY; mouseCrossColor = 1; mouseCrossState = 0; - destinationX = var4; - destinationY = var5; + destinationX = var3; + destinationY = var4; } - if (var37 != NetSocket.mousedOverWidgetIf1) { - if (var37 != null) { - WorldMapSectionType.invalidateWidget(var37); + if (var38 != ChatChannel.mousedOverWidgetIf1) { + if (var38 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var38); } - if (NetSocket.mousedOverWidgetIf1 != null) { - WorldMapSectionType.invalidateWidget(NetSocket.mousedOverWidgetIf1); + if (ChatChannel.mousedOverWidgetIf1 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(ChatChannel.mousedOverWidgetIf1); } } - if (var31 != Strings.field2767 && field788 == field787) { - if (var31 != null) { - WorldMapSectionType.invalidateWidget(var31); + if (var32 != GrandExchangeEvents.field39 && field783 == field782) { + if (var32 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var32); } - if (Strings.field2767 != null) { - WorldMapSectionType.invalidateWidget(Strings.field2767); + if (GrandExchangeEvents.field39 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(GrandExchangeEvents.field39); } } - if (Strings.field2767 != null) { - if (field787 < field788) { - ++field787; - if (field787 == field788) { - WorldMapSectionType.invalidateWidget(Strings.field2767); + if (GrandExchangeEvents.field39 != null) { + if (field782 < field783) { + ++field782; + if (field782 == field783) { + GrandExchangeOfferAgeComparator.invalidateWidget(GrandExchangeEvents.field39); } } - } else if (field787 > 0) { - --field787; + } else if (field782 > 0) { + --field782; } if (oculusOrbState == 0) { - var4 = class223.localPlayer.x; - var5 = class223.localPlayer.y; - if (ObjectSound.oculusOrbFocalPointX - var4 < -500 || ObjectSound.oculusOrbFocalPointX - var4 > 500 || class14.oculusOrbFocalPointY - var5 < -500 || class14.oculusOrbFocalPointY - var5 > 500) { - ObjectSound.oculusOrbFocalPointX = var4; - class14.oculusOrbFocalPointY = var5; + var3 = class215.localPlayer.x; + var4 = class215.localPlayer.y; + if (IgnoreList.oculusOrbFocalPointX - var3 < -500 || IgnoreList.oculusOrbFocalPointX - var3 > 500 || AbstractArchive.oculusOrbFocalPointY - var4 < -500 || AbstractArchive.oculusOrbFocalPointY - var4 > 500) { + IgnoreList.oculusOrbFocalPointX = var3; + AbstractArchive.oculusOrbFocalPointY = var4; } - if (var4 != ObjectSound.oculusOrbFocalPointX) { - ObjectSound.oculusOrbFocalPointX += (var4 - ObjectSound.oculusOrbFocalPointX) / 16; + if (var3 != IgnoreList.oculusOrbFocalPointX) { + IgnoreList.oculusOrbFocalPointX += (var3 - IgnoreList.oculusOrbFocalPointX) / 16; } - if (var5 != class14.oculusOrbFocalPointY) { - class14.oculusOrbFocalPointY += (var5 - class14.oculusOrbFocalPointY) / 16; + if (var4 != AbstractArchive.oculusOrbFocalPointY) { + AbstractArchive.oculusOrbFocalPointY += (var4 - AbstractArchive.oculusOrbFocalPointY) / 16; } - var6 = ObjectSound.oculusOrbFocalPointX >> 7; - var7 = class14.oculusOrbFocalPointY >> 7; - var8 = MusicPatchPcmStream.getTileHeight(ObjectSound.oculusOrbFocalPointX, class14.oculusOrbFocalPointY, WorldMapRectangle.plane); - var9 = 0; - if (var6 > 3 && var7 > 3 && var6 < 100 && var7 < 100) { - for (var10 = var6 - 4; var10 <= var6 + 4; ++var10) { - for (var11 = var7 - 4; var11 <= var7 + 4; ++var11) { - var12 = WorldMapRectangle.plane; - if (var12 < 3 && (Tiles.Tiles_renderFlags[1][var10][var11] & 2) == 2) { - ++var12; + var5 = IgnoreList.oculusOrbFocalPointX >> 7; + var6 = AbstractArchive.oculusOrbFocalPointY >> 7; + var7 = GraphicsObject.getTileHeight(IgnoreList.oculusOrbFocalPointX, AbstractArchive.oculusOrbFocalPointY, Player.Scene_plane); + var8 = 0; + if (var5 > 3 && var6 > 3 && var5 < 100 && var6 < 100) { + for (var9 = var5 - 4; var9 <= var5 + 4; ++var9) { + for (var10 = var6 - 4; var10 <= var6 + 4; ++var10) { + var11 = Player.Scene_plane; + if (var11 < 3 && (Tiles.Tiles_renderFlags[1][var9][var10] & 2) == 2) { + ++var11; } - int var26 = var8 - Tiles.Tiles_heights[var12][var10][var11]; - if (var26 > var9) { - var9 = var26; + var12 = var7 - Tiles.Tiles_heights[var11][var9][var10]; + if (var12 > var8) { + var8 = var12; } } } } - var10 = var9 * 192; - if (var10 > 98048) { - var10 = 98048; + var9 = var8 * 192; + if (var9 > 98048) { + var9 = 98048; } - if (var10 < 32768) { - var10 = 32768; + if (var9 < 32768) { + var9 = 32768; } - if (var10 > field722) { - field722 += (var10 - field722) / 24; - } else if (var10 < field722) { - field722 += (var10 - field722) / 80; + if (var9 > field717) { + field717 += (var9 - field717) / 24; + } else if (var9 < field717) { + field717 += (var9 - field717) / 80; } - ModelData0.field1840 = MusicPatchPcmStream.getTileHeight(class223.localPlayer.x, class223.localPlayer.y, WorldMapRectangle.plane) - camFollowHeight; + Tiles.field497 = GraphicsObject.getTileHeight(class215.localPlayer.x, class215.localPlayer.y, Player.Scene_plane) - camFollowHeight; } else if (oculusOrbState == 1) { - class1.method15(); - short var34 = -1; + FontName.method5443(); + short var35 = -1; if (KeyHandler.KeyHandler_pressedKeys[33]) { - var34 = 0; + var35 = 0; } else if (KeyHandler.KeyHandler_pressedKeys[49]) { - var34 = 1024; + var35 = 1024; } if (KeyHandler.KeyHandler_pressedKeys[48]) { - if (var34 == 0) { - var34 = 1792; - } else if (var34 == 1024) { - var34 = 1280; + if (var35 == 0) { + var35 = 1792; + } else if (var35 == 1024) { + var35 = 1280; } else { - var34 = 1536; + var35 = 1536; } } else if (KeyHandler.KeyHandler_pressedKeys[50]) { - if (var34 == 0) { - var34 = 256; - } else if (var34 == 1024) { - var34 = 768; + if (var35 == 0) { + var35 = 256; + } else if (var35 == 1024) { + var35 = 768; } else { - var34 = 512; + var35 = 512; } } - byte var35 = 0; + byte var36 = 0; if (KeyHandler.KeyHandler_pressedKeys[35]) { - var35 = -1; + var36 = -1; } else if (KeyHandler.KeyHandler_pressedKeys[51]) { - var35 = 1; + var36 = 1; } - var6 = 0; - if (var34 >= 0 || var35 != 0) { - var6 = KeyHandler.KeyHandler_pressedKeys[81] ? oculusOrbSlowedSpeed : oculusOrbNormalSpeed; - var6 *= 16; - field714 = var34; - field715 = var35; + var5 = 0; + if (var35 >= 0 || var36 != 0) { + var5 = KeyHandler.KeyHandler_pressedKeys[81] ? oculusOrbSlowedSpeed : oculusOrbNormalSpeed; + var5 *= 16; + field709 = var35; + field710 = var36; } - if (field766 < var6) { - field766 += var6 / 8; - if (field766 > var6) { - field766 = var6; + if (field876 < var5) { + field876 += var5 / 8; + if (field876 > var5) { + field876 = var5; } - } else if (field766 > var6) { - field766 = field766 * 9 / 10; + } else if (field876 > var5) { + field876 = field876 * 9 / 10; } - if (field766 > 0) { - var7 = field766 / 16; - if (field714 >= 0) { - var4 = field714 - WorldMapSection2.cameraYaw & 2047; - var8 = Rasterizer3D.Rasterizer3D_sine[var4]; - var9 = Rasterizer3D.Rasterizer3D_cosine[var4]; - ObjectSound.oculusOrbFocalPointX += var8 * var7 / 65536; - class14.oculusOrbFocalPointY += var7 * var9 / 65536; + if (field876 > 0) { + var6 = field876 / 16; + if (field709 >= 0) { + var3 = field709 - WorldMapData_1.cameraYaw & 2047; + var7 = Rasterizer3D.Rasterizer3D_sine[var3]; + var8 = Rasterizer3D.Rasterizer3D_cosine[var3]; + IgnoreList.oculusOrbFocalPointX += var7 * var6 / 65536; + AbstractArchive.oculusOrbFocalPointY += var6 * var8 / 65536; } - if (field715 != 0) { - ModelData0.field1840 += var7 * field715; - if (ModelData0.field1840 > 0) { - ModelData0.field1840 = 0; + if (field710 != 0) { + Tiles.field497 += var6 * field710; + if (Tiles.field497 > 0) { + Tiles.field497 = 0; } } } else { - field714 = -1; - field715 = -1; + field709 = -1; + field710 = -1; } if (KeyHandler.KeyHandler_pressedKeys[13]) { - packetWriter.addNode(InterfaceParent.getPacketBufferNode(ClientPacket.field2283, packetWriter.isaacCipher)); - oculusOrbState = 0; + LoginPacket.method3767(); } } - if (MouseHandler.MouseHandler_currentButton == 4 && WorldMapIcon_1.mouseCam) { - var4 = MouseHandler.MouseHandler_y - mouseCamClickedY; - camAngleDX = var4 * 2; - mouseCamClickedY = var4 != -1 && var4 != 1 ? (mouseCamClickedY + MouseHandler.MouseHandler_y) / 2 : MouseHandler.MouseHandler_y; - var5 = mouseCamClickedX - MouseHandler.MouseHandler_x; - camAngleDY = var5 * 2; - mouseCamClickedX = var5 != -1 && var5 != 1 ? (MouseHandler.MouseHandler_x + mouseCamClickedX) / 2 : MouseHandler.MouseHandler_x; + if (MouseHandler.MouseHandler_currentButton == 4 && WorldMapLabelSize.mouseCam) { + var3 = MouseHandler.MouseHandler_y - mouseCamClickedY; + camAngleDX = var3 * 2; + mouseCamClickedY = var3 != -1 && var3 != 1 ? (MouseHandler.MouseHandler_y + mouseCamClickedY) / 2 : MouseHandler.MouseHandler_y; + var4 = mouseCamClickedX - MouseHandler.MouseHandler_x; + camAngleDY = var4 * 2; + mouseCamClickedX = var4 != -1 && var4 != 1 ? (MouseHandler.MouseHandler_x + mouseCamClickedX) / 2 : MouseHandler.MouseHandler_x; } else { if (KeyHandler.KeyHandler_pressedKeys[96]) { camAngleDY += (-24 - camAngleDY) / 2; @@ -3495,79 +4510,79 @@ public final class Client extends GameShell implements Usernamed { } if (isCameraLocked) { - ChatChannel.method2237(); + Script.method2383(); } - for (var4 = 0; var4 < 5; ++var4) { - int var10002 = field885[var4]++; + for (var3 = 0; var3 < 5; ++var3) { + var10002 = field880[var3]++; } - class197.varcs.tryWrite(); - var4 = WorldMapLabelSize.method197(); - var5 = SecureRandomCallable.method1166(); - if (var4 > 15000 && var5 > 15000) { + class1.varcs.tryWrite(); + var3 = UserComparator4.method3502(); + var4 = class1.method26(); + if (var3 > 15000 && var4 > 15000) { logoutTimer = 250; MouseHandler.MouseHandler_idleCycles = 14500; - var18 = InterfaceParent.getPacketBufferNode(ClientPacket.field2225, packetWriter.isaacCipher); - packetWriter.addNode(var18); + var45 = SoundSystem.getPacketBufferNode(ClientPacket.field2238, packetWriter.isaacCipher); + packetWriter.addNode(var45); } - Tiles.friendSystem.processFriendUpdates(); + PacketWriter.friendSystem.processFriendUpdates(); ++packetWriter.pendingWrites; if (packetWriter.pendingWrites > 50) { - var18 = InterfaceParent.getPacketBufferNode(ClientPacket.field2207, packetWriter.isaacCipher); - packetWriter.addNode(var18); + var45 = SoundSystem.getPacketBufferNode(ClientPacket.field2245, packetWriter.isaacCipher); + packetWriter.addNode(var45); } try { packetWriter.flush(); } catch (IOException var27) { - MouseRecorder.method1213(); + AbstractWorldMapIcon.method652(); } return; } - var25 = var40.widget; - if (var25.childIndex < 0) { + var41 = var44.widget; + if (var41.childIndex < 0) { break; } - var38 = Canvas.getWidget(var25.parentId); - } while(var38 == null || var38.children == null || var25.childIndex >= var38.children.length || var25 != var38.children[var25.childIndex]); + var43 = PacketBufferNode.getWidget(var41.parentId); + } while(var43 == null || var43.children == null || var41.childIndex >= var43.children.length || var41 != var43.children[var41.childIndex]); - ParamDefinition.runScriptEvent(var40); + GrandExchangeOfferAgeComparator.runScriptEvent(var44); } } - var25 = var40.widget; - if (var25.childIndex < 0) { + var41 = var44.widget; + if (var41.childIndex < 0) { break; } - var38 = Canvas.getWidget(var25.parentId); - } while(var38 == null || var38.children == null || var25.childIndex >= var38.children.length || var25 != var38.children[var25.childIndex]); + var43 = PacketBufferNode.getWidget(var41.parentId); + } while(var43 == null || var43.children == null || var41.childIndex >= var43.children.length || var41 != var43.children[var41.childIndex]); - ParamDefinition.runScriptEvent(var40); + GrandExchangeOfferAgeComparator.runScriptEvent(var44); } } - var25 = var40.widget; - if (var25.childIndex < 0) { + var41 = var44.widget; + if (var41.childIndex < 0) { break; } - var38 = Canvas.getWidget(var25.parentId); - } while(var38 == null || var38.children == null || var25.childIndex >= var38.children.length || var25 != var38.children[var25.childIndex]); + var43 = PacketBufferNode.getWidget(var41.parentId); + } while(var43 == null || var43.children == null || var41.childIndex >= var43.children.length || var41 != var43.children[var41.childIndex]); - ParamDefinition.runScriptEvent(var40); + GrandExchangeOfferAgeComparator.runScriptEvent(var44); } } - var30 = InterfaceParent.getPacketBufferNode(ClientPacket.field2196, packetWriter.isaacCipher); + var30 = SoundSystem.getPacketBufferNode(ClientPacket.field2275, packetWriter.isaacCipher); var30.packetBuffer.writeByte(0); var3 = var30.packetBuffer.offset; - class189.performReflectionCheck(var30.packetBuffer); + class32.performReflectionCheck(var30.packetBuffer); var30.packetBuffer.writeLengthByte(var30.packetBuffer.offset - var3); packetWriter.addNode(var30); } @@ -3575,15 +4590,15 @@ public final class Client extends GameShell implements Usernamed { } } - @ObfuscatedName("fs") + @ObfuscatedName("gg") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-6" + signature = "(S)V", + garbageValue = "-18793" ) @Export("resizeJS") void resizeJS() { - int var1 = FloorDecoration.canvasWidth; - int var2 = WallDecoration.canvasHeight; + int var1 = class286.canvasWidth; + int var2 = FloorUnderlayDefinition.canvasHeight; if (super.contentWidth < var1) { var1 = super.contentWidth; } @@ -3592,10 +4607,10 @@ public final class Client extends GameShell implements Usernamed { var2 = super.contentHeight; } - if (AbstractArchive.clientPreferences != null) { + if (ScriptEvent.clientPreferences != null) { try { - Client var3 = ViewportMouse.client; - Object[] var4 = new Object[]{class247.getWindowedMode()}; + Client var3 = WorldMapID.client; + Object[] var4 = new Object[]{WallDecoration.getWindowedMode()}; JSObject.getWindow(var3).call("resize", var4); } catch (Throwable var5) { } @@ -3603,47 +4618,44 @@ public final class Client extends GameShell implements Usernamed { } - @ObfuscatedName("fj") + @ObfuscatedName("gq") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1430506238" + signature = "(B)V", + garbageValue = "100" ) @Export("drawLoggedIn") final void drawLoggedIn() { - int var1; if (rootInterface != -1) { - var1 = rootInterface; - if (WorldMapData_0.loadInterface(var1)) { - ChatChannel.drawModelComponents(UserComparator5.Widget_interfaceComponents[var1], -1); - } + AbstractWorldMapData.method326(rootInterface); } + int var1; for (var1 = 0; var1 < rootWidgetCount; ++var1) { - if (field841[var1]) { - field842[var1] = true; + if (field842[var1]) { + field837[var1] = true; } - field847[var1] = field841[var1]; - field841[var1] = false; + field631[var1] = field842[var1]; + field842[var1] = false; } - field638 = cycle; + field835 = cycle; viewportX = -1; viewportY = -1; - DevicePcmPlayerProvider.field391 = null; + DirectByteArrayCopier.field2476 = null; if (rootInterface != -1) { rootWidgetCount = 0; - ItemContainer.drawWidgets(rootInterface, 0, 0, FloorDecoration.canvasWidth, WallDecoration.canvasHeight, 0, 0, -1); + ScriptEvent.drawWidgets(rootInterface, 0, 0, class286.canvasWidth, FloorUnderlayDefinition.canvasHeight, 0, 0, -1); } Rasterizer2D.Rasterizer2D_resetClip(); if (showMouseCross) { if (mouseCrossColor == 1) { - UrlRequest.crossSprites[mouseCrossState * 20 / 100].drawTransBgAt(mouseCrossX - 8, mouseCrossY - 8); + TextureProvider.crossSprites[mouseCrossState * 20 / 100].drawTransBgAt(mouseCrossX - 8, mouseCrossY - 8); } if (mouseCrossColor == 2) { - UrlRequest.crossSprites[mouseCrossState * 20 / 100 + 4].drawTransBgAt(mouseCrossX - 8, mouseCrossY - 8); + TextureProvider.crossSprites[mouseCrossState * 20 / 100 + 4].drawTransBgAt(mouseCrossX - 8, mouseCrossY - 8); } } @@ -3654,113 +4666,156 @@ public final class Client extends GameShell implements Usernamed { var1 = viewportX; var2 = viewportY; if ((menuOptionsCount >= 2 || isItemSelected != 0 || isSpellSelected) && showMouseOverText) { - var3 = BuddyRankComparator.getNewestMenuIdx(); - String var4; + var3 = class16.getNewestMenuIdx(); + String var12; if (isItemSelected == 1 && menuOptionsCount < 2) { - var4 = "Use" + " " + selectedItemName + " " + "->"; + var12 = "Use" + " " + selectedItemName + " " + "->"; } else if (isSpellSelected && menuOptionsCount < 2) { - var4 = selectedSpellActionName + " " + selectedSpellName + " " + "->"; + var12 = selectedSpellActionName + " " + selectedSpellName + " " + "->"; } else { - var4 = class40.method799(var3); + var12 = class65.method1316(var3); } if (menuOptionsCount > 2) { - var4 = var4 + World.colorStartTag(16777215) + " " + '/' + " " + (menuOptionsCount - 2) + " more options"; + var12 = var12 + AbstractArchive.colorStartTag(16777215) + " " + '/' + " " + (menuOptionsCount - 2) + " more options"; } - class173.fontBold12.drawRandomAlphaAndSpacing(var4, var1 + 4, var2 + 15, 16777215, 0, cycle / 1000); + class43.fontBold12.drawRandomAlphaAndSpacing(var12, var1 + 4, var2 + 15, 16777215, 0, cycle / 1000); } } } else { - var1 = UrlRequester.menuX; - var2 = class51.menuY; - var3 = FriendSystem.menuWidth; - int var13 = WorldMapDecoration.menuHeight; - int var5 = 6116423; - Rasterizer2D.Rasterizer2D_fillRectangle(var1, var2, var3, var13, var5); - Rasterizer2D.Rasterizer2D_fillRectangle(var1 + 1, var2 + 1, var3 - 2, 16, 0); - Rasterizer2D.Rasterizer2D_drawRectangle(var1 + 1, var2 + 18, var3 - 2, var13 - 19, 0); - class173.fontBold12.draw("Choose Option", var1 + 3, var2 + 14, var5, -1); - int var6 = MouseHandler.MouseHandler_x; - int var7 = MouseHandler.MouseHandler_y; - - int var8; - int var9; - int var10; - for (var8 = 0; var8 < menuOptionsCount; ++var8) { - var9 = var2 + (menuOptionsCount - 1 - var8) * 15 + 31; - var10 = 16777215; - if (var6 > var1 && var6 < var3 + var1 && var7 > var9 - 13 && var7 < var9 + 3) { - var10 = 16776960; - } - - class173.fontBold12.draw(class40.method799(var8), var1 + 3, var9, var10, 0); - } - - var8 = UrlRequester.menuX; - var9 = class51.menuY; - var10 = FriendSystem.menuWidth; - int var11 = WorldMapDecoration.menuHeight; - - for (int var12 = 0; var12 < rootWidgetCount; ++var12) { - if (rootWidgetXs[var12] + rootWidgetWidths[var12] > var8 && rootWidgetXs[var12] < var10 + var8 && rootWidgetHeights[var12] + rootWidgetYs[var12] > var9 && rootWidgetYs[var12] < var9 + var11) { - field842[var12] = true; - } - } + WorldMapSection2.method383(); } if (gameDrawingMode == 3) { for (var1 = 0; var1 < rootWidgetCount; ++var1) { - if (field847[var1]) { + if (field631[var1]) { Rasterizer2D.Rasterizer2D_fillRectangleAlpha(rootWidgetXs[var1], rootWidgetYs[var1], rootWidgetWidths[var1], rootWidgetHeights[var1], 16711935, 128); - } else if (field842[var1]) { + } else if (field837[var1]) { Rasterizer2D.Rasterizer2D_fillRectangleAlpha(rootWidgetXs[var1], rootWidgetYs[var1], rootWidgetWidths[var1], rootWidgetHeights[var1], 16711680, 128); } } } - class3.method51(WorldMapRectangle.plane, class223.localPlayer.x, class223.localPlayer.y, field698); - field698 = 0; + var1 = Player.Scene_plane; + var2 = class215.localPlayer.x; + var3 = class215.localPlayer.y; + int var4 = field693; + + for (ObjectSound var5 = (ObjectSound)ObjectSound.objectSounds.last(); var5 != null; var5 = (ObjectSound)ObjectSound.objectSounds.previous()) { + if (var5.soundEffectId != -1 || var5.soundEffectIds != null) { + int var6 = 0; + if (var2 > var5.field1060 * 128) { + var6 += var2 - var5.field1060 * 128; + } else if (var2 < var5.x * 16384) { + var6 += var5.x * 16384 - var2; + } + + if (var3 > var5.field1053 * 128) { + var6 += var3 - var5.field1053 * 128; + } else if (var3 < var5.y * 128) { + var6 += var5.y * 128 - var3; + } + + if (var6 - 64 <= var5.field1052 && field868 != 0 && var1 == var5.plane) { + var6 -= 64; + if (var6 < 0) { + var6 = 0; + } + + int var7 = (var5.field1052 - var6) * field868 / var5.field1052; + Object var10000; + if (var5.stream1 == null) { + if (var5.soundEffectId >= 0) { + var10000 = null; + SoundEffect var8 = SoundEffect.readSoundEffect(NetFileRequest.archive4, var5.soundEffectId, 0); + if (var8 != null) { + RawSound var9 = var8.toRawSound().resample(AbstractWorldMapIcon.decimator); + RawPcmStream var10 = RawPcmStream.createRawPcmStream(var9, 100, var7); + var10.setNumLoops(-1); + FloorUnderlayDefinition.pcmStreamMixer.addSubStream(var10); + var5.stream1 = var10; + } + } + } else { + var5.stream1.method2702(var7); + } + + if (var5.stream2 == null) { + if (var5.soundEffectIds != null && (var5.field1054 -= var4) <= 0) { + int var13 = (int)(Math.random() * (double)var5.soundEffectIds.length); + var10000 = null; + SoundEffect var14 = SoundEffect.readSoundEffect(NetFileRequest.archive4, var5.soundEffectIds[var13], 0); + if (var14 != null) { + RawSound var15 = var14.toRawSound().resample(AbstractWorldMapIcon.decimator); + RawPcmStream var11 = RawPcmStream.createRawPcmStream(var15, 100, var7); + var11.setNumLoops(0); + FloorUnderlayDefinition.pcmStreamMixer.addSubStream(var11); + var5.stream2 = var11; + var5.field1054 = var5.field1057 + (int)(Math.random() * (double)(var5.field1058 - var5.field1057)); + } + } + } else { + var5.stream2.method2702(var7); + if (!var5.stream2.hasNext()) { + var5.stream2 = null; + } + } + } else { + if (var5.stream1 != null) { + FloorUnderlayDefinition.pcmStreamMixer.removeSubStream(var5.stream1); + var5.stream1 = null; + } + + if (var5.stream2 != null) { + FloorUnderlayDefinition.pcmStreamMixer.removeSubStream(var5.stream2); + var5.stream2 = null; + } + } + } + } + + field693 = 0; } - @ObfuscatedName("gh") + @ObfuscatedName("hm") @ObfuscatedSignature( - signature = "(Lcl;I)Z", - garbageValue = "-1809167955" + signature = "(Lcp;I)Z", + garbageValue = "823373866" ) - final boolean method1607(PacketWriter var1) { + final boolean method1720(PacketWriter var1) { AbstractSocket var2 = var1.getSocket(); PacketBuffer var3 = var1.packetBuffer; if (var2 == null) { return false; } else { int var6; - String var31; + String var17; try { int var5; if (var1.serverPacket == null) { - if (var1.field1290) { + if (var1.field1287) { if (!var2.isAvailable(1)) { return false; } var2.read(var1.packetBuffer.array, 0, 1); - var1.field1297 = 0; - var1.field1290 = false; + var1.field1291 = 0; + var1.field1287 = false; } var3.offset = 0; - if (var3.method5395()) { + if (var3.method5586()) { if (!var2.isAvailable(1)) { return false; } var2.read(var1.packetBuffer.array, 1, 1); - var1.field1297 = 0; + var1.field1291 = 0; } - var1.field1290 = true; - ServerPacket[] var4 = class96.ServerPacket_values(); + var1.field1287 = true; + ServerPacket[] var4 = SecureRandomCallable.ServerPacket_values(); var5 = var3.readSmartByteShortIsaac(); if (var5 < 0 || var5 >= var4.length) { throw new IOException(var5 + " " + var3.offset); @@ -3795,321 +4850,20 @@ public final class Client extends GameShell implements Usernamed { var3.offset = 0; var2.read(var3.array, 0, var1.serverPacketLength); - var1.field1297 = 0; - timer.method4936(); - var1.field1301 = var1.field1291; - var1.field1291 = var1.field1300; - var1.field1300 = var1.serverPacket; - if (ServerPacket.field2121 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2295); - var1.serverPacket = null; - return true; - } - - int var7; - int var8; - long var9; - int var16; - if (ServerPacket.field2122 == var1.serverPacket) { - var16 = var3.method5479(); - if (var16 == 65535) { - var16 = -1; - } - - var5 = var3.readUnsignedShort(); - if (var5 == 65535) { - var5 = -1; - } - - var6 = var3.method5482(); - var7 = var3.method5482(); - - for (var8 = var16; var8 <= var5; ++var8) { - var9 = ((long)var7 << 32) + (long)var8; - Node var42 = widgetClickMasks.get(var9); - if (var42 != null) { - var42.remove(); - } - - widgetClickMasks.put(new IntegerNode(var6), var9); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2167 == var1.serverPacket) { - var16 = var3.readUnsignedByte(); - NetCache.method4279(var16); - var1.serverPacket = null; - return true; - } - - Widget var46; - if (ServerPacket.field2095 == var1.serverPacket) { - var16 = var3.method5484(); - var5 = var3.method5484(); - var6 = var3.method5482(); - var46 = Canvas.getWidget(var6); - if (var5 != var46.rawX || var16 != var46.rawY || var46.xAlignment != 0 || var46.yAlignment != 0) { - var46.rawX = var5; - var46.rawY = var16; - var46.xAlignment = 0; - var46.yAlignment = 0; - WorldMapSectionType.invalidateWidget(var46); - this.alignWidget(var46); - if (var46.type == 0) { - GameShell.revalidateWidgetScroll(UserComparator5.Widget_interfaceComponents[var6 >> 16], var46, false); - } - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2155 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2296); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2143 == var1.serverPacket) { - rebootTimer = var3.method5479() * 30; - field833 = cycleCntr; - var1.serverPacket = null; - return true; - } - - boolean var45; - if (ServerPacket.field2109 == var1.serverPacket) { - var45 = var3.readUnsignedByte() == 1; - if (var45) { - class81.field1135 = class30.currentTimeMillis() - var3.readLong(); - TileItem.grandExchangeEvents = new GrandExchangeEvents(var3, true); - } else { - TileItem.grandExchangeEvents = null; - } - - field832 = cycleCntr; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2118 == var1.serverPacket) { - Occluder.method3251(var3.readStringCp1252NullTerminated()); - var1.serverPacket = null; - return true; - } - - int var10; - Widget var18; - int var19; - if (ServerPacket.field2144 == var1.serverPacket) { - var16 = var3.readInt(); - var5 = var3.readUnsignedShort(); - if (var16 < -70000) { - var5 += 32768; - } - - if (var16 >= 0) { - var18 = Canvas.getWidget(var16); - } else { - var18 = null; - } - - if (var18 != null) { - for (var7 = 0; var7 < var18.itemIds.length; ++var7) { - var18.itemIds[var7] = 0; - var18.itemQuantities[var7] = 0; - } - } - - class162.clearItemContainer(var5); - var7 = var3.readUnsignedShort(); - - for (var8 = 0; var8 < var7; ++var8) { - var19 = var3.method5479(); - var10 = var3.method5470(); - if (var10 == 255) { - var10 = var3.method5482(); - } - - if (var18 != null && var8 < var18.itemIds.length) { - var18.itemIds[var8] = var19; - var18.itemQuantities[var8] = var10; - } - - class4.itemContainerSetItem(var5, var8, var19 - 1, var10); - } - - if (var18 != null) { - WorldMapSectionType.invalidateWidget(var18); - } - - class325.method6190(); - field820[++field825 - 1 & 31] = var5 & 32767; - var1.serverPacket = null; - return true; - } - + var1.field1291 = 0; + timer.method5115(); + var1.field1292 = var1.field1286; + var1.field1286 = var1.field1290; + var1.field1290 = var1.serverPacket; if (ServerPacket.field2126 == var1.serverPacket) { - isCameraLocked = true; - class225.field3045 = var3.readUnsignedByte() * 16384; - Clock.field2039 = var3.readUnsignedByte() * 128; - GrandExchangeOfferOwnWorldComparator.field627 = var3.readUnsignedShort(); - MouseRecorder.field572 = var3.readUnsignedByte(); - Messages.field1262 = var3.readUnsignedByte(); - if (Messages.field1262 >= 100) { - GrandExchangeOfferOwnWorldComparator.cameraX = class225.field3045 * 128 + 64; - WorldMapIcon_1.cameraZ = Clock.field2039 * 16384 + 64; - Varcs.cameraY = MusicPatchPcmStream.getTileHeight(GrandExchangeOfferOwnWorldComparator.cameraX, WorldMapIcon_1.cameraZ, WorldMapRectangle.plane) - GrandExchangeOfferOwnWorldComparator.field627; - } - + rebootTimer = var3.method5646() * 30; + field834 = cycleCntr; var1.serverPacket = null; return true; } - if (ServerPacket.field2149 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2302); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2142 == var1.serverPacket) { - var16 = var3.readInt(); - var5 = var3.readInt(); - var6 = class4.getGcDuration(); - PacketBufferNode var48 = InterfaceParent.getPacketBufferNode(ClientPacket.field2199, packetWriter.isaacCipher); - var48.packetBuffer.method5468(var6); - var48.packetBuffer.writeInt(var16); - var48.packetBuffer.method5489(var5); - var48.packetBuffer.method5461(GameShell.fps); - packetWriter.addNode(var48); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2164 == var1.serverPacket) { - class325.method6190(); - weight = var3.readShort(); - field833 = cycleCntr; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2157 == var1.serverPacket) { - var16 = var3.readInt(); - if (var16 != field718) { - field718 = var16; - UserComparator4.method3350(); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2115 == var1.serverPacket) { - if (Varps.clanChat != null) { - Varps.clanChat.method5166(var3); - } - - class185.method3593(); - var1.serverPacket = null; - return true; - } - - InterfaceParent var17; - Widget var20; - if (ServerPacket.field2166 == var1.serverPacket) { - var16 = var3.method5482(); - var5 = var3.readInt(); - InterfaceParent var52 = (InterfaceParent)interfaceParents.get((long)var5); - var17 = (InterfaceParent)interfaceParents.get((long)var16); - if (var17 != null) { - FontName.closeInterface(var17, var52 == null || var17.group != var52.group); - } - - if (var52 != null) { - var52.remove(); - interfaceParents.put(var52, (long)var16); - } - - var20 = Canvas.getWidget(var5); - if (var20 != null) { - WorldMapSectionType.invalidateWidget(var20); - } - - var20 = Canvas.getWidget(var16); - if (var20 != null) { - WorldMapSectionType.invalidateWidget(var20); - GameShell.revalidateWidgetScroll(UserComparator5.Widget_interfaceComponents[var20.id >>> 16], var20, true); - } - - if (rootInterface != -1) { - class40.runIntfCloseListeners(rootInterface, 1); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2156 == var1.serverPacket) { - Tiles.friendSystem.readUpdate(var3, var1.serverPacketLength); - field744 = cycleCntr; - var1.serverPacket = null; - return true; - } - - long var12; - long var21; - long var23; - String var36; - if (ServerPacket.field2139 == var1.serverPacket) { - var36 = var3.readStringCp1252NullTerminated(); - var21 = var3.readLong(); - var23 = (long)var3.readUnsignedShort(); - var9 = (long)var3.readMedium(); - PlayerType var11 = (PlayerType)NetSocket.findEnumerated(class226.PlayerType_values(), var3.readUnsignedByte()); - var12 = var9 + (var23 << 32); - boolean var44 = false; - - for (int var15 = 0; var15 < 100; ++var15) { - if (field889[var15] == var12) { - var44 = true; - break; - } - } - - if (var11.isUser && Tiles.friendSystem.isIgnored(new Username(var36, WorldMapSection1.loginType))) { - var44 = true; - } - - if (!var44 && field634 == 0) { - field889[field856] = var12; - field856 = (field856 + 1) % 100; - String var25 = AbstractFont.escapeBrackets(NetSocket.method3471(class65.method1250(var3))); - if (var11.modIcon != -1) { - WorldMapData_1.addChatMessage(9, class247.method4455(var11.modIcon) + var36, var25, World.base37DecodeLong(var21)); - } else { - WorldMapData_1.addChatMessage(9, var36, var25, World.base37DecodeLong(var21)); - } - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2165 == var1.serverPacket) { - var3.offset += 28; - if (var3.checkCrc()) { - ArchiveDisk.method5801(var3, var3.offset - 28); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2145 == var1.serverPacket) { + int var16; + if (ServerPacket.field2129 == var1.serverPacket) { var16 = var3.readUnsignedByte(); if (var3.readUnsignedByte() == 0) { grandExchangeOffers[var16] = new GrandExchangeOffer(); @@ -4119,275 +4873,58 @@ public final class Client extends GameShell implements Usernamed { grandExchangeOffers[var16] = new GrandExchangeOffer(var3, false); } - field831 = cycleCntr; + field826 = cycleCntr; var1.serverPacket = null; return true; } - if (ServerPacket.field2106 == var1.serverPacket) { - var16 = var3.method5504(); - var5 = var3.method5492(); - var18 = Canvas.getWidget(var5); - if (var16 != var18.sequenceId || var16 == -1) { - var18.sequenceId = var16; - var18.modelFrame = 0; - var18.modelFrameCycle = 0; - WorldMapSectionType.invalidateWidget(var18); + int var7; + int var8; + long var9; + if (ServerPacket.field2176 == var1.serverPacket) { + var16 = var3.method5648(); + if (var16 == 65535) { + var16 = -1; } - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2170 == var1.serverPacket) { - var16 = var3.readInt(); - var5 = var3.method5482(); - var6 = var3.method5479(); + var5 = var3.method5796(); + var6 = var3.readUnsignedShort(); if (var6 == 65535) { var6 = -1; } - var46 = Canvas.getWidget(var16); - ItemDefinition var50; - if (!var46.isIf3) { - if (var6 == -1) { - var46.modelType = 0; - var1.serverPacket = null; - return true; + var7 = var3.method5656(); + + for (var8 = var16; var8 <= var6; ++var8) { + var9 = ((long)var7 << 32) + (long)var8; + Node var44 = widgetClickMasks.get(var9); + if (var44 != null) { + var44.remove(); } - var50 = Occluder.ItemDefinition_get(var6); - var46.modelType = 4; - var46.modelId = var6; - var46.modelAngleX = var50.xan2d; - var46.modelAngleY = var50.yan2d; - var46.modelZoom = var50.zoom2d * 100 / var5; - WorldMapSectionType.invalidateWidget(var46); + widgetClickMasks.put(new IntegerNode(var5), var9); + } + + var1.serverPacket = null; + return true; + } + + boolean var46; + if (ServerPacket.field2122 == var1.serverPacket) { + var46 = var3.readUnsignedByte() == 1; + if (var46) { + Message.field584 = PlayerAppearance.currentTimeMillis() - var3.readLong(); + WorldMapData_1.grandExchangeEvents = new GrandExchangeEvents(var3, true); } else { - var46.itemId = var6; - var46.itemQuantity = var5; - var50 = Occluder.ItemDefinition_get(var6); - var46.modelAngleX = var50.xan2d; - var46.modelAngleY = var50.yan2d; - var46.modelAngleZ = var50.zan2d; - var46.modelOffsetX = var50.offsetX2d; - var46.modelOffsetY = var50.offsetY2d; - var46.modelZoom = var50.zoom2d; - if (var50.isStackable == 1) { - var46.itemQuantityMode = 1; - } else { - var46.itemQuantityMode = 2; - } - - if (var46.field2667 > 0) { - var46.modelZoom = var46.modelZoom * 32 / var46.field2667; - } else if (var46.rawWidth > 0) { - var46.modelZoom = var46.modelZoom * 32 / var46.rawWidth; - } - - WorldMapSectionType.invalidateWidget(var46); + WorldMapData_1.grandExchangeEvents = null; } + field652 = cycleCntr; var1.serverPacket = null; return true; } - if (ServerPacket.field2141 == var1.serverPacket) { - var16 = var3.method5492(); - var5 = var3.method5480(); - var18 = Canvas.getWidget(var16); - if (var18.modelType != 2 || var5 != var18.modelId) { - var18.modelType = 2; - var18.modelId = var5; - WorldMapSectionType.invalidateWidget(var18); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2114 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2301); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2129 == var1.serverPacket) { - var36 = var3.readStringCp1252NullTerminated(); - var21 = (long)var3.readUnsignedShort(); - var23 = (long)var3.readMedium(); - PlayerType var26 = (PlayerType)NetSocket.findEnumerated(class226.PlayerType_values(), var3.readUnsignedByte()); - long var27 = (var21 << 32) + var23; - boolean var29 = false; - - for (int var13 = 0; var13 < 100; ++var13) { - if (field889[var13] == var27) { - var29 = true; - break; - } - } - - if (Tiles.friendSystem.isIgnored(new Username(var36, WorldMapSection1.loginType))) { - var29 = true; - } - - if (!var29 && field634 == 0) { - field889[field856] = var27; - field856 = (field856 + 1) % 100; - String var30 = AbstractFont.escapeBrackets(NetSocket.method3471(class65.method1250(var3))); - byte var14; - if (var26.isPrivileged) { - var14 = 7; - } else { - var14 = 3; - } - - if (var26.modIcon != -1) { - class210.addGameMessage(var14, class247.method4455(var26.modIcon) + var36, var30); - } else { - class210.addGameMessage(var14, var36, var30); - } - } - - var1.serverPacket = null; - return true; - } - - Widget var55; - if (ServerPacket.field2103 == var1.serverPacket) { - var16 = var3.method5482(); - var55 = Canvas.getWidget(var16); - - for (var6 = 0; var6 < var55.itemIds.length; ++var6) { - var55.itemIds[var6] = -1; - var55.itemIds[var6] = 0; - } - - WorldMapSectionType.invalidateWidget(var55); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2159 == var1.serverPacket) { - InterfaceParent.updateNpcs(true, var3); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2137 == var1.serverPacket) { - var16 = var3.method5561(); - var5 = var3.method5479(); - Varps.Varps_temp[var5] = var16; - if (Varps.Varps_main[var5] != var16) { - Varps.Varps_main[var5] = var16; - } - - NetSocket.method3472(var5); - field782[++field823 - 1 & 31] = var5; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2124 == var1.serverPacket) { - class40.field326 = var3.method5471(); - WorldMapSection2.field195 = var3.readUnsignedByte(); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2146 == var1.serverPacket) { - var16 = var3.readUnsignedByte(); - var5 = var3.readUnsignedByte(); - var6 = var3.readUnsignedByte(); - var7 = var3.readUnsignedByte(); - field835[var16] = true; - field882[var16] = var5; - field883[var16] = var6; - field884[var16] = var7; - field885[var16] = 0; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2175 == var1.serverPacket) { - var16 = var3.method5511(); - var31 = var3.readStringCp1252NullTerminated(); - var6 = var3.method5470(); - if (var6 >= 1 && var6 <= 8) { - if (var31.equalsIgnoreCase("null")) { - var31 = null; - } - - playerMenuActions[var6 - 1] = var31; - playerOptionsPriorities[var6 - 1] = var16 == 0; - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2177 == var1.serverPacket) { - World var39 = new World(); - var39.host = var3.readStringCp1252NullTerminated(); - var39.id = var3.readUnsignedShort(); - var5 = var3.readInt(); - var39.properties = var5; - MouseRecorder.updateGameState(45); - var2.close(); - var2 = null; - class4.changeWorld(var39); - var1.serverPacket = null; - return false; - } - - if (ServerPacket.field2162 == var1.serverPacket) { - Tiles.friendSystem.method1864(); - field744 = cycleCntr; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2130 == var1.serverPacket) { - var16 = var3.readUnsignedByte(); - SequenceDefinition.forceDisconnect(var16); - var1.serverPacket = null; - return false; - } - - if (ServerPacket.field2171 == var1.serverPacket) { - isCameraLocked = false; - - for (var16 = 0; var16 < 5; ++var16) { - field835[var16] = false; - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2173 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2297); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2168 == var1.serverPacket) { - if (var1.serverPacketLength == 0) { - Varps.clanChat = null; - } else { - if (Varps.clanChat == null) { - Varps.clanChat = new ClanChat(WorldMapSection1.loginType, ViewportMouse.client); - } - - Varps.clanChat.readUpdate(var3); - } - - class185.method3593(); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2174 == var1.serverPacket) { + if (ServerPacket.field2140 == var1.serverPacket) { hintArrowType = var3.readUnsignedByte(); if (hintArrowType == 1) { hintArrowNpcIndex = var3.readUnsignedShort(); @@ -4422,7 +4959,7 @@ public final class Client extends GameShell implements Usernamed { hintArrowType = 2; hintArrowX = var3.readUnsignedShort(); hintArrowY = var3.readUnsignedShort(); - hintArrowHeight = var3.readUnsignedByte() * 2; + hintArrowHeight = var3.readUnsignedByte() * 4; } if (hintArrowType == 10) { @@ -4433,81 +4970,70 @@ public final class Client extends GameShell implements Usernamed { return true; } - if (ServerPacket.field2152 == var1.serverPacket) { - var16 = var3.method5480(); - WorldMapAreaData.method717(var16); - field820[++field825 - 1 & 31] = var16 & 32767; + String var50; + if (ServerPacket.field2162 == var1.serverPacket) { + byte[] var40 = new byte[var1.serverPacketLength]; + var3.method5558(var40, 0, var40.length); + Buffer var54 = new Buffer(var40); + var50 = var54.readStringCp1252NullTerminated(); + class2.openURL(var50, true, false); var1.serverPacket = null; return true; } - if (ServerPacket.field2183 == var1.serverPacket) { - var16 = var3.method5480(); - rootInterface = var16; - this.resizeRoot(false); - WorldMapManager.Widget_resetModelFrames(var16); - class186.runWidgetOnLoadListener(rootInterface); + if (ServerPacket.field2111 == var1.serverPacket) { + AbstractWorldMapData.updateNpcs(true, var3); + var1.serverPacket = null; + return true; + } - for (var5 = 0; var5 < 100; ++var5) { - field841[var5] = true; + if (ServerPacket.field2095 == var1.serverPacket) { + Clock.loadRegions(true, var1.packetBuffer); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2127 == var1.serverPacket) { + var16 = var3.readInt(); + if (var16 != field799) { + field799 = var16; + WorldMapSection1.method650(); } var1.serverPacket = null; return true; } - String var51; - if (ServerPacket.field2097 == var1.serverPacket) { - var16 = var3.readUShortSmart(); - boolean var43 = var3.readUnsignedByte() == 1; - var51 = ""; - boolean var41 = false; - if (var43) { - var51 = var3.readStringCp1252NullTerminated(); - if (Tiles.friendSystem.isIgnored(new Username(var51, WorldMapSection1.loginType))) { - var41 = true; - } - } - - String var49 = var3.readStringCp1252NullTerminated(); - if (!var41) { - class210.addGameMessage(var16, var51, var49); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2161 == var1.serverPacket) { - PlayerType.loadRegions(false, var1.packetBuffer); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2098 == var1.serverPacket) { - byte[] var38 = new byte[var1.serverPacketLength]; - var3.method5400(var38, 0, var38.length); - Buffer var59 = new Buffer(var38); - var51 = var59.readStringCp1252NullTerminated(); - ArchiveDiskActionHandler.openURL(var51, true, false); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2132 == var1.serverPacket) { - var45 = var3.readUnsignedByte() == 1; - var5 = var3.method5482(); - var18 = Canvas.getWidget(var5); - if (var45 != var18.isHidden) { - var18.isHidden = var45; - WorldMapSectionType.invalidateWidget(var18); - } - + if (ServerPacket.field2135 == var1.serverPacket) { + class319.updatePlayers(var3, var1.serverPacketLength); + BoundaryObject.method3394(); var1.serverPacket = null; return true; } + Widget var48; if (ServerPacket.field2134 == var1.serverPacket) { + var16 = var3.readUnsignedShort(); + var5 = var3.method5796(); + var48 = PacketBufferNode.getWidget(var5); + if (var48.modelType != 1 || var16 != var48.modelId) { + var48.modelType = 1; + var48.modelId = var16; + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2124 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2295); + var1.serverPacket = null; + return true; + } + + int var19; + if (ServerPacket.field2104 == var1.serverPacket) { var16 = var3.readInt(); var5 = var3.readUnsignedShort(); if (var16 < -70000) { @@ -4515,12 +5041,12 @@ public final class Client extends GameShell implements Usernamed { } if (var16 >= 0) { - var18 = Canvas.getWidget(var16); + var48 = PacketBufferNode.getWidget(var16); } else { - var18 = null; + var48 = null; } - for (; var3.offset < var1.serverPacketLength; class4.itemContainerSetItem(var5, var7, var8 - 1, var19)) { + for (; var3.offset < var1.serverPacketLength; WorldMapCacheName.itemContainerSetItem(var5, var7, var8 - 1, var19)) { var7 = var3.readUShortSmart(); var8 = var3.readUnsignedShort(); var19 = 0; @@ -4531,198 +5057,39 @@ public final class Client extends GameShell implements Usernamed { } } - if (var18 != null && var7 >= 0 && var7 < var18.itemIds.length) { - var18.itemIds[var7] = var8; - var18.itemQuantities[var7] = var19; + if (var48 != null && var7 >= 0 && var7 < var48.itemIds.length) { + var48.itemIds[var7] = var8; + var48.itemQuantities[var7] = var19; } } - if (var18 != null) { - WorldMapSectionType.invalidateWidget(var18); - } - - class325.method6190(); - field820[++field825 - 1 & 31] = var5 & 32767; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2158 == var1.serverPacket) { - var16 = var3.method5561(); - var5 = var3.method5480(); - var18 = Canvas.getWidget(var16); - if (var18.modelType != 1 || var5 != var18.modelId) { - var18.modelType = 1; - var18.modelId = var5; - WorldMapSectionType.invalidateWidget(var18); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2135 == var1.serverPacket) { - var16 = var3.readUnsignedShort(); - var5 = var3.method5482(); - var6 = var16 >> 10 & 31; - var7 = var16 >> 5 & 31; - var8 = var16 & 31; - var19 = (var7 << 11) + (var6 << 19) + (var8 << 3); - Widget var57 = Canvas.getWidget(var5); - if (var19 != var57.color) { - var57.color = var19; - WorldMapSectionType.invalidateWidget(var57); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2102 == var1.serverPacket) { - var16 = var3.readUnsignedShort(); - var5 = var3.method5480(); - var6 = var3.method5647(); - var7 = var3.readInt(); - var20 = Canvas.getWidget(var7); - if (var5 != var20.modelAngleX || var6 != var20.modelAngleY || var16 != var20.modelZoom) { - var20.modelAngleX = var5; - var20.modelAngleY = var6; - var20.modelZoom = var16; - WorldMapSectionType.invalidateWidget(var20); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2101 == var1.serverPacket) { - tradeChatMode = var3.method5511(); - publicChatMode = var3.method5470(); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2140 == var1.serverPacket) { - class325.method6190(); - var16 = var3.method5561(); - var5 = var3.method5470(); - var6 = var3.method5511(); - experience[var5] = var16; - currentLevels[var5] = var6; - levels[var5] = 1; - - for (var7 = 0; var7 < 98; ++var7) { - if (var16 >= Skills.Skills_experienceTable[var7]) { - levels[var5] = var7 + 2; - } - } - - changedSkills[++changedSkillsCount - 1 & 31] = var5; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2150 == var1.serverPacket) { - minimapState = var3.readUnsignedByte(); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2107 == var1.serverPacket) { - var16 = var3.method5480(); - var5 = var3.method5492(); - var6 = var3.method5647(); - var46 = Canvas.getWidget(var5); - var46.field2601 = var16 + (var6 << 16); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2151 == var1.serverPacket) { - var36 = var3.readStringCp1252NullTerminated(); - Object[] var58 = new Object[var36.length() + 1]; - - for (var6 = var36.length() - 1; var6 >= 0; --var6) { - if (var36.charAt(var6) == 's') { - var58[var6 + 1] = var3.readStringCp1252NullTerminated(); - } else { - var58[var6 + 1] = new Integer(var3.readInt()); - } - } - - var58[0] = new Integer(var3.readInt()); - ScriptEvent var47 = new ScriptEvent(); - var47.args = var58; - ParamDefinition.runScriptEvent(var47); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2163 == var1.serverPacket) { - isCameraLocked = true; - GameShell.field455 = var3.readUnsignedByte() * 128; - SecureRandomFuture.field1228 = var3.readUnsignedByte() * 128; - class14.field90 = var3.readUnsignedShort(); - class80.field1126 = var3.readUnsignedByte(); - ScriptEvent.field570 = var3.readUnsignedByte(); - if (ScriptEvent.field570 >= 100) { - var16 = GameShell.field455 * 16384 + 64; - var5 = SecureRandomFuture.field1228 * 16384 + 64; - var6 = MusicPatchPcmStream.getTileHeight(var16, var5, WorldMapRectangle.plane) - class14.field90; - var7 = var16 - GrandExchangeOfferOwnWorldComparator.cameraX; - var8 = var6 - Varcs.cameraY; - var19 = var5 - WorldMapIcon_1.cameraZ; - var10 = (int)Math.sqrt((double)(var19 * var19 + var7 * var7)); - IgnoreList.cameraPitch = (int)(Math.atan2((double)var8, (double)var10) * 325.949D) & 2047; - WorldMapSection2.cameraYaw = (int)(Math.atan2((double)var7, (double)var19) * -325.949D) & 2047; - if (IgnoreList.cameraPitch < 128) { - IgnoreList.cameraPitch = 128; - } - - if (IgnoreList.cameraPitch > 383) { - IgnoreList.cameraPitch = 383; - } + if (var48 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var48); } + BoundaryObject.method3393(); + field816[++field820 - 1 & 31] = var5 & 32767; var1.serverPacket = null; return true; } if (ServerPacket.field2136 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2300); + var16 = var3.method5646(); + WorldMapIcon_0.method252(var16); + field816[++field820 - 1 & 31] = var16 & 32767; var1.serverPacket = null; return true; } - if (ServerPacket.field2125 == var1.serverPacket) { + if (ServerPacket.field2167 == var1.serverPacket) { var16 = var3.readInt(); - var5 = var3.readUnsignedByte(); - var6 = var3.readUnsignedShort(); - var17 = (InterfaceParent)interfaceParents.get((long)var16); - if (var17 != null) { - FontName.closeInterface(var17, var6 != var17.group); - } - - WorldMapManager.method679(var16, var6, var5); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2172 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2299); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2180 == var1.serverPacket) { - var16 = var3.readInt(); - InterfaceParent var56 = (InterfaceParent)interfaceParents.get((long)var16); - if (var56 != null) { - FontName.closeInterface(var56, true); + InterfaceParent var53 = (InterfaceParent)interfaceParents.get((long)var16); + if (var53 != null) { + GrandExchangeOfferOwnWorldComparator.closeInterface(var53, true); } if (meslayerContinueWidget != null) { - WorldMapSectionType.invalidateWidget(meslayerContinueWidget); + GrandExchangeOfferAgeComparator.invalidateWidget(meslayerContinueWidget); meslayerContinueWidget = null; } @@ -4730,199 +5097,45 @@ public final class Client extends GameShell implements Usernamed { return true; } - if (ServerPacket.field2117 == var1.serverPacket) { - var16 = var3.method5480(); - byte var40 = var3.readByte(); - Varps.Varps_temp[var16] = var40; - if (Varps.Varps_main[var16] != var40) { - Varps.Varps_main[var16] = var40; - } - - NetSocket.method3472(var16); - field782[++field823 - 1 & 31] = var16; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2182 == var1.serverPacket) { - class325.method6190(); - runEnergy = var3.readUnsignedByte(); - field833 = cycleCntr; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2176 == var1.serverPacket) { - var16 = var3.method5482(); - var55 = Canvas.getWidget(var16); - var55.modelType = 3; - var55.modelId = class223.localPlayer.appearance.getChatHeadId(); - WorldMapSectionType.invalidateWidget(var55); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2160 == var1.serverPacket) { - WorldMapSection2.field195 = var3.method5511(); - class40.field326 = var3.method5471(); - - for (var16 = class40.field326; var16 < class40.field326 + 8; ++var16) { - for (var5 = WorldMapSection2.field195; var5 < WorldMapSection2.field195 + 8; ++var5) { - if (groundItems[WorldMapRectangle.plane][var16][var5] != null) { - groundItems[WorldMapRectangle.plane][var16][var5] = null; - WorldMapCacheName.updateItemPile(var16, var5); - } - } - } - - for (PendingSpawn var37 = (PendingSpawn)pendingSpawns.last(); var37 != null; var37 = (PendingSpawn)pendingSpawns.previous()) { - if (var37.x >= class40.field326 && var37.x < class40.field326 + 8 && var37.y >= WorldMapSection2.field195 && var37.y < WorldMapSection2.field195 + 8 && var37.plane == WorldMapRectangle.plane) { - var37.hitpoints = 0; - } - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2123 == var1.serverPacket) { - class185.readReflectionCheck(var3, var1.serverPacketLength); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2169 == var1.serverPacket) { - for (var16 = 0; var16 < Varps.Varps_main.length; ++var16) { - if (Varps.Varps_temp[var16] != Varps.Varps_main[var16]) { - Varps.Varps_main[var16] = Varps.Varps_temp[var16]; - NetSocket.method3472(var16); - field782[++field823 - 1 & 31] = var16; - } - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2154 == var1.serverPacket) { - Tiles.friendSystem.ignoreList.read(var3, var1.serverPacketLength); - class195.FriendSystem_invalidateIgnoreds(); - field744 = cycleCntr; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2148 == var1.serverPacket) { - InterfaceParent.updateNpcs(false, var3); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2116 == var1.serverPacket) { - PlayerType.loadRegions(true, var1.packetBuffer); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2127 == var1.serverPacket) { - var16 = var3.method5482(); - var31 = var3.readStringCp1252NullTerminated(); - var18 = Canvas.getWidget(var16); - if (!var31.equals(var18.text)) { - var18.text = var31; - WorldMapSectionType.invalidateWidget(var18); - } - - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2100 == var1.serverPacket) { - var16 = var3.readUnsignedShort(); - if (var16 == 65535) { - var16 = -1; - } - - MusicPatchNode2.playSong(var16); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2178 == var1.serverPacket) { - var16 = var3.method5647(); - if (var16 == 65535) { - var16 = -1; - } - - var5 = var3.method5488(); - ClientPacket.playSoundJingle(var16, var5); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2096 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2298); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2099 == var1.serverPacket) { - for (var16 = 0; var16 < VarpDefinition.VarpDefinition_fileCount; ++var16) { - VarpDefinition var54 = AbstractWorldMapData.method288(var16); - if (var54 != null) { - Varps.Varps_temp[var16] = 0; - Varps.Varps_main[var16] = 0; - } - } - - class325.method6190(); - field823 += 32; - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2104 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2304); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2133 == var1.serverPacket) { + long var12; + int var21; + InterfaceParent var55; + if (ServerPacket.field2098 == var1.serverPacket) { var16 = var3.offset + var1.serverPacketLength; var5 = var3.readUnsignedShort(); var6 = var3.readUnsignedShort(); if (var5 != rootInterface) { rootInterface = var5; this.resizeRoot(false); - WorldMapManager.Widget_resetModelFrames(rootInterface); - class186.runWidgetOnLoadListener(rootInterface); + WorldMapLabel.Widget_resetModelFrames(rootInterface); + FaceNormal.runWidgetOnLoadListener(rootInterface); for (var7 = 0; var7 < 100; ++var7) { - field841[var7] = true; + field842[var7] = true; } } - InterfaceParent var32; - for (; var6-- > 0; var32.field552 = true) { + InterfaceParent var43; + for (; var6-- > 0; var43.field545 = true) { var7 = var3.readInt(); var8 = var3.readUnsignedShort(); var19 = var3.readUnsignedByte(); - var32 = (InterfaceParent)interfaceParents.get((long)var7); - if (var32 != null && var8 != var32.group) { - FontName.closeInterface(var32, true); - var32 = null; + var43 = (InterfaceParent)interfaceParents.get((long)var7); + if (var43 != null && var8 != var43.group) { + GrandExchangeOfferOwnWorldComparator.closeInterface(var43, true); + var43 = null; } - if (var32 == null) { - var32 = WorldMapManager.method679(var7, var8, var19); + if (var43 == null) { + var43 = WorldMapDecoration.method385(var7, var8, var19); } } - for (var17 = (InterfaceParent)interfaceParents.first(); var17 != null; var17 = (InterfaceParent)interfaceParents.next()) { - if (var17.field552) { - var17.field552 = false; + for (var55 = (InterfaceParent)interfaceParents.first(); var55 != null; var55 = (InterfaceParent)interfaceParents.next()) { + if (var55.field545) { + var55.field545 = false; } else { - FontName.closeInterface(var17, true); + GrandExchangeOfferOwnWorldComparator.closeInterface(var55, true); } } @@ -4932,11 +5145,11 @@ public final class Client extends GameShell implements Usernamed { var7 = var3.readInt(); var8 = var3.readUnsignedShort(); var19 = var3.readUnsignedShort(); - var10 = var3.readInt(); + var21 = var3.readInt(); - for (int var33 = var8; var33 <= var19; ++var33) { - var12 = (long)var33 + ((long)var7 << 32); - widgetClickMasks.put(new IntegerNode(var10), var12); + for (int var22 = var8; var22 <= var19; ++var22) { + var12 = ((long)var7 << 32) + (long)var22; + widgetClickMasks.put(new IntegerNode(var21), var12); } } @@ -4944,66 +5157,130 @@ public final class Client extends GameShell implements Usernamed { return true; } - if (ServerPacket.field2179 == var1.serverPacket) { - var36 = var3.readStringCp1252NullTerminated(); - var31 = AbstractFont.escapeBrackets(NetSocket.method3471(class65.method1250(var3))); - class210.addGameMessage(6, var36, var31); - var1.serverPacket = null; - return true; - } + Widget var23; + if (ServerPacket.field2169 == var1.serverPacket) { + var16 = var3.method5796(); + var5 = var3.readInt(); + InterfaceParent var57 = (InterfaceParent)interfaceParents.get((long)var16); + var55 = (InterfaceParent)interfaceParents.get((long)var5); + if (var55 != null) { + GrandExchangeOfferOwnWorldComparator.closeInterface(var55, var57 == null || var55.group != var57.group); + } - if (ServerPacket.field2111 == var1.serverPacket) { - DynamicObject.logOut(); - var1.serverPacket = null; - return false; - } + if (var57 != null) { + var57.remove(); + interfaceParents.put(var57, (long)var5); + } - if (ServerPacket.field2128 == var1.serverPacket) { - var16 = var3.readUnsignedShort(); - var5 = var3.readUnsignedByte(); - var6 = var3.readUnsignedShort(); - Message.queueSoundEffect(var16, var5, var6); - var1.serverPacket = null; - return true; - } + var23 = PacketBufferNode.getWidget(var16); + if (var23 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var23); + } - if (ServerPacket.field2113 == var1.serverPacket) { - WorldMapManager.updatePlayers(var3, var1.serverPacketLength); - Archive.method4250(); - var1.serverPacket = null; - return true; - } + var23 = PacketBufferNode.getWidget(var5); + if (var23 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var23); + class43.revalidateWidgetScroll(Widget.Widget_interfaceComponents[var23.id >>> 16], var23, true); + } - if (ServerPacket.field2105 == var1.serverPacket) { - GrandExchangeOfferTotalQuantityComparator.method105(class185.field2303); - var1.serverPacket = null; - return true; - } - - if (ServerPacket.field2153 == var1.serverPacket) { if (rootInterface != -1) { - class40.runIntfCloseListeners(rootInterface, 0); + AttackOption.runIntfCloseListeners(rootInterface, 1); } var1.serverPacket = null; return true; } - if (ServerPacket.field2110 == var1.serverPacket) { - class40.field326 = var3.method5471(); - WorldMapSection2.field195 = var3.readUnsignedByte(); + if (ServerPacket.field2159 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2297); + var1.serverPacket = null; + return true; + } - while (var3.offset < var1.serverPacketLength) { - var16 = var3.readUnsignedByte(); - class185 var53 = WorldMapDecoration.method348()[var16]; - GrandExchangeOfferTotalQuantityComparator.method105(var53); + long var24; + long var26; + String var36; + if (ServerPacket.field2148 == var1.serverPacket) { + var36 = var3.readStringCp1252NullTerminated(); + var24 = var3.readLong(); + var26 = (long)var3.readUnsignedShort(); + var9 = (long)var3.readMedium(); + PlayerType var11 = (PlayerType)WorldMapIcon_1.findEnumerated(class51.PlayerType_values(), var3.readUnsignedByte()); + var12 = (var26 << 32) + var9; + boolean var45 = false; + + for (int var15 = 0; var15 < 100; ++var15) { + if (field852[var15] == var12) { + var45 = true; + break; + } + } + + if (var11.isUser && PacketWriter.friendSystem.isIgnored(new Username(var36, class60.loginType))) { + var45 = true; + } + + if (!var45 && field745 == 0) { + field852[field721] = var12; + field721 = (field721 + 1) % 100; + String var28 = AbstractFont.escapeBrackets(class222.method4274(class4.method90(var3))); + if (var11.modIcon != -1) { + WorldMapLabel.addChatMessage(9, GrandExchangeEvent.method122(var11.modIcon) + var36, var28, WorldMapDecoration.base37DecodeLong(var24)); + } else { + WorldMapLabel.addChatMessage(9, var36, var28, WorldMapDecoration.base37DecodeLong(var24)); + } } var1.serverPacket = null; return true; } - if (ServerPacket.field2147 == var1.serverPacket) { + if (ServerPacket.field2096 == var1.serverPacket) { + var16 = var3.readUnsignedByte(); + var5 = var3.readUnsignedByte(); + var6 = var3.readUnsignedByte(); + var7 = var3.readUnsignedByte(); + field641[var16] = true; + field877[var16] = var5; + field795[var16] = var6; + field879[var16] = var7; + field880[var16] = 0; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2091 == var1.serverPacket) { + BoundaryObject.method3393(); + weight = var3.readShort(); + field834 = cycleCntr; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2161 == var1.serverPacket) { + SpriteMask.field2501 = var3.method5622(); + GrandExchangeOffer.field61 = var3.method5622(); + + for (var16 = SpriteMask.field2501; var16 < SpriteMask.field2501 + 8; ++var16) { + for (var5 = GrandExchangeOffer.field61; var5 < GrandExchangeOffer.field61 + 8; ++var5) { + if (groundItems[Player.Scene_plane][var16][var5] != null) { + groundItems[Player.Scene_plane][var16][var5] = null; + class4.updateItemPile(var16, var5); + } + } + } + + for (PendingSpawn var38 = (PendingSpawn)pendingSpawns.last(); var38 != null; var38 = (PendingSpawn)pendingSpawns.previous()) { + if (var38.x >= SpriteMask.field2501 && var38.x < SpriteMask.field2501 + 8 && var38.y >= GrandExchangeOffer.field61 && var38.y < GrandExchangeOffer.field61 + 8 && var38.plane == Player.Scene_plane) { + var38.hitpoints = 0; + } + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2109 == var1.serverPacket) { for (var16 = 0; var16 < players.length; ++var16) { if (players[var16] != null) { players[var16].sequence = -1; @@ -5020,7 +5297,533 @@ public final class Client extends GameShell implements Usernamed { return true; } + Widget var20; + if (ServerPacket.field2141 == var1.serverPacket) { + var16 = var3.readUnsignedShort(); + if (var16 == 65535) { + var16 = -1; + } + + var5 = var3.readInt(); + var6 = var3.method5603(); + var20 = PacketBufferNode.getWidget(var6); + ItemDefinition var59; + if (!var20.isIf3) { + if (var16 == -1) { + var20.modelType = 0; + var1.serverPacket = null; + return true; + } + + var59 = class222.ItemDefinition_get(var16); + var20.modelType = 4; + var20.modelId = var16; + var20.modelAngleX = var59.xan2d; + var20.modelAngleY = var59.yan2d; + var20.modelZoom = var59.zoom2d * 100 / var5; + GrandExchangeOfferAgeComparator.invalidateWidget(var20); + } else { + var20.itemId = var16; + var20.itemQuantity = var5; + var59 = class222.ItemDefinition_get(var16); + var20.modelAngleX = var59.xan2d; + var20.modelAngleY = var59.yan2d; + var20.modelAngleZ = var59.zan2d; + var20.modelOffsetX = var59.offsetX2d; + var20.modelOffsetY = var59.offsetY2d; + var20.modelZoom = var59.zoom2d; + if (var59.isStackable == 1) { + var20.itemQuantityMode = 1; + } else { + var20.itemQuantityMode = 2; + } + + if (var20.field2577 > 0) { + var20.modelZoom = var20.modelZoom * 32 / var20.field2577; + } else if (var20.rawWidth > 0) { + var20.modelZoom = var20.modelZoom * 32 / var20.rawWidth; + } + + GrandExchangeOfferAgeComparator.invalidateWidget(var20); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2107 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2296); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2160 == var1.serverPacket) { + class3.privateChatMode = NPCDefinition.method4881(var3.readUnsignedByte()); + var1.serverPacket = null; + return true; + } + + boolean var39; + if (ServerPacket.field2156 == var1.serverPacket) { + var16 = var3.readUShortSmart(); + var39 = var3.readUnsignedByte() == 1; + var50 = ""; + boolean var42 = false; + if (var39) { + var50 = var3.readStringCp1252NullTerminated(); + if (PacketWriter.friendSystem.isIgnored(new Username(var50, class60.loginType))) { + var42 = true; + } + } + + String var58 = var3.readStringCp1252NullTerminated(); + if (!var42) { + class30.addGameMessage(var16, var50, var58); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2093 == var1.serverPacket) { + PacketWriter.friendSystem.method1968(); + field824 = cycleCntr; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2146 == var1.serverPacket) { + var16 = var3.method5647(); + rootInterface = var16; + this.resizeRoot(false); + WorldMapLabel.Widget_resetModelFrames(var16); + FaceNormal.runWidgetOnLoadListener(rootInterface); + + for (var5 = 0; var5 < 100; ++var5) { + field842[var5] = true; + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2147 == var1.serverPacket) { + SpriteMask.field2501 = var3.method5639(); + GrandExchangeOffer.field61 = var3.method5697(); + + while (var3.offset < var1.serverPacketLength) { + var16 = var3.readUnsignedByte(); + class185 var52 = WorldMapAreaData.method763()[var16]; + WorldMapSprite.method474(var52); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2097 == var1.serverPacket) { + var16 = var3.method5656(); + var5 = var3.method5646(); + var48 = PacketBufferNode.getWidget(var16); + if (var48 != null && var48.type == 0) { + if (var5 > var48.scrollHeight - var48.height) { + var5 = var48.scrollHeight - var48.height; + } + + if (var5 < 0) { + var5 = 0; + } + + if (var5 != var48.scrollY) { + var48.scrollY = var5; + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2118 == var1.serverPacket) { + var16 = var3.readUnsignedByte(); + WorldMapRectangle.method329(var16); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2130 == var1.serverPacket) { + var16 = var3.readInt(); + var5 = var3.method5651(); + var48 = PacketBufferNode.getWidget(var16); + if (var5 != var48.sequenceId || var5 == -1) { + var48.sequenceId = var5; + var48.modelFrame = 0; + var48.modelFrameCycle = 0; + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2137 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2299); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2165 == var1.serverPacket) { + var16 = var3.method5647(); + if (var16 == 65535) { + var16 = -1; + } + + AbstractWorldMapIcon.playSong(var16); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2168 == var1.serverPacket) { + var16 = var3.method5678(); + var5 = var3.method5646(); + if (var5 == 65535) { + var5 = -1; + } + + WorldMapEvent.playSoundJingle(var5, var16); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2139 == var1.serverPacket) { + var16 = var3.readInt(); + var5 = var3.readInt(); + var6 = WorldMapSection0.getGcDuration(); + PacketBufferNode var56 = SoundSystem.getPacketBufferNode(ClientPacket.field2232, packetWriter.isaacCipher); + var56.packetBuffer.method5653(var16); + var56.packetBuffer.writeIntME(var5); + var56.packetBuffer.writeByte(var6); + var56.packetBuffer.writeByte(GameShell.fps); + packetWriter.addNode(var56); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2113 == var1.serverPacket) { + var16 = var3.method5648(); + var5 = var3.method5647(); + var6 = var3.method5648(); + var7 = var3.readInt(); + var23 = PacketBufferNode.getWidget(var7); + if (var6 != var23.modelAngleX || var5 != var23.modelAngleY || var16 != var23.modelZoom) { + var23.modelAngleX = var6; + var23.modelAngleY = var5; + var23.modelZoom = var16; + GrandExchangeOfferAgeComparator.invalidateWidget(var23); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2173 == var1.serverPacket) { + AbstractWorldMapData.updateNpcs(false, var3); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2105 == var1.serverPacket) { + RouteStrategy.method3735(var3.readStringCp1252NullTerminated()); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2112 == var1.serverPacket) { + class1.logOut(); + var1.serverPacket = null; + return false; + } + + if (ServerPacket.field2094 == var1.serverPacket) { + var16 = var3.readInt(); + var5 = var3.readUnsignedShort(); + if (var16 < -70000) { + var5 += 32768; + } + + if (var16 >= 0) { + var48 = PacketBufferNode.getWidget(var16); + } else { + var48 = null; + } + + if (var48 != null) { + for (var7 = 0; var7 < var48.itemIds.length; ++var7) { + var48.itemIds[var7] = 0; + var48.itemQuantities[var7] = 0; + } + } + + FontName.clearItemContainer(var5); + var7 = var3.readUnsignedShort(); + + for (var8 = 0; var8 < var7; ++var8) { + var19 = var3.method5697(); + if (var19 == 255) { + var19 = var3.method5656(); + } + + var21 = var3.method5648(); + if (var48 != null && var8 < var48.itemIds.length) { + var48.itemIds[var8] = var21; + var48.itemQuantities[var8] = var19; + } + + WorldMapCacheName.itemContainerSetItem(var5, var8, var21 - 1, var19); + } + + if (var48 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + + BoundaryObject.method3393(); + field816[++field820 - 1 & 31] = var5 & 32767; + var1.serverPacket = null; + return true; + } + if (ServerPacket.field2120 == var1.serverPacket) { + isCameraLocked = true; + AbstractUserComparator.field3583 = var3.readUnsignedByte() * 128; + class49.field401 = var3.readUnsignedByte() * 16384; + ViewportMouse.field1713 = var3.readUnsignedShort(); + Clock.field2036 = var3.readUnsignedByte(); + SecureRandomCallable.field510 = var3.readUnsignedByte(); + if (SecureRandomCallable.field510 >= 100) { + var16 = AbstractUserComparator.field3583 * 16384 + 64; + var5 = class49.field401 * 128 + 64; + var6 = GraphicsObject.getTileHeight(var16, var5, Player.Scene_plane) - ViewportMouse.field1713; + var7 = var16 - UrlRequester.cameraX; + var8 = var6 - class16.cameraY; + var19 = var5 - GrandExchangeOfferAgeComparator.cameraZ; + var21 = (int)Math.sqrt((double)(var19 * var19 + var7 * var7)); + class247.cameraPitch = (int)(Math.atan2((double)var8, (double)var21) * 325.949D) & 2047; + WorldMapData_1.cameraYaw = (int)(Math.atan2((double)var7, (double)var19) * -325.949D) & 2047; + if (class247.cameraPitch < 128) { + class247.cameraPitch = 128; + } + + if (class247.cameraPitch > 383) { + class247.cameraPitch = 383; + } + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2101 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2294); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2103 == var1.serverPacket) { + for (var16 = 0; var16 < VarpDefinition.VarpDefinition_fileCount; ++var16) { + VarpDefinition var51 = Varcs.method2352(var16); + if (var51 != null) { + Varps.Varps_temp[var16] = 0; + Varps.Varps_main[var16] = 0; + } + } + + BoundaryObject.method3393(); + field679 += 32; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2157 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2292); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2115 == var1.serverPacket) { + var16 = var3.readUnsignedShort(); + byte var41 = var3.method5640(); + Varps.Varps_temp[var16] = var41; + if (Varps.Varps_main[var16] != var41) { + Varps.Varps_main[var16] = var41; + } + + WorldMapDecoration.method389(var16); + field817[++field679 - 1 & 31] = var16; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2152 == var1.serverPacket) { + var16 = var3.method5647(); + var5 = var3.method5796(); + var48 = PacketBufferNode.getWidget(var5); + if (var48.modelType != 2 || var16 != var48.modelId) { + var48.modelType = 2; + var48.modelId = var16; + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2170 == var1.serverPacket) { + for (var16 = 0; var16 < Varps.Varps_main.length; ++var16) { + if (Varps.Varps_main[var16] != Varps.Varps_temp[var16]) { + Varps.Varps_main[var16] = Varps.Varps_temp[var16]; + WorldMapDecoration.method389(var16); + field817[++field679 - 1 & 31] = var16; + } + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2166 == var1.serverPacket) { + World var37 = new World(); + var37.host = var3.readStringCp1252NullTerminated(); + var37.id = var3.readUnsignedShort(); + var5 = var3.readInt(); + var37.properties = var5; + Tile.updateGameState(45); + var2.close(); + var2 = null; + MouseRecorder.changeWorld(var37); + var1.serverPacket = null; + return false; + } + + if (ServerPacket.field2164 == var1.serverPacket) { + Clock.loadRegions(false, var1.packetBuffer); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2143 == var1.serverPacket) { + var16 = var3.method5646(); + var5 = var3.method5639(); + var6 = var3.readInt(); + var55 = (InterfaceParent)interfaceParents.get((long)var6); + if (var55 != null) { + GrandExchangeOfferOwnWorldComparator.closeInterface(var55, var16 != var55.group); + } + + WorldMapDecoration.method385(var6, var16, var5); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2174 == var1.serverPacket) { + PacketWriter.friendSystem.readUpdate(var3, var1.serverPacketLength); + field824 = cycleCntr; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2092 == var1.serverPacket) { + var16 = var3.readUnsignedByte(); + Frames.forceDisconnect(var16); + var1.serverPacket = null; + return false; + } + + if (ServerPacket.field2119 == var1.serverPacket) { + KeyHandler.readReflectionCheck(var3, var1.serverPacketLength); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2131 == var1.serverPacket) { + var36 = var3.readStringCp1252NullTerminated(); + var24 = (long)var3.readUnsignedShort(); + var26 = (long)var3.readMedium(); + PlayerType var29 = (PlayerType)WorldMapIcon_1.findEnumerated(class51.PlayerType_values(), var3.readUnsignedByte()); + long var30 = var26 + (var24 << 32); + boolean var32 = false; + + for (int var13 = 0; var13 < 100; ++var13) { + if (field852[var13] == var30) { + var32 = true; + break; + } + } + + if (PacketWriter.friendSystem.isIgnored(new Username(var36, class60.loginType))) { + var32 = true; + } + + if (!var32 && field745 == 0) { + field852[field721] = var30; + field721 = (field721 + 1) % 100; + String var33 = AbstractFont.escapeBrackets(class222.method4274(class4.method90(var3))); + byte var14; + if (var29.isPrivileged) { + var14 = 7; + } else { + var14 = 3; + } + + if (var29.modIcon != -1) { + class30.addGameMessage(var14, GrandExchangeEvent.method122(var29.modIcon) + var36, var33); + } else { + class30.addGameMessage(var14, var36, var33); + } + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2144 == var1.serverPacket) { + var16 = var3.method5649(); + var5 = var3.method5656(); + var6 = var3.readShort(); + var20 = PacketBufferNode.getWidget(var5); + if (var6 != var20.rawX || var16 != var20.rawY || var20.xAlignment != 0 || var20.yAlignment != 0) { + var20.rawX = var6; + var20.rawY = var16; + var20.xAlignment = 0; + var20.yAlignment = 0; + GrandExchangeOfferAgeComparator.invalidateWidget(var20); + this.alignWidget(var20); + if (var20.type == 0) { + class43.revalidateWidgetScroll(Widget.Widget_interfaceComponents[var5 >> 16], var20, false); + } + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2116 == var1.serverPacket) { + var16 = var3.method5656(); + var5 = var3.method5646(); + var6 = var5 >> 10 & 31; + var7 = var5 >> 5 & 31; + var8 = var5 & 31; + var19 = (var7 << 11) + (var6 << 19) + (var8 << 3); + Widget var10 = PacketBufferNode.getWidget(var16); + if (var19 != var10.color) { + var10.color = var19; + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2149 == var1.serverPacket) { destinationX = var3.readUnsignedByte(); if (destinationX == 255) { destinationX = 0; @@ -5035,211 +5838,433 @@ public final class Client extends GameShell implements Usernamed { return true; } - if (ServerPacket.field2112 == var1.serverPacket) { - class219.privateChatMode = Fonts.method5273(var3.readUnsignedByte()); + if (ServerPacket.field2106 == var1.serverPacket) { + BoundaryObject.method3393(); + runEnergy = var3.readUnsignedByte(); + field834 = cycleCntr; + var1.serverPacket = null; + return true; + } + + Widget var49; + if (ServerPacket.field2145 == var1.serverPacket) { + var16 = var3.readInt(); + var49 = PacketBufferNode.getWidget(var16); + + for (var6 = 0; var6 < var49.itemIds.length; ++var6) { + var49.itemIds[var6] = -1; + var49.itemIds[var6] = 0; + } + + GrandExchangeOfferAgeComparator.invalidateWidget(var49); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2142 == var1.serverPacket) { + var16 = var3.method5697(); + var5 = var3.readUnsignedByte(); + var50 = var3.readStringCp1252NullTerminated(); + if (var5 >= 1 && var5 <= 8) { + if (var50.equalsIgnoreCase("null")) { + var50 = null; + } + + playerMenuActions[var5 - 1] = var50; + playerOptionsPriorities[var5 - 1] = var16 == 0; + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2099 == var1.serverPacket) { + var16 = var3.method5796(); + var49 = PacketBufferNode.getWidget(var16); + var49.modelType = 3; + var49.modelId = class215.localPlayer.appearance.getChatHeadId(); + GrandExchangeOfferAgeComparator.invalidateWidget(var49); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2175 == var1.serverPacket) { + isCameraLocked = false; + + for (var16 = 0; var16 < 5; ++var16) { + field641[var16] = false; + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2171 == var1.serverPacket) { + var16 = var3.readUnsignedShort(); + var5 = var3.readUnsignedByte(); + var6 = var3.readUnsignedShort(); + class185.queueSoundEffect(var16, var5, var6); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2158 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2300); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2123 == var1.serverPacket) { + var16 = var3.method5603(); + var39 = var3.readUnsignedByte() == 1; + var48 = PacketBufferNode.getWidget(var16); + if (var39 != var48.isHidden) { + var48.isHidden = var39; + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2133 == var1.serverPacket) { + SpriteMask.field2501 = var3.readUnsignedByte(); + GrandExchangeOffer.field61 = var3.method5639(); var1.serverPacket = null; return true; } if (ServerPacket.field2138 == var1.serverPacket) { - var45 = var3.readBoolean(); - if (var45) { - if (StudioGame.field3086 == null) { - StudioGame.field3086 = new class237(); + publicChatMode = var3.method5639(); + tradeChatMode = var3.readUnsignedByte(); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2114 == var1.serverPacket) { + isCameraLocked = true; + class14.field88 = var3.readUnsignedByte() * 16384; + class42.field360 = var3.readUnsignedByte() * 16384; + WorldMapLabel.field231 = var3.readUnsignedShort(); + WorldMapAreaData.field323 = var3.readUnsignedByte(); + Interpreter.field1068 = var3.readUnsignedByte(); + if (Interpreter.field1068 >= 100) { + UrlRequester.cameraX = class14.field88 * 128 + 64; + GrandExchangeOfferAgeComparator.cameraZ = class42.field360 * 128 + 64; + class16.cameraY = GraphicsObject.getTileHeight(UrlRequester.cameraX, GrandExchangeOfferAgeComparator.cameraZ, Player.Scene_plane) - WorldMapLabel.field231; + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2100 == var1.serverPacket) { + if (rootInterface != -1) { + AttackOption.runIntfCloseListeners(rootInterface, 0); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2128 == var1.serverPacket) { + BoundaryObject.method3393(); + var16 = var3.method5697(); + var5 = var3.method5603(); + var6 = var3.readUnsignedByte(); + experience[var16] = var5; + currentLevels[var16] = var6; + levels[var16] = 1; + + for (var7 = 0; var7 < 98; ++var7) { + if (var5 >= Skills.Skills_experienceTable[var7]) { + levels[var16] = var7 + 2; + } + } + + changedSkills[++changedSkillsCount - 1 & 31] = var16; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2102 == var1.serverPacket) { + var36 = var3.readStringCp1252NullTerminated(); + var17 = AbstractFont.escapeBrackets(class222.method4274(class4.method90(var3))); + class30.addGameMessage(6, var36, var17); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2125 == var1.serverPacket) { + var16 = var3.method5603(); + var5 = var3.method5646(); + Varps.Varps_temp[var5] = var16; + if (Varps.Varps_main[var5] != var16) { + Varps.Varps_main[var5] = var16; + } + + WorldMapDecoration.method389(var5); + field817[++field679 - 1 & 31] = var5; + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2163 == var1.serverPacket) { + var3.offset += 28; + if (var3.checkCrc()) { + GrandExchangeOfferWorldComparator.method103(var3, var3.offset - 28); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2110 == var1.serverPacket) { + var16 = var3.method5603(); + var17 = var3.readStringCp1252NullTerminated(); + var48 = PacketBufferNode.getWidget(var16); + if (!var17.equals(var48.text)) { + var48.text = var17; + GrandExchangeOfferAgeComparator.invalidateWidget(var48); + } + + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2117 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2293); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2153 == var1.serverPacket) { + if (var1.serverPacketLength == 0) { + class4.clanChat = null; + } else { + if (class4.clanChat == null) { + class4.clanChat = new ClanChat(class60.loginType, WorldMapID.client); + } + + class4.clanChat.readUpdate(var3); + } + + AbstractByteArrayCopier.method4092(); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2154 == var1.serverPacket) { + var46 = var3.readBoolean(); + if (var46) { + if (GrandExchangeOfferWorldComparator.field30 == null) { + GrandExchangeOfferWorldComparator.field30 = new class237(); } } else { - StudioGame.field3086 = null; + GrandExchangeOfferWorldComparator.field30 = null; } var1.serverPacket = null; return true; } - if (ServerPacket.field2119 == var1.serverPacket) { - var16 = var3.method5482(); - var5 = var3.method5647(); - var18 = Canvas.getWidget(var16); - if (var18 != null && var18.type == 0) { - if (var5 > var18.scrollHeight - var18.height) { - var5 = var18.scrollHeight - var18.height; - } - - if (var5 < 0) { - var5 = 0; - } - - if (var5 != var18.scrollY) { - var18.scrollY = var5; - WorldMapSectionType.invalidateWidget(var18); - } - } - + if (ServerPacket.field2150 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2298); var1.serverPacket = null; return true; } - class32.RunException_sendStackTrace("" + (var1.serverPacket != null ? var1.serverPacket.id : -1) + "," + (var1.field1291 != null ? var1.field1291.id : -1) + "," + (var1.field1301 != null ? var1.field1301.id : -1) + "," + var1.serverPacketLength, (Throwable)null); - DynamicObject.logOut(); + if (ServerPacket.field2121 == var1.serverPacket) { + minimapState = var3.readUnsignedByte(); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2132 == var1.serverPacket) { + var36 = var3.readStringCp1252NullTerminated(); + Object[] var47 = new Object[var36.length() + 1]; + + for (var6 = var36.length() - 1; var6 >= 0; --var6) { + if (var36.charAt(var6) == 's') { + var47[var6 + 1] = var3.readStringCp1252NullTerminated(); + } else { + var47[var6 + 1] = new Integer(var3.readInt()); + } + } + + var47[0] = new Integer(var3.readInt()); + ScriptEvent var18 = new ScriptEvent(); + var18.args = var47; + GrandExchangeOfferAgeComparator.runScriptEvent(var18); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2108 == var1.serverPacket) { + if (class4.clanChat != null) { + class4.clanChat.method5354(var3); + } + + AbstractByteArrayCopier.method4092(); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2151 == var1.serverPacket) { + WorldMapSprite.method474(class185.field2291); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2155 == var1.serverPacket) { + var16 = var3.method5648(); + var5 = var3.method5796(); + var6 = var3.method5648(); + var20 = PacketBufferNode.getWidget(var5); + var20.field2604 = var6 + (var16 << 16); + var1.serverPacket = null; + return true; + } + + if (ServerPacket.field2172 == var1.serverPacket) { + PacketWriter.friendSystem.ignoreList.read(var3, var1.serverPacketLength); + class42.FriendSystem_invalidateIgnoreds(); + field824 = cycleCntr; + var1.serverPacket = null; + return true; + } + + User.RunException_sendStackTrace("" + (var1.serverPacket != null ? var1.serverPacket.id : -1) + "," + (var1.field1286 != null ? var1.field1286.id : -1) + "," + (var1.field1292 != null ? var1.field1292.id : -1) + "," + var1.serverPacketLength, (Throwable)null); + class1.logOut(); } catch (IOException var34) { - MouseRecorder.method1213(); + AbstractWorldMapIcon.method652(); } catch (Exception var35) { - var31 = "" + (var1.serverPacket != null ? var1.serverPacket.id : -1) + "," + (var1.field1291 != null ? var1.field1291.id : -1) + "," + (var1.field1301 != null ? var1.field1301.id : -1) + "," + var1.serverPacketLength + "," + (class223.localPlayer.pathX[0] + class223.baseX * 64) + "," + (class223.localPlayer.pathY[0] + class286.baseY * 64) + ","; + var17 = "" + (var1.serverPacket != null ? var1.serverPacket.id : -1) + "," + (var1.field1286 != null ? var1.field1286.id : -1) + "," + (var1.field1292 != null ? var1.field1292.id : -1) + "," + var1.serverPacketLength + "," + (class215.localPlayer.pathX[0] + UserComparator8.baseX * 64) + "," + (class215.localPlayer.pathY[0] + HealthBar.baseY * 64) + ","; for (var6 = 0; var6 < var1.serverPacketLength && var6 < 50; ++var6) { - var31 = var31 + var3.array[var6] + ","; + var17 = var17 + var3.array[var6] + ","; } - class32.RunException_sendStackTrace(var31, var35); - DynamicObject.logOut(); + User.RunException_sendStackTrace(var17, var35); + class1.logOut(); } return true; } } - @ObfuscatedName("he") + @ObfuscatedName("iq") @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "255" + signature = "(I)V", + garbageValue = "-331813237" ) @Export("menu") final void menu() { - boolean var1 = false; - - int var2; - int var5; - while (!var1) { - var1 = true; - - for (var2 = 0; var2 < menuOptionsCount - 1; ++var2) { - if (menuOpcodes[var2] < 1000 && menuOpcodes[var2 + 1] > 1000) { - String var3 = menuTargets[var2]; - menuTargets[var2] = menuTargets[var2 + 1]; - menuTargets[var2 + 1] = var3; - String var4 = menuActions[var2]; - menuActions[var2] = menuActions[var2 + 1]; - menuActions[var2 + 1] = var4; - var5 = menuOpcodes[var2]; - menuOpcodes[var2] = menuOpcodes[var2 + 1]; - menuOpcodes[var2 + 1] = var5; - var5 = menuArguments1[var2]; - menuArguments1[var2] = menuArguments1[var2 + 1]; - menuArguments1[var2 + 1] = var5; - var5 = menuArguments2[var2]; - menuArguments2[var2] = menuArguments2[var2 + 1]; - menuArguments2[var2 + 1] = var5; - var5 = menuIdentifiers[var2]; - menuIdentifiers[var2] = menuIdentifiers[var2 + 1]; - menuIdentifiers[var2 + 1] = var5; - boolean var6 = menuShiftClick[var2]; - menuShiftClick[var2] = menuShiftClick[var2 + 1]; - menuShiftClick[var2 + 1] = var6; - var1 = false; - } - } - } - - if (Frames.dragInventoryWidget == null) { + Occluder.method3416(); + if (GrandExchangeOffer.dragInventoryWidget == null) { if (clickedWidget == null) { - int var16 = MouseHandler.MouseHandler_lastButton; - int var13; - int var14; + int var1 = MouseHandler.MouseHandler_lastButton; + int var2; + int var3; + int var4; + int var5; + int var6; + int var8; if (isMenuOpen) { - int var7; - int var8; - int var17; - if (var16 != 1 && (WorldMapIcon_1.mouseCam || var16 != 4)) { + if (var1 != 1 && (WorldMapLabelSize.mouseCam || var1 != 4)) { var2 = MouseHandler.MouseHandler_x; - var13 = MouseHandler.MouseHandler_y; - if (var2 < UrlRequester.menuX - 10 || var2 > FriendSystem.menuWidth + UrlRequester.menuX + 10 || var13 < class51.menuY - 10 || var13 > class51.menuY + WorldMapDecoration.menuHeight + 10) { + var3 = MouseHandler.MouseHandler_y; + if (var2 < MusicPatchNode.menuX - 10 || var2 > KeyHandler.menuWidth + MusicPatchNode.menuX + 10 || var3 < TextureProvider.menuY - 10 || var3 > TextureProvider.menuY + WorldMapData_1.menuHeight + 10) { isMenuOpen = false; - var14 = UrlRequester.menuX; - var5 = class51.menuY; - var17 = FriendSystem.menuWidth; - var7 = WorldMapDecoration.menuHeight; - - for (var8 = 0; var8 < rootWidgetCount; ++var8) { - if (rootWidgetWidths[var8] + rootWidgetXs[var8] > var14 && rootWidgetXs[var8] < var17 + var14 && rootWidgetHeights[var8] + rootWidgetYs[var8] > var5 && rootWidgetYs[var8] < var5 + var7) { - field841[var8] = true; - } - } + class83.method2212(MusicPatchNode.menuX, TextureProvider.menuY, KeyHandler.menuWidth, WorldMapData_1.menuHeight); } } - if (var16 == 1 || !WorldMapIcon_1.mouseCam && var16 == 4) { - var2 = UrlRequester.menuX; - var13 = class51.menuY; - var14 = FriendSystem.menuWidth; + if (var1 == 1 || !WorldMapLabelSize.mouseCam && var1 == 4) { + var2 = MusicPatchNode.menuX; + var3 = TextureProvider.menuY; + var4 = KeyHandler.menuWidth; var5 = MouseHandler.MouseHandler_lastPressedX; - var17 = MouseHandler.MouseHandler_lastPressedY; - var7 = -1; + var6 = MouseHandler.MouseHandler_lastPressedY; + int var17 = -1; int var9; for (var8 = 0; var8 < menuOptionsCount; ++var8) { - var9 = (menuOptionsCount - 1 - var8) * 15 + var13 + 31; - if (var5 > var2 && var5 < var14 + var2 && var17 > var9 - 13 && var17 < var9 + 3) { - var7 = var8; + var9 = var3 + (menuOptionsCount - 1 - var8) * 15 + 31; + if (var5 > var2 && var5 < var2 + var4 && var6 > var9 - 13 && var6 < var9 + 3) { + var17 = var8; } } - if (var7 != -1) { - ModelData0.clickMenuIndex(var7); + if (var17 != -1 && var17 >= 0) { + var8 = menuArguments1[var17]; + var9 = menuArguments2[var17]; + int var10 = menuOpcodes[var17]; + int var11 = menuIdentifiers[var17]; + String var12 = menuActions[var17]; + String var13 = menuTargets[var17]; + GrandExchangeOfferOwnWorldComparator.menuAction(var8, var9, var10, var11, var12, var13, MouseHandler.MouseHandler_lastPressedX, MouseHandler.MouseHandler_lastPressedY); } isMenuOpen = false; - var8 = UrlRequester.menuX; - var9 = class51.menuY; - int var10 = FriendSystem.menuWidth; - int var11 = WorldMapDecoration.menuHeight; - - for (int var12 = 0; var12 < rootWidgetCount; ++var12) { - if (rootWidgetXs[var12] + rootWidgetWidths[var12] > var8 && rootWidgetXs[var12] < var8 + var10 && rootWidgetHeights[var12] + rootWidgetYs[var12] > var9 && rootWidgetYs[var12] < var11 + var9) { - field841[var12] = true; - } - } + class83.method2212(MusicPatchNode.menuX, TextureProvider.menuY, KeyHandler.menuWidth, WorldMapData_1.menuHeight); } } else { - var2 = BuddyRankComparator.getNewestMenuIdx(); - if ((var16 == 1 || !WorldMapIcon_1.mouseCam && var16 == 4) && var2 >= 0) { - var13 = menuOpcodes[var2]; - if (var13 == 39 || var13 == 40 || var13 == 41 || var13 == 42 || var13 == 43 || var13 == 33 || var13 == 34 || var13 == 35 || var13 == 36 || var13 == 37 || var13 == 38 || var13 == 1005) { - var14 = menuArguments1[var2]; - var5 = menuArguments2[var2]; - Widget var15 = Canvas.getWidget(var5); - if (ModelData0.method3215(class2.getWidgetClickMask(var15)) || WorldMapSection0.method249(class2.getWidgetClickMask(var15))) { - if (Frames.dragInventoryWidget != null && !field748 && menuOptionsCount > 0 && !this.shouldLeftClickOpenMenu()) { - class3.method47(field745, field746); + var2 = class16.getNewestMenuIdx(); + if ((var1 == 1 || !WorldMapLabelSize.mouseCam && var1 == 4) && var2 >= 0) { + var3 = menuOpcodes[var2]; + if (var3 == 39 || var3 == 40 || var3 == 41 || var3 == 42 || var3 == 43 || var3 == 33 || var3 == 34 || var3 == 35 || var3 == 36 || var3 == 37 || var3 == 38 || var3 == 1005) { + label260: { + var4 = menuArguments1[var2]; + var5 = menuArguments2[var2]; + Widget var14 = PacketBufferNode.getWidget(var5); + if (!class162.method3588(class195.getWidgetClickMask(var14))) { + var8 = class195.getWidgetClickMask(var14); + boolean var7 = (var8 >> 29 & 1) != 0; + if (!var7) { + break label260; + } } - field748 = false; + if (GrandExchangeOffer.dragInventoryWidget != null && !field743 && menuOptionsCount > 0 && !this.shouldLeftClickOpenMenu()) { + AbstractWorldMapData.method325(field729, field741); + } + + field743 = false; itemDragDuration = 0; - if (Frames.dragInventoryWidget != null) { - WorldMapSectionType.invalidateWidget(Frames.dragInventoryWidget); + if (GrandExchangeOffer.dragInventoryWidget != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(GrandExchangeOffer.dragInventoryWidget); } - Frames.dragInventoryWidget = Canvas.getWidget(var5); - dragItemSlotSource = var14; - field745 = MouseHandler.MouseHandler_lastPressedX; - field746 = MouseHandler.MouseHandler_lastPressedY; + GrandExchangeOffer.dragInventoryWidget = PacketBufferNode.getWidget(var5); + dragItemSlotSource = var4; + field729 = MouseHandler.MouseHandler_lastPressedX; + field741 = MouseHandler.MouseHandler_lastPressedY; if (var2 >= 0) { - ChatChannel.method2229(var2); + Script.method2384(var2); } - WorldMapSectionType.invalidateWidget(Frames.dragInventoryWidget); + GrandExchangeOfferAgeComparator.invalidateWidget(GrandExchangeOffer.dragInventoryWidget); return; } } } - if ((var16 == 1 || !WorldMapIcon_1.mouseCam && var16 == 4) && this.shouldLeftClickOpenMenu()) { - var16 = 2; + if ((var1 == 1 || !WorldMapLabelSize.mouseCam && var1 == 4) && this.shouldLeftClickOpenMenu()) { + var1 = 2; } - if ((var16 == 1 || !WorldMapIcon_1.mouseCam && var16 == 4) && menuOptionsCount > 0) { - ModelData0.clickMenuIndex(var2); + if ((var1 == 1 || !WorldMapLabelSize.mouseCam && var1 == 4) && menuOptionsCount > 0 && var2 >= 0) { + var3 = menuArguments1[var2]; + var4 = menuArguments2[var2]; + var5 = menuOpcodes[var2]; + var6 = menuIdentifiers[var2]; + String var15 = menuActions[var2]; + String var16 = menuTargets[var2]; + GrandExchangeOfferOwnWorldComparator.menuAction(var3, var4, var5, var6, var15, var16, MouseHandler.MouseHandler_lastPressedX, MouseHandler.MouseHandler_lastPressedY); } - if (var16 == 2 && menuOptionsCount > 0) { + if (var1 == 2 && menuOptionsCount > 0) { this.openMenu(MouseHandler.MouseHandler_lastPressedX, MouseHandler.MouseHandler_lastPressedY); } } @@ -5248,99 +6273,105 @@ public final class Client extends GameShell implements Usernamed { } } - @ObfuscatedName("hq") + @ObfuscatedName("iu") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "-5" + signature = "(I)Z", + garbageValue = "-281326064" ) @Export("shouldLeftClickOpenMenu") final boolean shouldLeftClickOpenMenu() { - int var1 = BuddyRankComparator.getNewestMenuIdx(); - return (leftClickOpensMenu == 1 && menuOptionsCount > 2 || ParamDefinition.method4480(var1)) && !menuShiftClick[var1]; + int var1 = class16.getNewestMenuIdx(); + return (leftClickOpensMenu == 1 && menuOptionsCount > 2 || Occluder.method3415(var1)) && !menuShiftClick[var1]; } - @ObfuscatedName("ho") + @ObfuscatedName("ie") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "1638335073" + signature = "(IIS)V", + garbageValue = "-15485" ) @Export("openMenu") - final void openMenu(int screenX, int screenY) { - UserComparator6.calculateMenuBounds(screenX, screenY); - PacketWriter.scene.menuOpen(WorldMapRectangle.plane, screenX, screenY, false); + final void openMenu(int var1, int var2) { + Decimator.calculateMenuBounds(var1, var2); + WorldMapArea.scene.menuOpen(Player.Scene_plane, var1, var2, false); isMenuOpen = true; } - @ObfuscatedName("ij") + @ObfuscatedName("jy") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "313560965" + garbageValue = "-797725824" ) @Export("resizeRoot") final void resizeRoot(boolean var1) { - class247.resizeComponents(rootInterface, FloorDecoration.canvasWidth, WallDecoration.canvasHeight, var1); + int var2 = rootInterface; + int var3 = class286.canvasWidth; + int var4 = FloorUnderlayDefinition.canvasHeight; + if (TextureProvider.loadInterface(var2)) { + Message.resizeInterface(Widget.Widget_interfaceComponents[var2], -1, var3, var4, var1); + } + } - @ObfuscatedName("is") + @ObfuscatedName("jl") @ObfuscatedSignature( - signature = "(Lho;B)V", - garbageValue = "1" + signature = "(Lhi;I)V", + garbageValue = "2023561891" ) @Export("alignWidget") void alignWidget(Widget var1) { - Widget var2 = var1.parentId == -1 ? null : Canvas.getWidget(var1.parentId); + Widget var2 = var1.parentId == -1 ? null : PacketBufferNode.getWidget(var1.parentId); int var3; int var4; if (var2 == null) { - var3 = FloorDecoration.canvasWidth; - var4 = WallDecoration.canvasHeight; + var3 = class286.canvasWidth; + var4 = FloorUnderlayDefinition.canvasHeight; } else { var3 = var2.width; var4 = var2.height; } - TileItem.alignWidgetSize(var1, var3, var4, false); - class30.alignWidgetPosition(var1, var3, var4); + TriBool.alignWidgetSize(var1, var3, var4, false); + ObjectDefinition.alignWidgetPosition(var1, var3, var4); } - @ObfuscatedName("jt") + @ObfuscatedName("kr") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-808375331" + garbageValue = "296968633" ) - final void method1328() { - WorldMapSectionType.invalidateWidget(clickedWidget); - ++ViewportMouse.widgetDragDuration; - if (field817 && field814) { + final void method1414() { + GrandExchangeOfferAgeComparator.invalidateWidget(clickedWidget); + ++FloorDecoration.widgetDragDuration; + if (field695 && field809) { int var1 = MouseHandler.MouseHandler_x; int var2 = MouseHandler.MouseHandler_y; var1 -= widgetClickX; var2 -= widgetClickY; - if (var1 < field695) { - var1 = field695; + if (var1 < field748) { + var1 = field748; } - if (var1 + clickedWidget.width > field695 + clickedWidgetParent.width) { - var1 = field695 + clickedWidgetParent.width - clickedWidget.width; + if (var1 + clickedWidget.width > field748 + clickedWidgetParent.width) { + var1 = field748 + clickedWidgetParent.width - clickedWidget.width; } - if (var2 < field816) { - var2 = field816; + if (var2 < field751) { + var2 = field751; } - if (var2 + clickedWidget.height > field816 + clickedWidgetParent.height) { - var2 = field816 + clickedWidgetParent.height - clickedWidget.height; + if (var2 + clickedWidget.height > field751 + clickedWidgetParent.height) { + var2 = field751 + clickedWidgetParent.height - clickedWidget.height; } - int var3 = var1 - field818; - int var4 = var2 - field819; + int var3 = var1 - field846; + int var4 = var2 - field814; int var5 = clickedWidget.dragZoneSize; - if (ViewportMouse.widgetDragDuration > clickedWidget.dragThreshold && (var3 > var5 || var3 < -var5 || var4 > var5 || var4 < -var5)) { + if (FloorDecoration.widgetDragDuration > clickedWidget.dragThreshold && (var3 > var5 || var3 < -var5 || var4 > var5 || var4 < -var5)) { isDraggingWidget = true; } - int var6 = var1 - field695 + clickedWidgetParent.scrollX; - int var7 = var2 - field816 + clickedWidgetParent.scrollY; + int var6 = var1 - field748 + clickedWidgetParent.scrollX; + int var7 = var2 - field751 + clickedWidgetParent.scrollY; ScriptEvent var8; if (clickedWidget.onDrag != null && isDraggingWidget) { var8 = new ScriptEvent(); @@ -5348,7 +6379,7 @@ public final class Client extends GameShell implements Usernamed { var8.mouseX = var6; var8.mouseY = var7; var8.args = clickedWidget.onDrag; - ParamDefinition.runScriptEvent(var8); + GrandExchangeOfferAgeComparator.runScriptEvent(var8); } if (MouseHandler.MouseHandler_currentButton == 0) { @@ -5360,119 +6391,43 @@ public final class Client extends GameShell implements Usernamed { var8.mouseY = var7; var8.dragTarget = draggedOnWidget; var8.args = clickedWidget.onDragComplete; - ParamDefinition.runScriptEvent(var8); + GrandExchangeOfferAgeComparator.runScriptEvent(var8); } - if (draggedOnWidget != null && GrandExchangeEvents.method81(clickedWidget) != null) { - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2278, packetWriter.isaacCipher); - var9.packetBuffer.writeShortLE(draggedOnWidget.childIndex); + if (draggedOnWidget != null && TextureProvider.method2909(clickedWidget) != null) { + PacketBufferNode var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2226, packetWriter.isaacCipher); + var9.packetBuffer.method5644(clickedWidget.itemId); + var9.packetBuffer.method5653(draggedOnWidget.id); + var9.packetBuffer.method5643(draggedOnWidget.childIndex); + var9.packetBuffer.method5644(clickedWidget.childIndex); var9.packetBuffer.writeShortLE(draggedOnWidget.itemId); - var9.packetBuffer.method5476(clickedWidget.childIndex); - var9.packetBuffer.method5630(draggedOnWidget.id); - var9.packetBuffer.writeIntME(clickedWidget.itemId); - var9.packetBuffer.writeInt(clickedWidget.id); + var9.packetBuffer.method5653(clickedWidget.id); packetWriter.addNode(var9); } } else if (this.shouldLeftClickOpenMenu()) { - this.openMenu(field818 + widgetClickX, widgetClickY + field819); + this.openMenu(widgetClickX + field846, widgetClickY + field814); } else if (menuOptionsCount > 0) { - class3.method47(field818 + widgetClickX, field819 + widgetClickY); + AbstractWorldMapData.method325(widgetClickX + field846, widgetClickY + field814); } clickedWidget = null; } } else { - if (ViewportMouse.widgetDragDuration > 1) { + if (FloorDecoration.widgetDragDuration > 1) { clickedWidget = null; } } } - @ObfuscatedName("kz") + @ObfuscatedName("lz") @ObfuscatedSignature( - signature = "(S)Ljq;", - garbageValue = "9955" + signature = "(S)Lju;", + garbageValue = "1353" ) @Export("username") public Username username() { - return class223.localPlayer != null ? class223.localPlayer.username : null; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "431297908" - ) - public static void method1566() { - if (MouseHandler.MouseHandler_instance != null) { - synchronized(MouseHandler.MouseHandler_instance) { - MouseHandler.MouseHandler_instance = null; - } - } - - } - - @ObfuscatedName("q") - static int method1708(long var0) { - return (int)(var0 >>> 14 & 3L); - } - - @ObfuscatedName("f") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1109826367" - ) - static int method1750(int var0, Script var1, boolean var2) { - Widget var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - if (var0 == ScriptOpcodes.IF_GETSCROLLX) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollX; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETSCROLLY) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollY; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETTEXT) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.text; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETSCROLLWIDTH) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollWidth; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETSCROLLHEIGHT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollHeight; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETMODELZOOM) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelZoom; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETMODELANGLE_X) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleX; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETMODELANGLE_Z) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleZ; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETMODELANGLE_Y) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleY; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETTRANSTOP) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyTop; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETTRANSBOT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyBot; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETCOLOUR) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETFILLCOLOUR) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color2; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETFILLMODE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.fillMode.rsOrdinal(); - return 1; - } else if (var0 == ScriptOpcodes.IF_GETMODELTRANSPARENT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelTransparency ? 1 : 0; - return 1; - } else { - return 2; - } + return class215.localPlayer != null ? class215.localPlayer.username : null; } } diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index 4ff2dfbd93..a0a44d8393 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -1,633 +1,641 @@ +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.net.URL; +import java.net.URLConnection; +import java.util.Random; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("gy") +@ObfuscatedName("gx") @Implements("ClientPacket") public class ClientPacket implements class181 { - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2208; - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2185; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2285; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2187; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2188; - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2189; - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2190; - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2191; - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2238; - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2248; - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2194; - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2195; - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2196; @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2229; - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2198; - @ObfuscatedName("w") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2186; + public static final ClientPacket field2228; @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2200; - @ObfuscatedName("g") + public static final ClientPacket field2220; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2201; - @ObfuscatedName("x") + public static final ClientPacket field2181; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2240; - @ObfuscatedName("h") + public static final ClientPacket field2182; + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2203; - @ObfuscatedName("s") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2204; - @ObfuscatedName("f") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2233; - @ObfuscatedName("j") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2215; - @ObfuscatedName("d") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2207; + public static final ClientPacket field2183; @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2192; - @ObfuscatedName("k") + public static final ClientPacket field2184; + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" + ) + static final ClientPacket field2189; + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2186; + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2187; + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2252; + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "Lgx;" ) public static final ClientPacket field2209; - @ObfuscatedName("ac") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2210; - @ObfuscatedName("az") + public static final ClientPacket field2277; + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" + ) + public static final ClientPacket field2282; + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2192; + @ObfuscatedName("x") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2193; + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2202; + @ObfuscatedName("r") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2195; + @ObfuscatedName("e") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2196; + @ObfuscatedName("s") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2197; + @ObfuscatedName("b") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2198; + @ObfuscatedName("z") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2199; + @ObfuscatedName("f") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2188; + @ObfuscatedName("g") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2256; + @ObfuscatedName("w") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2191; + @ObfuscatedName("u") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2231; + @ObfuscatedName("y") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2204; + @ObfuscatedName("aa") + @ObfuscatedSignature( + signature = "Lgx;" ) public static final ClientPacket field2205; @ObfuscatedName("aw") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2212; - @ObfuscatedName("aa") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2213; - @ObfuscatedName("ap") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2259; + public static final ClientPacket field2206; @ObfuscatedName("ar") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2272; - @ObfuscatedName("ab") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2216; - @ObfuscatedName("ax") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2217; - @ObfuscatedName("as") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2218; - @ObfuscatedName("ao") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2219; - @ObfuscatedName("al") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2220; - @ObfuscatedName("ad") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2221; - @ObfuscatedName("an") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2222; - @ObfuscatedName("ai") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2202; - @ObfuscatedName("ak") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2224; + public static final ClientPacket field2207; @ObfuscatedName("aq") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2225; - @ObfuscatedName("am") + public static final ClientPacket field2208; + @ObfuscatedName("ad") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2226; - @ObfuscatedName("ae") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2227; - @ObfuscatedName("av") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2228; - @ObfuscatedName("ah") - @ObfuscatedSignature( - signature = "Lgy;" - ) - static final ClientPacket field2184; + public static final ClientPacket field2200; @ObfuscatedName("ag") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2230; - @ObfuscatedName("aj") + public static final ClientPacket field2210; + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2282; - @ObfuscatedName("ay") + public static final ClientPacket field2211; + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2232; - @ObfuscatedName("au") + public static final ClientPacket field2201; + @ObfuscatedName("am") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2283; - @ObfuscatedName("af") + public static final ClientPacket field2213; + @ObfuscatedName("ab") @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2234; - @ObfuscatedName("at") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2235; - @ObfuscatedName("bx") - @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) public static final ClientPacket field2214; - @ObfuscatedName("bh") + @ObfuscatedName("ax") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2237; + public static final ClientPacket field2180; + @ObfuscatedName("al") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2216; + @ObfuscatedName("ap") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2217; + @ObfuscatedName("aj") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2218; + @ObfuscatedName("ae") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2219; + @ObfuscatedName("au") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2179; + @ObfuscatedName("ah") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2238; + @ObfuscatedName("an") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2222; + @ObfuscatedName("af") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2190; + @ObfuscatedName("ay") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2224; + @ObfuscatedName("az") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2225; + @ObfuscatedName("ao") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2226; + @ObfuscatedName("ai") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2227; + @ObfuscatedName("ac") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2280; + @ObfuscatedName("at") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2229; + @ObfuscatedName("as") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2230; + @ObfuscatedName("ba") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2273; + @ObfuscatedName("bg") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2232; + @ObfuscatedName("bc") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2233; @ObfuscatedName("bd") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" + ) + public static final ClientPacket field2258; + @ObfuscatedName("bx") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2235; + @ObfuscatedName("bl") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2236; + @ObfuscatedName("bh") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2237; + @ObfuscatedName("bu") + @ObfuscatedSignature( + signature = "Lgx;" + ) + static final ClientPacket field2261; + @ObfuscatedName("br") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2239; + @ObfuscatedName("bq") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2247; + @ObfuscatedName("bi") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2185; + @ObfuscatedName("be") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2242; + @ObfuscatedName("bt") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2243; + @ObfuscatedName("bs") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2244; + @ObfuscatedName("bj") + @ObfuscatedSignature( + signature = "Lgx;" ) public static final ClientPacket field2245; @ObfuscatedName("bm") @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2239; - @ObfuscatedName("bv") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2268; - @ObfuscatedName("bj") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2241; - @ObfuscatedName("bs") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2242; - @ObfuscatedName("bz") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2243; - @ObfuscatedName("bc") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2244; - @ObfuscatedName("bk") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2206; - @ObfuscatedName("ba") - @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) public static final ClientPacket field2246; @ObfuscatedName("bn") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2265; - @ObfuscatedName("be") + public static final ClientPacket field2215; + @ObfuscatedName("bz") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2236; - @ObfuscatedName("bu") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2249; - @ObfuscatedName("bi") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2250; - @ObfuscatedName("bb") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2254; - @ObfuscatedName("bt") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2252; - @ObfuscatedName("by") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2253; - @ObfuscatedName("bq") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2255; + public static final ClientPacket field2248; @ObfuscatedName("bo") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2271; - @ObfuscatedName("br") + public static final ClientPacket field2255; + @ObfuscatedName("bk") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2256; - @ObfuscatedName("bl") + public static final ClientPacket field2250; + @ObfuscatedName("bv") @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2257; - @ObfuscatedName("bf") - @ObfuscatedSignature( - signature = "Lgy;" - ) - static final ClientPacket field2258; - @ObfuscatedName("bg") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2199; - @ObfuscatedName("bw") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2247; - @ObfuscatedName("bp") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2260; - @ObfuscatedName("cz") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2262; - @ObfuscatedName("ck") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2263; - @ObfuscatedName("cv") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2264; - @ObfuscatedName("co") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2231; - @ObfuscatedName("cs") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2197; - @ObfuscatedName("cg") - @ObfuscatedSignature( - signature = "Lgy;" - ) - static final ClientPacket field2267; - @ObfuscatedName("cn") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2279; - @ObfuscatedName("cd") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2269; - @ObfuscatedName("cy") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2270; - @ObfuscatedName("cj") - @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) public static final ClientPacket field2251; - @ObfuscatedName("cb") + @ObfuscatedName("bw") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2211; - @ObfuscatedName("cr") + public static final ClientPacket field2249; + @ObfuscatedName("bb") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2273; - @ObfuscatedName("ct") + public static final ClientPacket field2253; + @ObfuscatedName("bf") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2274; - @ObfuscatedName("ci") + public static final ClientPacket field2254; + @ObfuscatedName("by") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2275; - @ObfuscatedName("cu") + public static final ClientPacket field2257; + @ObfuscatedName("bp") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2276; - @ObfuscatedName("ce") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2193; - @ObfuscatedName("cc") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2278; - @ObfuscatedName("cl") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2266; - @ObfuscatedName("cw") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2280; - @ObfuscatedName("cq") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2277; - @ObfuscatedName("ca") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2281; - @ObfuscatedName("cf") - @ObfuscatedSignature( - signature = "Lgy;" - ) - public static final ClientPacket field2261; + public static final ClientPacket field2241; @ObfuscatedName("cx") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) - public static final ClientPacket field2284; + public static final ClientPacket field2234; + @ObfuscatedName("cv") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2270; + @ObfuscatedName("ce") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2259; + @ObfuscatedName("cw") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2221; + @ObfuscatedName("cd") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2260; + @ObfuscatedName("cn") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2262; + @ObfuscatedName("cr") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2263; + @ObfuscatedName("ci") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2264; + @ObfuscatedName("cy") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2265; + @ObfuscatedName("cl") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2266; + @ObfuscatedName("co") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2267; + @ObfuscatedName("cu") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2268; + @ObfuscatedName("cz") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2269; + @ObfuscatedName("cq") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2276; + @ObfuscatedName("cj") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2271; @ObfuscatedName("cm") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2272; + @ObfuscatedName("cb") + @ObfuscatedSignature( + signature = "Lgx;" + ) + static final ClientPacket field2203; + @ObfuscatedName("cp") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2274; + @ObfuscatedName("cs") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2275; + @ObfuscatedName("ck") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2223; + @ObfuscatedName("ct") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2194; + @ObfuscatedName("cc") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2278; + @ObfuscatedName("ch") + @ObfuscatedSignature( + signature = "Lgx;" + ) + public static final ClientPacket field2240; + @ObfuscatedName("gk") + @Export("xteaKeys") + static int[][] xteaKeys; + @ObfuscatedName("cg") @ObfuscatedGetter( - intValue = 1560897385 + intValue = -495540295 ) @Export("id") final int id; - @ObfuscatedName("cp") + @ObfuscatedName("cf") @ObfuscatedGetter( - intValue = 171085629 + intValue = -1101670465 ) @Export("length") final int length; static { - field2208 = new ClientPacket(0, 4); - field2185 = new ClientPacket(1, 6); - field2285 = new ClientPacket(2, 8); - field2187 = new ClientPacket(3, -1); - field2188 = new ClientPacket(4, -1); - field2189 = new ClientPacket(5, 8); - field2190 = new ClientPacket(6, 7); - field2191 = new ClientPacket(7, 9); - field2238 = new ClientPacket(8, 4); - field2248 = new ClientPacket(9, 2); - field2194 = new ClientPacket(10, 8); - field2195 = new ClientPacket(11, 11); - field2196 = new ClientPacket(12, -1); - field2229 = new ClientPacket(13, 0); - field2198 = new ClientPacket(14, 8); - field2186 = new ClientPacket(15, 1); - field2200 = new ClientPacket(16, 8); - field2201 = new ClientPacket(17, -1); - field2240 = new ClientPacket(18, 7); - field2203 = new ClientPacket(19, 8); - field2204 = new ClientPacket(20, 8); - field2233 = new ClientPacket(21, 3); - field2215 = new ClientPacket(22, -1); - field2207 = new ClientPacket(23, 0); - field2192 = new ClientPacket(24, 7); - field2209 = new ClientPacket(25, 4); - field2210 = new ClientPacket(26, 6); - field2205 = new ClientPacket(27, 7); - field2212 = new ClientPacket(28, 2); - field2213 = new ClientPacket(29, 8); - field2259 = new ClientPacket(30, 8); - field2272 = new ClientPacket(31, 8); - field2216 = new ClientPacket(32, -1); - field2217 = new ClientPacket(33, 8); - field2218 = new ClientPacket(34, 13); - field2219 = new ClientPacket(35, 3); - field2220 = new ClientPacket(36, 2); - field2221 = new ClientPacket(37, 3); - field2222 = new ClientPacket(38, 9); - field2202 = new ClientPacket(39, -1); - field2224 = new ClientPacket(40, -2); - field2225 = new ClientPacket(41, 0); - field2226 = new ClientPacket(42, 7); - field2227 = new ClientPacket(43, 3); - field2228 = new ClientPacket(44, 13); - field2184 = new ClientPacket(45, -1); - field2230 = new ClientPacket(46, 15); - field2282 = new ClientPacket(47, 8); - field2232 = new ClientPacket(48, -1); - field2283 = new ClientPacket(49, 0); - field2234 = new ClientPacket(50, 7); - field2235 = new ClientPacket(51, 7); - field2214 = new ClientPacket(52, 3); - field2237 = new ClientPacket(53, -1); - field2245 = new ClientPacket(54, 2); - field2239 = new ClientPacket(55, 9); - field2268 = new ClientPacket(56, -1); - field2241 = new ClientPacket(57, 0); - field2242 = new ClientPacket(58, 3); - field2243 = new ClientPacket(59, 11); - field2244 = new ClientPacket(60, 8); - field2206 = new ClientPacket(61, 3); - field2246 = new ClientPacket(62, 14); - field2265 = new ClientPacket(63, 7); - field2236 = new ClientPacket(64, 16); - field2249 = new ClientPacket(65, 8); - field2250 = new ClientPacket(66, 8); - field2254 = new ClientPacket(67, -1); - field2252 = new ClientPacket(68, 13); - field2253 = new ClientPacket(69, 4); - field2255 = new ClientPacket(70, 8); - field2271 = new ClientPacket(71, 3); - field2256 = new ClientPacket(72, 5); - field2257 = new ClientPacket(73, 8); - field2258 = new ClientPacket(74, 7); - field2199 = new ClientPacket(75, 10); - field2247 = new ClientPacket(76, 8); - field2260 = new ClientPacket(77, 9); - field2262 = new ClientPacket(78, 3); - field2263 = new ClientPacket(79, 3); - field2264 = new ClientPacket(80, -1); - field2231 = new ClientPacket(81, 3); - field2197 = new ClientPacket(82, 15); - field2267 = new ClientPacket(83, 2); - field2279 = new ClientPacket(84, -1); - field2269 = new ClientPacket(85, 16); - field2270 = new ClientPacket(86, -2); - field2251 = new ClientPacket(87, 8); - field2211 = new ClientPacket(88, 8); - field2273 = new ClientPacket(89, 3); - field2274 = new ClientPacket(90, 3); - field2275 = new ClientPacket(91, -1); - field2276 = new ClientPacket(92, -1); - field2193 = new ClientPacket(93, -2); - field2278 = new ClientPacket(94, 16); - field2266 = new ClientPacket(95, 7); - field2280 = new ClientPacket(96, 3); - field2277 = new ClientPacket(97, 7); - field2281 = new ClientPacket(98, -1); - field2261 = new ClientPacket(99, 4); - field2284 = new ClientPacket(100, -1); + field2228 = new ClientPacket(0, 9); + field2220 = new ClientPacket(1, 4); + field2181 = new ClientPacket(2, 3); + field2182 = new ClientPacket(3, -1); + field2183 = new ClientPacket(4, -1); + field2184 = new ClientPacket(5, 15); + field2189 = new ClientPacket(6, -1); + field2186 = new ClientPacket(7, 8); + field2187 = new ClientPacket(8, -2); + field2252 = new ClientPacket(9, 4); + field2209 = new ClientPacket(10, 1); + field2277 = new ClientPacket(11, 6); + field2282 = new ClientPacket(12, 3); + field2192 = new ClientPacket(13, 7); + field2193 = new ClientPacket(14, 3); + field2202 = new ClientPacket(15, -1); + field2195 = new ClientPacket(16, -1); + field2196 = new ClientPacket(17, 8); + field2197 = new ClientPacket(18, -1); + field2198 = new ClientPacket(19, 2); + field2199 = new ClientPacket(20, -1); + field2188 = new ClientPacket(21, 3); + field2256 = new ClientPacket(22, 3); + field2191 = new ClientPacket(23, 8); + field2231 = new ClientPacket(24, 3); + field2204 = new ClientPacket(25, -1); + field2205 = new ClientPacket(26, 9); + field2206 = new ClientPacket(27, 11); + field2207 = new ClientPacket(28, -2); + field2208 = new ClientPacket(29, 7); + field2200 = new ClientPacket(30, 7); + field2210 = new ClientPacket(31, 0); + field2211 = new ClientPacket(32, 8); + field2201 = new ClientPacket(33, -1); + field2213 = new ClientPacket(34, -1); + field2214 = new ClientPacket(35, 7); + field2180 = new ClientPacket(36, 9); + field2216 = new ClientPacket(37, 6); + field2217 = new ClientPacket(38, 9); + field2218 = new ClientPacket(39, 8); + field2219 = new ClientPacket(40, 8); + field2179 = new ClientPacket(41, 2); + field2238 = new ClientPacket(42, 0); + field2222 = new ClientPacket(43, 2); + field2190 = new ClientPacket(44, 8); + field2224 = new ClientPacket(45, 7); + field2225 = new ClientPacket(46, 3); + field2226 = new ClientPacket(47, 16); + field2227 = new ClientPacket(48, -1); + field2280 = new ClientPacket(49, 0); + field2229 = new ClientPacket(50, 3); + field2230 = new ClientPacket(51, -2); + field2273 = new ClientPacket(52, 8); + field2232 = new ClientPacket(53, 10); + field2233 = new ClientPacket(54, 11); + field2258 = new ClientPacket(55, 8); + field2235 = new ClientPacket(56, 3); + field2236 = new ClientPacket(57, 3); + field2237 = new ClientPacket(58, 8); + field2261 = new ClientPacket(59, 2); + field2239 = new ClientPacket(60, 4); + field2247 = new ClientPacket(61, -1); + field2185 = new ClientPacket(62, 8); + field2242 = new ClientPacket(63, 16); + field2243 = new ClientPacket(64, -1); + field2244 = new ClientPacket(65, 7); + field2245 = new ClientPacket(66, 0); + field2246 = new ClientPacket(67, -1); + field2215 = new ClientPacket(68, 8); + field2248 = new ClientPacket(69, 8); + field2255 = new ClientPacket(70, -1); + field2250 = new ClientPacket(71, 8); + field2251 = new ClientPacket(72, 3); + field2249 = new ClientPacket(73, 15); + field2253 = new ClientPacket(74, 8); + field2254 = new ClientPacket(75, 13); + field2257 = new ClientPacket(76, 5); + field2241 = new ClientPacket(77, 14); + field2234 = new ClientPacket(78, 3); + field2270 = new ClientPacket(79, 7); + field2259 = new ClientPacket(80, 8); + field2221 = new ClientPacket(81, 4); + field2260 = new ClientPacket(82, 8); + field2262 = new ClientPacket(83, 2); + field2263 = new ClientPacket(84, 8); + field2264 = new ClientPacket(85, 13); + field2265 = new ClientPacket(86, 0); + field2266 = new ClientPacket(87, -1); + field2267 = new ClientPacket(88, -1); + field2268 = new ClientPacket(89, 3); + field2269 = new ClientPacket(90, 7); + field2276 = new ClientPacket(91, 8); + field2271 = new ClientPacket(92, 4); + field2272 = new ClientPacket(93, 3); + field2203 = new ClientPacket(94, 7); + field2274 = new ClientPacket(95, 16); + field2275 = new ClientPacket(96, -1); + field2223 = new ClientPacket(97, 13); + field2194 = new ClientPacket(98, 8); + field2278 = new ClientPacket(99, 7); + field2240 = new ClientPacket(100, 7); } ClientPacket(int var1, int var2) { @@ -635,79 +643,428 @@ public class ClientPacket implements class181 { this.length = var2; } - @ObfuscatedName("z") + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(Lkf;II)V", + garbageValue = "1627354797" + ) + @Export("readPlayerUpdate") + static void readPlayerUpdate(PacketBuffer var0, int var1) { + boolean var2 = var0.readBits(1) == 1; + if (var2) { + Players.Players_pendingUpdateIndices[++Players.Players_pendingUpdateCount - 1] = var1; + } + + int var3 = var0.readBits(2); + Player var4 = Client.players[var1]; + if (var3 == 0) { + if (var2) { + var4.field606 = false; + } else if (Client.localPlayerIndex == var1) { + throw new RuntimeException(); + } else { + Players.Players_regions[var1] = (var4.plane << 28) + (HealthBar.baseY * 64 + var4.pathY[0] >> 13) + (UserComparator8.baseX * 64 + var4.pathX[0] >> 13 << 14); + if (var4.field934 != -1) { + Players.Players_orientations[var1] = var4.field934; + } else { + Players.Players_orientations[var1] = var4.orientation; + } + + Players.Players_targetIndices[var1] = var4.targetIndex; + Client.players[var1] = null; + if (var0.readBits(1) != 0) { + class247.updateExternalPlayer(var0, var1); + } + + } + } else { + int var5; + int var6; + int var7; + if (var3 == 1) { + var5 = var0.readBits(3); + var6 = var4.pathX[0]; + var7 = var4.pathY[0]; + if (var5 == 0) { + --var6; + --var7; + } else if (var5 == 1) { + --var7; + } else if (var5 == 2) { + ++var6; + --var7; + } else if (var5 == 3) { + --var6; + } else if (var5 == 4) { + ++var6; + } else if (var5 == 5) { + --var6; + ++var7; + } else if (var5 == 6) { + ++var7; + } else if (var5 == 7) { + ++var6; + ++var7; + } + + if (Client.localPlayerIndex != var1 || var4.x >= 1536 && var4.y >= 1536 && var4.x < 11776 && var4.y < 11776) { + if (var2) { + var4.field606 = true; + var4.tileX = var6; + var4.tileY = var7; + } else { + var4.field606 = false; + var4.method1334(var6, var7, Players.field1228[var1]); + } + } else { + var4.resetPath(var6, var7); + var4.field606 = false; + } + + } else if (var3 == 2) { + var5 = var0.readBits(4); + var6 = var4.pathX[0]; + var7 = var4.pathY[0]; + if (var5 == 0) { + var6 -= 2; + var7 -= 2; + } else if (var5 == 1) { + --var6; + var7 -= 2; + } else if (var5 == 2) { + var7 -= 2; + } else if (var5 == 3) { + ++var6; + var7 -= 2; + } else if (var5 == 4) { + var6 += 2; + var7 -= 2; + } else if (var5 == 5) { + var6 -= 2; + --var7; + } else if (var5 == 6) { + var6 += 2; + --var7; + } else if (var5 == 7) { + var6 -= 2; + } else if (var5 == 8) { + var6 += 2; + } else if (var5 == 9) { + var6 -= 2; + ++var7; + } else if (var5 == 10) { + var6 += 2; + ++var7; + } else if (var5 == 11) { + var6 -= 2; + var7 += 2; + } else if (var5 == 12) { + --var6; + var7 += 2; + } else if (var5 == 13) { + var7 += 2; + } else if (var5 == 14) { + ++var6; + var7 += 2; + } else if (var5 == 15) { + var6 += 2; + var7 += 2; + } + + if (Client.localPlayerIndex == var1 && (var4.x < 1536 || var4.y < 1536 || var4.x >= 11776 || var4.y >= 11776)) { + var4.resetPath(var6, var7); + var4.field606 = false; + } else if (var2) { + var4.field606 = true; + var4.tileX = var6; + var4.tileY = var7; + } else { + var4.field606 = false; + var4.method1334(var6, var7, Players.field1228[var1]); + } + + } else { + var5 = var0.readBits(1); + int var8; + int var9; + int var10; + int var11; + if (var5 == 0) { + var6 = var0.readBits(12); + var7 = var6 >> 10; + var8 = var6 >> 5 & 31; + if (var8 > 15) { + var8 -= 32; + } + + var9 = var6 & 31; + if (var9 > 15) { + var9 -= 32; + } + + var10 = var8 + var4.pathX[0]; + var11 = var9 + var4.pathY[0]; + if (Client.localPlayerIndex != var1 || var4.x >= 1536 && var4.y >= 1536 && var4.x < 11776 && var4.y < 11776) { + if (var2) { + var4.field606 = true; + var4.tileX = var10; + var4.tileY = var11; + } else { + var4.field606 = false; + var4.method1334(var10, var11, Players.field1228[var1]); + } + } else { + var4.resetPath(var10, var11); + var4.field606 = false; + } + + var4.plane = (byte)(var7 + var4.plane & 3); + if (Client.localPlayerIndex == var1) { + Player.Scene_plane = var4.Scene_plane; + } + + } else { + var6 = var0.readBits(30); + var7 = var6 >> 28; + var8 = var6 >> 14 & 16383; + var9 = var6 & 16383; + var10 = (UserComparator8.baseX * 64 + var8 + var4.pathX[0] & 16383) - UserComparator8.baseX * 64; + var11 = (HealthBar.baseY * 64 + var9 + var4.pathY[0] & 16383) - HealthBar.baseY * 64; + if (Client.localPlayerIndex != var1 || var4.x >= 1536 && var4.y >= 1536 && var4.x < 11776 && var4.y < 11776) { + if (var2) { + var4.field606 = true; + var4.tileX = var10; + var4.tileY = var11; + } else { + var4.field606 = false; + var4.method1334(var10, var11, Players.field1228[var1]); + } + } else { + var4.resetPath(var10, var11); + var4.field606 = false; + } + + var4.plane = (byte)(var7 + var4.plane & 3); + if (Client.localPlayerIndex == var1) { + Player.Scene_plane = var4.plane; + } + + } + } + } + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(Lhq;Ljava/lang/String;Ljava/lang/String;I)Llw;", + garbageValue = "-210604118" + ) + @Export("SpriteBuffer_getIndexedSpriteByName") + public static IndexedSprite SpriteBuffer_getIndexedSpriteByName(AbstractArchive var0, String var1, String var2) { + int var3 = var0.getGroupId(var1); + int var4 = var0.getFileId(var3, var2); + return WorldMapAreaData.method762(var0, var3, var4); + } + + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "(CB)Z", + garbageValue = "64" + ) + @Export("isDigit") + public static boolean isDigit(char var0) { + return var0 >= '0' && var0 <= '9'; + } + + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "470229947" + garbageValue = "2065171333" ) - static void method3581() { - for (ObjectSound var0 = (ObjectSound)ObjectSound.objectSounds.last(); var0 != null; var0 = (ObjectSound)ObjectSound.objectSounds.previous()) { - if (var0.stream1 != null) { - WorldMapLabelSize.pcmStreamMixer.removeSubStream(var0.stream1); - var0.stream1 = null; - } - - if (var0.stream2 != null) { - WorldMapLabelSize.pcmStreamMixer.removeSubStream(var0.stream2); - var0.stream2 = null; - } - } - - ObjectSound.objectSounds.clear(); - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(ZZI)Llp;", - garbageValue = "-1999354479" - ) - static IndexedSprite method3578(boolean var0, boolean var1) { - return var0 ? (var1 ? Login.field1163 : class42.options_buttons_2Sprite) : (var1 ? ClientPreferences.field1046 : class195.options_buttons_0Sprite); - } - - @ObfuscatedName("h") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-2131546736" - ) - static int method3579(int var0, Script var1, boolean var2) { - Widget var3; - if (var0 >= 2000) { - var0 -= 1000; - var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + static void method3764() { + Login.Login_username = Login.Login_username.trim(); + if (Login.Login_username.length() == 0) { + GrandExchangeOffer.setLoginResponseString("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); } else { - var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - } - - if (var0 == ScriptOpcodes.CC_CALLONRESIZE) { - if (Interpreter.field1089 >= 10) { - throw new RuntimeException(); - } else if (var3.onResize == null) { - return 0; + long var1 = SecureRandomCallable.method1225(); + byte var0; + if (var1 == 0L) { + var0 = 5; } else { - ScriptEvent var4 = new ScriptEvent(); - var4.widget = var3; - var4.args = var3.onResize; - var4.field568 = Interpreter.field1089 + 1; - Client.scriptEvents.addFirst(var4); - return 1; + String var4 = Login.Login_username; + Random var5 = new Random(); + Buffer var6 = new Buffer(128); + Buffer var7 = new Buffer(128); + int[] var8 = new int[]{var5.nextInt(), var5.nextInt(), (int)(var1 >> 32), (int)var1}; + var6.writeByte(10); + + int var9; + for (var9 = 0; var9 < 4; ++var9) { + var6.writeInt(var5.nextInt()); + } + + var6.writeInt(var8[0]); + var6.writeInt(var8[1]); + var6.writeLong(var1); + var6.writeLong(0L); + + for (var9 = 0; var9 < 4; ++var9) { + var6.writeInt(var5.nextInt()); + } + + var6.encryptRsa(class80.field1119, class80.field1120); + var7.writeByte(10); + + for (var9 = 0; var9 < 3; ++var9) { + var7.writeInt(var5.nextInt()); + } + + var7.writeLong(var5.nextLong()); + var7.writeLongMedium(var5.nextLong()); + if (Client.randomDatData != null) { + var7.writeBytes(Client.randomDatData, 0, Client.randomDatData.length); + } else { + byte[] var10 = new byte[24]; + + try { + JagexCache.JagexCache_randomDat.seek(0L); + JagexCache.JagexCache_randomDat.readFully(var10); + + int var11; + for (var11 = 0; var11 < 24 && var10[var11] == 0; ++var11) { + } + + if (var11 >= 24) { + throw new IOException(); + } + } catch (Exception var25) { + for (int var12 = 0; var12 < 24; ++var12) { + var10[var12] = -1; + } + } + + var7.writeBytes(var10, 0, var10.length); + } + + var7.writeLong(var5.nextLong()); + var7.encryptRsa(class80.field1119, class80.field1120); + var9 = UserComparator6.stringCp1252NullTerminatedByteSize(var4); + if (var9 % 8 != 0) { + var9 += 8 - var9 % 8; + } + + Buffer var26 = new Buffer(var9); + var26.writeStringCp1252NullTerminated(var4); + var26.offset = var9; + var26.xteaEncryptAll(var8); + Buffer var20 = new Buffer(var7.offset + var6.offset + var26.offset + 5); + var20.writeByte(2); + var20.writeByte(var6.offset); + var20.writeBytes(var6.array, 0, var6.offset); + var20.writeByte(var7.offset); + var20.writeBytes(var7.array, 0, var7.offset); + var20.writeShort(var26.offset); + var20.writeBytes(var26.array, 0, var26.offset); + byte[] var13 = var20.array; + String var22 = ItemContainer.method1252(var13, 0, var13.length); + String var14 = var22; + + byte var3; + try { + URL var15 = new URL(WorldMapElement.method4547("services", false) + "m=accountappeal/login.ws"); + URLConnection var16 = var15.openConnection(); + var16.setDoInput(true); + var16.setDoOutput(true); + var16.setConnectTimeout(5000); + OutputStreamWriter var17 = new OutputStreamWriter(var16.getOutputStream()); + var17.write("data2=" + class312.method6014(var14) + "&dest=" + class312.method6014("passwordchoice.ws")); + var17.flush(); + InputStream var18 = var16.getInputStream(); + var20 = new Buffer(new byte[1000]); + + while (true) { + int var19 = var18.read(var20.array, var20.offset, 1000 - var20.offset); + if (var19 == -1) { + var17.close(); + var18.close(); + String var23 = new String(var20.array); + if (var23.startsWith("OFFLINE")) { + var3 = 4; + } else if (var23.startsWith("WRONG")) { + var3 = 7; + } else if (var23.startsWith("RELOAD")) { + var3 = 3; + } else if (var23.startsWith("Not permitted for social network accounts.")) { + var3 = 6; + } else { + var20.xteaDecryptAll(var8); + + while (var20.offset > 0 && var20.array[var20.offset - 1] == 0) { + --var20.offset; + } + + var23 = new String(var20.array, 0, var20.offset); + if (SequenceDefinition.isValidURL(var23)) { + class2.openURL(var23, true, false); + var3 = 2; + } else { + var3 = 5; + } + } + break; + } + + var20.offset += var19; + if (var20.offset >= 1000) { + var3 = 5; + break; + } + } + } catch (Throwable var24) { + var24.printStackTrace(); + var3 = 5; + } + + var0 = var3; } - } else { - return 2; + + switch(var0) { + case 2: + GrandExchangeOffer.setLoginResponseString(Strings.field2894, Strings.field3013, Strings.field3014); + Login.loginIndex = 6; + break; + case 3: + GrandExchangeOffer.setLoginResponseString("", "Error connecting to server.", ""); + break; + case 4: + GrandExchangeOffer.setLoginResponseString("The part of the website you are trying", "to connect to is offline at the moment.", "Please try again later."); + break; + case 5: + GrandExchangeOffer.setLoginResponseString("Sorry, there was an error trying to", "log you in to this part of the website.", "Please try again later."); + break; + case 6: + GrandExchangeOffer.setLoginResponseString("", "Error connecting to server.", ""); + break; + case 7: + GrandExchangeOffer.setLoginResponseString("You must enter a valid login to proceed. For accounts", "created after 24th November 2010, please use your", "email address. Otherwise please use your username."); + } + } } - @ObfuscatedName("fc") + @ObfuscatedName("ij") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "-1614691379" + signature = "(B)V", + garbageValue = "-78" ) - @Export("playSoundJingle") - static void playSoundJingle(int var0, int var1) { - if (Client.field761 != 0 && var0 != -1) { - class83.method2068(ClanMate.archive11, var0, 0, Client.field761, false); - Client.field759 = true; - } - + @Export("addCancelMenuEntry") + static void addCancelMenuEntry() { + Client.menuOptionsCount = 0; + Client.isMenuOpen = false; + Client.menuActions[0] = "Cancel"; + Client.menuTargets[0] = ""; + Client.menuOpcodes[0] = 1006; + Client.menuShiftClick[0] = false; + Client.menuOptionsCount = 1; } } diff --git a/runescape-client/src/main/java/ClientPreferences.java b/runescape-client/src/main/java/ClientPreferences.java index a898be3106..95cb2f1f53 100644 --- a/runescape-client/src/main/java/ClientPreferences.java +++ b/runescape-client/src/main/java/ClientPreferences.java @@ -7,45 +7,34 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bl") +@ObfuscatedName("bw") @Implements("ClientPreferences") public class ClientPreferences { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -1035730115 + intValue = 1383703517 ) @Export("ClientPreferences_optionCount") static int ClientPreferences_optionCount; - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "Lhp;" - ) - @Export("Widget_spritesArchive") - static AbstractArchive Widget_spritesArchive; - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Llp;" - ) - static IndexedSprite field1046; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("roofsHidden") boolean roofsHidden; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("titleMusicDisabled") boolean titleMusicDisabled; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1970428567 + intValue = 1268365417 ) @Export("windowMode") int windowMode; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("rememberedUsername") String rememberedUsername; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("hideUsername") boolean hideUsername; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("parameters") LinkedHashMap parameters; @@ -58,11 +47,11 @@ public class ClientPreferences { this.rememberedUsername = null; this.hideUsername = false; this.parameters = new LinkedHashMap(); - this.method1851(true); + this.method1957(true); } @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) ClientPreferences(Buffer var1) { this.windowMode = 1; @@ -102,26 +91,26 @@ public class ClientPreferences { this.hideUsername = var1.readBoolean(); } } else { - this.method1851(true); + this.method1957(true); } } else { - this.method1851(true); + this.method1957(true); } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "864937253" + garbageValue = "271600309" ) - void method1851(boolean var1) { + void method1957(boolean var1) { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Lkl;", - garbageValue = "-630561096" + signature = "(I)Lkc;", + garbageValue = "1659906273" ) @Export("toBuffer") Buffer toBuffer() { @@ -144,141 +133,13 @@ public class ClientPreferences { return var1; } - @ObfuscatedName("r") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-70" + signature = "(Ljava/lang/CharSequence;I)I", + garbageValue = "1282610090" ) - static void method1861() { - Players.Players_count = 0; - - for (int var0 = 0; var0 < 2048; ++var0) { - Players.field1236[var0] = null; - Players.field1235[var0] = 1; - } - - } - - @ObfuscatedName("jb") - @ObfuscatedSignature( - signature = "(Lho;IIII)V", - garbageValue = "1173230125" - ) - @Export("drawMinimap") - static final void drawMinimap(Widget var0, int var1, int var2, int var3) { - WorldMapID.playPcmPlayers(); - SpriteMask var4 = var0.getSpriteMask(false); - if (var4 != null) { - Rasterizer2D.Rasterizer2D_setClip(var1, var2, var4.width + var1, var2 + var4.height); - if (Client.minimapState != 2 && Client.minimapState != 5) { - int var5 = Client.camAngleY & 2047; - int var6 = class223.localPlayer.x / 32 + 48; - int var7 = 464 - class223.localPlayer.y / 32; - ObjectSound.sceneMinimapSprite.drawRotatedMaskedCenteredAround(var1, var2, var4.width, var4.height, var6, var7, var5, 256, var4.xStarts, var4.xWidths); - - int var8; - int var9; - int var10; - for (var8 = 0; var8 < Client.mapIconCount; ++var8) { - var9 = Client.mapIconXs[var8] * 4 + 2 - class223.localPlayer.x / 32; - var10 = Client.mapIconYs[var8] * 4 + 2 - class223.localPlayer.y / 32; - class208.drawSpriteOnMinimap(var1, var2, var9, var10, Client.mapIcons[var8], var4); - } - - int var11; - int var12; - for (var8 = 0; var8 < 104; ++var8) { - for (var9 = 0; var9 < 104; ++var9) { - NodeDeque var15 = Client.groundItems[WorldMapRectangle.plane][var8][var9]; - if (var15 != null) { - var11 = var8 * 4 + 2 - class223.localPlayer.x / 32; - var12 = var9 * 4 + 2 - class223.localPlayer.y / 32; - class208.drawSpriteOnMinimap(var1, var2, var11, var12, class13.mapDotSprites[0], var4); - } - } - } - - for (var8 = 0; var8 < Client.npcCount; ++var8) { - NPC var16 = Client.npcs[Client.npcIndices[var8]]; - if (var16 != null && var16.isVisible()) { - NPCDefinition var18 = var16.definition; - if (var18 != null && var18.transforms != null) { - var18 = var18.transform(); - } - - if (var18 != null && var18.drawMapDot && var18.isInteractable) { - var11 = var16.x / 32 - class223.localPlayer.x / 32; - var12 = var16.y / 32 - class223.localPlayer.y / 32; - class208.drawSpriteOnMinimap(var1, var2, var11, var12, class13.mapDotSprites[1], var4); - } - } - } - - var8 = Players.Players_count; - int[] var19 = Players.Players_indices; - - for (var10 = 0; var10 < var8; ++var10) { - Player var17 = Client.players[var19[var10]]; - if (var17 != null && var17.isVisible() && !var17.isHidden && var17 != class223.localPlayer) { - var12 = var17.x / 32 - class223.localPlayer.x / 32; - int var13 = var17.y / 32 - class223.localPlayer.y / 32; - boolean var14 = false; - if (class223.localPlayer.team != 0 && var17.team != 0 && var17.team == class223.localPlayer.team) { - var14 = true; - } - - if (var17.isFriend()) { - class208.drawSpriteOnMinimap(var1, var2, var12, var13, class13.mapDotSprites[3], var4); - } else if (var14) { - class208.drawSpriteOnMinimap(var1, var2, var12, var13, class13.mapDotSprites[4], var4); - } else if (var17.isClanMember()) { - class208.drawSpriteOnMinimap(var1, var2, var12, var13, class13.mapDotSprites[5], var4); - } else { - class208.drawSpriteOnMinimap(var1, var2, var12, var13, class13.mapDotSprites[2], var4); - } - } - } - - if (Client.hintArrowType != 0 && Client.cycle % 20 < 10) { - if (Client.hintArrowType == 1 && Client.hintArrowNpcIndex >= 0 && Client.hintArrowNpcIndex < Client.npcs.length) { - NPC var20 = Client.npcs[Client.hintArrowNpcIndex]; - if (var20 != null) { - var11 = var20.x / 32 - class223.localPlayer.x / 32; - var12 = var20.y / 32 - class223.localPlayer.y / 32; - FloorDecoration.worldToMinimap(var1, var2, var11, var12, GameObject.mapMarkerSprites[1], var4); - } - } - - if (Client.hintArrowType == 2) { - var10 = Client.hintArrowX * 4 - class223.baseX * 256 + 2 - class223.localPlayer.x / 32; - var11 = Client.hintArrowY * 4 - class286.baseY * 256 + 2 - class223.localPlayer.y / 32; - FloorDecoration.worldToMinimap(var1, var2, var10, var11, GameObject.mapMarkerSprites[1], var4); - } - - if (Client.hintArrowType == 10 && Client.hintArrowPlayerIndex >= 0 && Client.hintArrowPlayerIndex < Client.players.length) { - Player var21 = Client.players[Client.hintArrowPlayerIndex]; - if (var21 != null) { - var11 = var21.x / 32 - class223.localPlayer.x / 32; - var12 = var21.y / 32 - class223.localPlayer.y / 32; - FloorDecoration.worldToMinimap(var1, var2, var11, var12, GameObject.mapMarkerSprites[1], var4); - } - } - } - - if (Client.destinationX != 0) { - var10 = Client.destinationX * 4 + 2 - class223.localPlayer.x / 32; - var11 = Client.destinationY * 4 + 2 - class223.localPlayer.y / 32; - class208.drawSpriteOnMinimap(var1, var2, var10, var11, GameObject.mapMarkerSprites[0], var4); - } - - if (!class223.localPlayer.isHidden) { - Rasterizer2D.Rasterizer2D_fillRectangle(var4.width / 2 + var1 - 1, var4.height / 2 + var2 - 1, 3, 3, 16777215); - } - } else { - Rasterizer2D.Rasterizer2D_fillMaskedRectangle(var1, var2, 0, var4.xStarts, var4.xWidths); - } - - Client.field842[var3] = true; - } + @Export("parseInt") + public static int parseInt(CharSequence var0) { + return class192.parseIntCustomRadix(var0, 10, true); } } diff --git a/runescape-client/src/main/java/ClientType.java b/runescape-client/src/main/java/ClientType.java deleted file mode 100644 index be8cae3aba..0000000000 --- a/runescape-client/src/main/java/ClientType.java +++ /dev/null @@ -1,16 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; -import net.runelite.mapping.ObfuscatedName; - -@ObfuscatedName("ln") -@Implements("ClientType") -public class ClientType -{ - @ObfuscatedName("u") - @ObfuscatedGetter( - intValue = 2052078695 - ) - @Export("clientType") - public static int clientType; -} diff --git a/runescape-client/src/main/java/Clock.java b/runescape-client/src/main/java/Clock.java index 9a75c1c971..49850f433d 100644 --- a/runescape-client/src/main/java/Clock.java +++ b/runescape-client/src/main/java/Clock.java @@ -4,68 +4,177 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fz") +@ObfuscatedName("fk") @Implements("Clock") public abstract class Clock { - @ObfuscatedName("qq") + @ObfuscatedName("ro") @ObfuscatedGetter( - intValue = 1800617984 + intValue = -578402437 ) - static int field2039; + static int field2036; + @ObfuscatedName("ly") + @ObfuscatedGetter( + intValue = -568224545 + ) + @Export("selectedSpellWidget") + static int selectedSpellWidget; Clock() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-54" + signature = "(I)V", + garbageValue = "1605126906" ) @Export("mark") public abstract void mark(); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(III)I", - garbageValue = "569029249" + garbageValue = "432238723" ) @Export("wait") public abstract int wait(int var1, int var2); - @ObfuscatedName("m") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "1663360326" + signature = "(Lhq;Lhq;Lhq;Lgg;I)Z", + garbageValue = "654132136" ) - @Export("Messages_getLastChatID") - static int Messages_getLastChatID(int var0) { - Message var1 = (Message)Messages.Messages_hashTable.get((long)var0); - if (var1 == null) { - return -1; + public static boolean method3641(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2, MidiPcmStream var3) { + class197.musicPatchesArchive = var0; + class197.musicSamplesArchive = var1; + class197.soundEffectsArchive = var2; + class197.midiPcmStream = var3; + return true; + } + + @ObfuscatedName("hv") + @ObfuscatedSignature( + signature = "(ZLkf;I)V", + garbageValue = "900111549" + ) + @Export("loadRegions") + static final void loadRegions(boolean var0, PacketBuffer var1) { + Client.isInInstance = var0; + int var2; + int var4; + int var5; + int var6; + int var7; + int var8; + if (!Client.isInInstance) { + var2 = var1.method5646(); + int var3 = var1.readUnsignedShort(); + var4 = var1.readUnsignedShort(); + ClientPacket.xteaKeys = new int[var4][4]; + + for (var5 = 0; var5 < var4; ++var5) { + for (var6 = 0; var6 < 4; ++var6) { + ClientPacket.xteaKeys[var5][var6] = var1.readInt(); + } + } + + GrandExchangeOfferOwnWorldComparator.regions = new int[var4]; + class338.regionMapArchiveIds = new int[var4]; + WorldMapCacheName.regionLandArchiveIds = new int[var4]; + UrlRequester.regionLandArchives = new byte[var4][]; + UserComparator3.regionMapArchives = new byte[var4][]; + boolean var16 = false; + if ((var3 / 8 == 48 || var3 / 8 == 49) && var2 / 8 == 48) { + var16 = true; + } + + if (var3 / 8 == 48 && var2 / 8 == 148) { + var16 = true; + } + + var4 = 0; + + for (var6 = (var3 - 6) / 8; var6 <= (var3 + 6) / 8; ++var6) { + for (var7 = (var2 - 6) / 8; var7 <= (var2 + 6) / 8; ++var7) { + var8 = var7 + (var6 << 8); + if (!var16 || var7 != 49 && var7 != 149 && var7 != 147 && var6 != 50 && (var6 != 49 || var7 != 47)) { + GrandExchangeOfferOwnWorldComparator.regions[var4] = var8; + class338.regionMapArchiveIds[var4] = WorldMapRectangle.archive5.getGroupId("m" + var6 + "_" + var7); + WorldMapCacheName.regionLandArchiveIds[var4] = WorldMapRectangle.archive5.getGroupId("l" + var6 + "_" + var7); + ++var4; + } + } + } + + WorldMapSectionType.method290(var3, var2, true); } else { - return var1.nextDual == Messages.Messages_queue.sentinel ? -1 : ((Message)var1.nextDual).count; + var2 = var1.method5648(); + boolean var15 = var1.method5622() == 1; + var4 = var1.method5647(); + var5 = var1.readUnsignedShort(); + var1.importIndex(); + + int var9; + for (var6 = 0; var6 < 4; ++var6) { + for (var7 = 0; var7 < 13; ++var7) { + for (var8 = 0; var8 < 13; ++var8) { + var9 = var1.readBits(1); + if (var9 == 1) { + Client.instanceChunkTemplates[var6][var7][var8] = var1.readBits(26); + } else { + Client.instanceChunkTemplates[var6][var7][var8] = -1; + } + } + } + } + + var1.exportIndex(); + ClientPacket.xteaKeys = new int[var5][4]; + + for (var6 = 0; var6 < var5; ++var6) { + for (var7 = 0; var7 < 4; ++var7) { + ClientPacket.xteaKeys[var6][var7] = var1.readInt(); + } + } + + GrandExchangeOfferOwnWorldComparator.regions = new int[var5]; + class338.regionMapArchiveIds = new int[var5]; + WorldMapCacheName.regionLandArchiveIds = new int[var5]; + UrlRequester.regionLandArchives = new byte[var5][]; + UserComparator3.regionMapArchives = new byte[var5][]; + var5 = 0; + + for (var6 = 0; var6 < 4; ++var6) { + for (var7 = 0; var7 < 13; ++var7) { + for (var8 = 0; var8 < 13; ++var8) { + var9 = Client.instanceChunkTemplates[var6][var7][var8]; + if (var9 != -1) { + int var10 = var9 >> 14 & 1023; + int var11 = var9 >> 3 & 2047; + int var12 = (var10 / 8 << 8) + var11 / 8; + + int var13; + for (var13 = 0; var13 < var5; ++var13) { + if (GrandExchangeOfferOwnWorldComparator.regions[var13] == var12) { + var12 = -1; + break; + } + } + + if (var12 != -1) { + GrandExchangeOfferOwnWorldComparator.regions[var5] = var12; + var13 = var12 >> 8 & 255; + int var14 = var12 & 255; + class338.regionMapArchiveIds[var5] = WorldMapRectangle.archive5.getGroupId("m" + var13 + "_" + var14); + WorldMapCacheName.regionLandArchiveIds[var5] = WorldMapRectangle.archive5.getGroupId("l" + var13 + "_" + var14); + ++var5; + } + } + } + } + } + + WorldMapSectionType.method290(var4, var2, !var15); } - } - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1644538233" - ) - static final int method3463() { - return ViewportMouse.ViewportMouse_x; - } - - @ObfuscatedName("hf") - @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "-31" - ) - @Export("resumePauseWidget") - static void resumePauseWidget(int var0, int var1) { - PacketBufferNode var2 = InterfaceParent.getPacketBufferNode(ClientPacket.field2185, Client.packetWriter.isaacCipher); - var2.packetBuffer.writeIntLE16(var0); - var2.packetBuffer.writeShort(var1); - Client.packetWriter.addNode(var2); } } diff --git a/runescape-client/src/main/java/CollisionMap.java b/runescape-client/src/main/java/CollisionMap.java index 7d225843df..176b7afa2c 100644 --- a/runescape-client/src/main/java/CollisionMap.java +++ b/runescape-client/src/main/java/CollisionMap.java @@ -1,38 +1,39 @@ -import java.awt.Component; +import java.io.File; +import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fa") +@ObfuscatedName("fm") @Implements("CollisionMap") public class CollisionMap { - @ObfuscatedName("ax") + @ObfuscatedName("av") @ObfuscatedGetter( - intValue = 2078354851 + intValue = 1716548279 ) @Export("xInset") int xInset; - @ObfuscatedName("as") + @ObfuscatedName("am") @ObfuscatedGetter( - intValue = -518382829 + intValue = 100209491 ) @Export("yInset") int yInset; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = 1308792903 + intValue = -1893583227 ) @Export("xSize") int xSize; - @ObfuscatedName("al") + @ObfuscatedName("ax") @ObfuscatedGetter( - intValue = -888202655 + intValue = 430347067 ) @Export("ySize") int ySize; - @ObfuscatedName("ad") + @ObfuscatedName("al") @Export("flags") public int[][] flags; @@ -45,10 +46,10 @@ public class CollisionMap { this.clear(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "11" + signature = "(I)V", + garbageValue = "-418924176" ) @Export("clear") public void clear() { @@ -64,12 +65,12 @@ public class CollisionMap { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIIIZI)V", - garbageValue = "1400659630" + garbageValue = "-622707761" ) - public void method3508(int var1, int var2, int var3, int var4, boolean var5) { + public void method3685(int var1, int var2, int var3, int var4, boolean var5) { var1 -= this.xInset; var2 -= this.yInset; if (var3 == 0) { @@ -216,10 +217,10 @@ public class CollisionMap { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IIIIZI)V", - garbageValue = "1277713715" + signature = "(IIIIZS)V", + garbageValue = "463" ) @Export("addGameObject") public void addGameObject(int var1, int var2, int var3, int var4, boolean var5) { @@ -243,10 +244,10 @@ public class CollisionMap { } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "-691975667" + garbageValue = "-712245850" ) @Export("setBlockedByFloor") public void setBlockedByFloor(int var1, int var2) { @@ -256,10 +257,10 @@ public class CollisionMap { var10000[var2] |= 2097152; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "-119630021" + garbageValue = "1787525972" ) @Export("setBlockedByFloorDec") public void setBlockedByFloorDec(int var1, int var2) { @@ -269,10 +270,10 @@ public class CollisionMap { var10000[var2] |= 262144; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IIIB)V", - garbageValue = "-3" + signature = "(IIII)V", + garbageValue = "-1353999324" ) @Export("setFlag") void setFlag(int var1, int var2, int var3) { @@ -280,12 +281,12 @@ public class CollisionMap { var10000[var2] |= var3; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(IIIIZI)V", - garbageValue = "1060838313" + garbageValue = "343029197" ) - public void method3514(int var1, int var2, int var3, int var4, boolean var5) { + public void method3690(int var1, int var2, int var3, int var4, boolean var5) { var1 -= this.xInset; var2 -= this.yInset; if (var3 == 0) { @@ -432,10 +433,10 @@ public class CollisionMap { } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(IIIIIZI)V", - garbageValue = "-476929644" + signature = "(IIIIIZB)V", + garbageValue = "16" ) @Export("setFlagOffNonSquare") public void setFlagOffNonSquare(int var1, int var2, int var3, int var4, int var5, boolean var6) { @@ -465,10 +466,10 @@ public class CollisionMap { } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(IIIB)V", - garbageValue = "6" + signature = "(IIII)V", + garbageValue = "-840002361" ) @Export("setFlagOff") void setFlagOff(int var1, int var2, int var3) { @@ -476,54 +477,56 @@ public class CollisionMap { var10000[var2] &= ~var3; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(IIS)V", - garbageValue = "-6856" + garbageValue = "-31094" ) - public void method3517(int var1, int var2) { + public void method3693(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; int[] var10000 = this.flags[var1]; var10000[var2] &= -262145; } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(I[BLkg;I)V", - garbageValue = "1190241493" - ) - static void method3536(int var0, byte[] var1, ArchiveDisk var2) { - ArchiveDiskAction var3 = new ArchiveDiskAction(); - var3.type = 0; - var3.key = (long)var0; - var3.data = var1; - var3.archiveDisk = var2; - synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue) { - ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.addFirst(var3); - } - - synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock) { - if (ArchiveDiskActionHandler.field3127 == 0) { - UserComparator5.ArchiveDiskActionHandler_thread = new Thread(new ArchiveDiskActionHandler()); - UserComparator5.ArchiveDiskActionHandler_thread.setDaemon(true); - UserComparator5.ArchiveDiskActionHandler_thread.start(); - UserComparator5.ArchiveDiskActionHandler_thread.setPriority(5); - } - - ArchiveDiskActionHandler.field3127 = 600; - } - } - @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljava/awt/Component;I)V", - garbageValue = "-1662439433" + signature = "(Ljava/lang/String;Ljava/lang/String;ZI)Lmh;", + garbageValue = "1385178219" ) - static void method3544(Component var0) { - var0.removeMouseListener(MouseHandler.MouseHandler_instance); - var0.removeMouseMotionListener(MouseHandler.MouseHandler_instance); - var0.removeFocusListener(MouseHandler.MouseHandler_instance); - MouseHandler.MouseHandler_currentButtonVolatile = 0; + @Export("getPreferencesFile") + public static AccessFile getPreferencesFile(String var0, String var1, boolean var2) { + File var3 = new File(JagexCache.cacheDir, "preferences" + var0 + ".dat"); + if (var3.exists()) { + try { + AccessFile var10 = new AccessFile(var3, "rw", 10000L); + return var10; + } catch (IOException var9) { + } + } + + String var4 = ""; + if (class189.cacheGamebuild == 33) { + var4 = "_rc"; + } else if (class189.cacheGamebuild == 34) { + var4 = "_wip"; + } + + File var5 = new File(class30.userHomeDirectory, "jagex_" + var1 + "_preferences" + var0 + var4 + ".dat"); + AccessFile var6; + if (!var2 && var5.exists()) { + try { + var6 = new AccessFile(var5, "rw", 10000L); + return var6; + } catch (IOException var8) { + } + } + + try { + var6 = new AccessFile(var3, "rw", 10000L); + return var6; + } catch (IOException var7) { + throw new RuntimeException(); + } } } diff --git a/runescape-client/src/main/java/Coord.java b/runescape-client/src/main/java/Coord.java index 4de7315153..d5056361f2 100644 --- a/runescape-client/src/main/java/Coord.java +++ b/runescape-client/src/main/java/Coord.java @@ -4,30 +4,42 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hb") +@ObfuscatedName("hf") @Implements("Coord") public class Coord { - @ObfuscatedName("n") + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "Lhq;" + ) + @Export("Widget_archive") + static AbstractArchive Widget_archive; + @ObfuscatedName("dv") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive15") + static Archive archive15; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 562826067 + intValue = 440805047 ) @Export("plane") public int plane; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 2054727359 + intValue = 649013739 ) @Export("x") public int x; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1032758603 + intValue = 1217821847 ) @Export("y") public int y; @ObfuscatedSignature( - signature = "(Lhb;)V" + signature = "(Lhf;)V" ) public Coord(Coord var1) { this.plane = var1.plane; @@ -52,20 +64,20 @@ public class Coord { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-444536660" + garbageValue = "-1545441296" ) @Export("packed") public int packed() { return this.plane << 28 | this.x << 14 | this.y; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lhb;I)Z", - garbageValue = "-1914028694" + signature = "(Lhf;I)Z", + garbageValue = "472807046" ) @Export("equalsCoord") boolean equalsCoord(Coord var1) { @@ -78,10 +90,10 @@ public class Coord { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)Ljava/lang/String;", - garbageValue = "-986705762" + garbageValue = "-1765692684" ) @Export("toString") String toString(String var1) { @@ -104,35 +116,53 @@ public class Coord { return this.toString(","); } - @ObfuscatedName("i") + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(IB)Lih;", + garbageValue = "-87" + ) + @Export("getEnum") + public static EnumDefinition getEnum(int var0) { + EnumDefinition var1 = (EnumDefinition)EnumDefinition.EnumDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = EnumDefinition.EnumDefinition_archive.takeFile(8, var0); + var1 = new EnumDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + + EnumDefinition.EnumDefinition_cached.put(var1, (long)var0); + return var1; + } + } + + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-2118719705" + garbageValue = "-1708484762" ) - @Export("closeWorldSelect") - static void closeWorldSelect() { - Login.worldSelectOpen = false; - WorldMapID.leftTitleSprite.drawAt(Login.xPadding, 0); - class51.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - FontName.logoSprite.drawAt(Login.xPadding + 382 - FontName.logoSprite.subWidth / 2, 18); - } - - @ObfuscatedName("jm") - @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "22280" - ) - @Export("FriendSystem_invalidateFriends") - static final void FriendSystem_invalidateFriends() { - for (int var0 = 0; var0 < Players.Players_count; ++var0) { - Player var1 = Client.players[Players.Players_indices[var0]]; - var1.clearIsFriend(); + static void method4144() { + if (Login.field1188) { + NPC.titleboxSprite = null; + UserComparator9.titlebuttonSprite = null; + class208.runesSprite = null; + Login.leftTitleSprite = null; + FontName.rightTitleSprite = null; + Tiles.logoSprite = null; + Decimator.title_muteSprite = null; + UserComparator8.options_buttons_0Sprite = null; + Login.options_buttons_2Sprite = null; + GrandExchangeEvent.worldSelectBackSprites = null; + JagexCache.worldSelectFlagSprites = null; + StudioGame.worldSelectArrows = null; + Interpreter.worldSelectStars = null; + Message.field587 = null; + Login.loginScreenRunesAnimation.method1955(); + class80.method2194(2); + UrlRequester.method3428(true); + Login.field1188 = false; } - - KeyHandler.method873(); - if (Varps.clanChat != null) { - Varps.clanChat.clearFriends(); - } - } } diff --git a/runescape-client/src/main/java/Decimator.java b/runescape-client/src/main/java/Decimator.java index 7100d34546..dd616eb1b3 100644 --- a/runescape-client/src/main/java/Decimator.java +++ b/runescape-client/src/main/java/Decimator.java @@ -4,22 +4,40 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dr") +@ObfuscatedName("do") @Implements("Decimator") public class Decimator { - @ObfuscatedName("u") + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "[Llw;" + ) + @Export("title_muteSprite") + static IndexedSprite[] title_muteSprite; + @ObfuscatedName("dx") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive11") + static Archive archive11; + @ObfuscatedName("ei") @ObfuscatedGetter( - intValue = -222965331 + intValue = -1888445625 + ) + @Export("port2") + static int port2; + @ObfuscatedName("q") + @ObfuscatedGetter( + intValue = -885023939 ) @Export("inputRate") int inputRate; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 747601715 + intValue = 929482819 ) @Export("outputRate") int outputRate; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("table") int[][] table; @@ -47,7 +65,7 @@ public class Decimator { for (int var7 = 0; var7 < var1; ++var7) { int[] var8 = this.table[var7]; double var9 = (double)var7 / (double)var1 + 6.0D; - int var11 = (int)Math.floor(var9 - 7.0D + 1.0D); + int var11 = (int)Math.floor(1.0D + (var9 - 7.0D)); if (var11 < 0) { var11 = 0; } @@ -58,24 +76,24 @@ public class Decimator { } for (double var13 = (double)var2 / (double)var1; var11 < var12; ++var11) { - double var15 = 3.141592653589793D * ((double)var11 - var9); + double var15 = ((double)var11 - var9) * 3.141592653589793D; double var17 = var13; if (var15 < -1.0E-4D || var15 > 1.0E-4D) { var17 = var13 * (Math.sin(var15) / var15); } - var17 *= 0.54D + 0.46D * Math.cos(((double)var11 - var9) * 0.2243994752564138D); - var8[var11] = (int)Math.floor(65536.0D * var17 + 0.5D); + var17 *= 0.54D + 0.46D * Math.cos(0.2243994752564138D * ((double)var11 - var9)); + var8[var11] = (int)Math.floor(0.5D + 65536.0D * var17); } } } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "([BI)[B", - garbageValue = "906746870" + garbageValue = "73782280" ) @Export("resample") byte[] resample(byte[] var1) { @@ -92,7 +110,7 @@ public class Decimator { int var9; for (var9 = 0; var9 < 14; ++var9) { - var3[var4 + var9] += var7 * var8[var9]; + var3[var4 + var9] += var8[var9] * var7; } var5 += this.outputRate; @@ -118,10 +136,10 @@ public class Decimator { return var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "1984702959" + signature = "(IB)I", + garbageValue = "30" ) @Export("scaleRate") int scaleRate(int var1) { @@ -132,104 +150,102 @@ public class Decimator { return var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "-1527580857" + signature = "(IB)I", + garbageValue = "13" ) @Export("scalePosition") int scalePosition(int var1) { if (this.table != null) { - var1 = (int)((long)var1 * (long)this.outputRate / (long)this.inputRate) + 6; + var1 = (int)((long)this.outputRate * (long)var1 / (long)this.inputRate) + 6; } return var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)Lij;", - garbageValue = "-1096040565" + signature = "(II)Liz;", + garbageValue = "1437628659" ) - @Export("WorldMapElement_get") - public static WorldMapElement WorldMapElement_get(int var0) { - return var0 >= 0 && var0 < WorldMapElement.WorldMapElement_cached.length && WorldMapElement.WorldMapElement_cached[var0] != null ? WorldMapElement.WorldMapElement_cached[var0] : new WorldMapElement(var0); - } - - @ObfuscatedName("ei") - @ObfuscatedSignature( - signature = "(I)Lla;", - garbageValue = "-695758013" - ) - @Export("getWorldMap") - static WorldMap getWorldMap() { - return Tiles.worldMap; - } - - @ObfuscatedName("hz") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "851552801" - ) - static final void method2500() { - PacketBuffer var0 = Client.packetWriter.packetBuffer; - var0.importIndex(); - int var1 = var0.readBits(8); - int var2; - if (var1 < Client.npcCount) { - for (var2 = var1; var2 < Client.npcCount; ++var2) { - Client.field758[++Client.field640 - 1] = Client.npcIndices[var2]; - } - } - - if (var1 > Client.npcCount) { - throw new RuntimeException(""); + public static VarcInt method2694(int var0) { + VarcInt var1 = (VarcInt)VarcInt.VarcInt_cached.get((long)var0); + if (var1 != null) { + return var1; } else { - Client.npcCount = 0; - - for (var2 = 0; var2 < var1; ++var2) { - int var3 = Client.npcIndices[var2]; - NPC var4 = Client.npcs[var3]; - int var5 = var0.readBits(1); - if (var5 == 0) { - Client.npcIndices[++Client.npcCount - 1] = var3; - var4.npcCycle = Client.cycle; - } else { - int var6 = var0.readBits(2); - if (var6 == 0) { - Client.npcIndices[++Client.npcCount - 1] = var3; - var4.npcCycle = Client.cycle; - Client.field681[++Client.field633 - 1] = var3; - } else { - int var7; - int var8; - if (var6 == 1) { - Client.npcIndices[++Client.npcCount - 1] = var3; - var4.npcCycle = Client.cycle; - var7 = var0.readBits(3); - var4.method2048(var7, (byte)1); - var8 = var0.readBits(1); - if (var8 == 1) { - Client.field681[++Client.field633 - 1] = var3; - } - } else if (var6 == 2) { - Client.npcIndices[++Client.npcCount - 1] = var3; - var4.npcCycle = Client.cycle; - var7 = var0.readBits(3); - var4.method2048(var7, (byte)2); - var8 = var0.readBits(3); - var4.method2048(var8, (byte)2); - int var9 = var0.readBits(1); - if (var9 == 1) { - Client.field681[++Client.field633 - 1] = var3; - } - } else if (var6 == 3) { - Client.field758[++Client.field640 - 1] = var3; - } - } - } + byte[] var2 = VarcInt.VarcInt_archive.takeFile(19, var0); + var1 = new VarcInt(); + if (var2 != null) { + var1.method4549(new Buffer(var2)); } + VarcInt.VarcInt_cached.put(var1, (long)var0); + return var1; } } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Ljava/lang/Object;ZI)[B", + garbageValue = "1813906686" + ) + @Export("serialize") + public static byte[] serialize(Object var0, boolean var1) { + if (var0 == null) { + return null; + } else if (var0 instanceof byte[]) { + byte[] var3 = (byte[])((byte[])var0); + return var1 ? Message.method1312(var3) : var3; + } else if (var0 instanceof AbstractByteArrayCopier) { + AbstractByteArrayCopier var2 = (AbstractByteArrayCopier)var0; + return var2.get(); + } else { + throw new IllegalArgumentException(); + } + } + + @ObfuscatedName("im") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "-962309215" + ) + @Export("calculateMenuBounds") + static void calculateMenuBounds(int var0, int var1) { + int var2 = class43.fontBold12.stringWidth("Choose Option"); + + int var3; + int var4; + for (var3 = 0; var3 < Client.menuOptionsCount; ++var3) { + var4 = class43.fontBold12.stringWidth(class65.method1316(var3)); + if (var4 > var2) { + var2 = var4; + } + } + + var2 += 8; + var3 = Client.menuOptionsCount * 15 + 22; + var4 = var0 - var2 / 2; + if (var2 + var4 > class286.canvasWidth) { + var4 = class286.canvasWidth - var2; + } + + if (var4 < 0) { + var4 = 0; + } + + int var5 = var1; + if (var1 + var3 > FloorUnderlayDefinition.canvasHeight) { + var5 = FloorUnderlayDefinition.canvasHeight - var3; + } + + if (var5 < 0) { + var5 = 0; + } + + MusicPatchNode.menuX = var4; + TextureProvider.menuY = var5; + KeyHandler.menuWidth = var2; + WorldMapData_1.menuHeight = Client.menuOptionsCount * 15 + 22; + } } diff --git a/runescape-client/src/main/java/DefaultsGroup.java b/runescape-client/src/main/java/DefaultsGroup.java index bd3e729251..571513f888 100644 --- a/runescape-client/src/main/java/DefaultsGroup.java +++ b/runescape-client/src/main/java/DefaultsGroup.java @@ -4,23 +4,23 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kp") +@ObfuscatedName("km") @Implements("DefaultsGroup") public class DefaultsGroup { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lkp;" + signature = "Lkm;" ) - static final DefaultsGroup field3794; - @ObfuscatedName("n") + static final DefaultsGroup field3785; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 779550305 + intValue = 1787952601 ) @Export("group") final int group; static { - field3794 = new DefaultsGroup(3); + field3785 = new DefaultsGroup(3); } DefaultsGroup(int var1) { diff --git a/runescape-client/src/main/java/DemotingHashTable.java b/runescape-client/src/main/java/DemotingHashTable.java index 8701495db0..3861bf89e0 100644 --- a/runescape-client/src/main/java/DemotingHashTable.java +++ b/runescape-client/src/main/java/DemotingHashTable.java @@ -3,32 +3,32 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("eu") +@ObfuscatedName("ed") @Implements("DemotingHashTable") public final class DemotingHashTable { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("capacity") int capacity; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("remaining") int remaining; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("hashTable") IterableNodeHashTable hashTable; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lji;" + signature = "Ljq;" ) @Export("queue") IterableDualNodeQueue queue; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lev;" + signature = "Les;" ) - class146 field1944; + class146 field1943; public DemotingHashTable(int var1, int var2) { this.queue = new IterableDualNodeQueue(); @@ -42,7 +42,7 @@ public final class DemotingHashTable { this.hashTable = new IterableNodeHashTable(var3); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("get") public Object get(long var1) { Wrapper var3 = (Wrapper)this.hashTable.get(var1); @@ -73,16 +73,16 @@ public final class DemotingHashTable { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("remove") void remove(long var1) { Wrapper var3 = (Wrapper)this.hashTable.get(var1); this.removeWrapper(var3); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lec;)V" + signature = "(Leo;)V" ) @Export("removeWrapper") void removeWrapper(Wrapper var1) { @@ -94,7 +94,7 @@ public final class DemotingHashTable { } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("put") public void put(Object var1, long var2, int var4) { if (var4 > this.capacity) { @@ -113,8 +113,8 @@ public final class DemotingHashTable { } this.removeWrapper(var5); - if (this.field1944 != null) { - this.field1944.method3302(var5.get()); + if (this.field1943 != null) { + this.field1943.method3453(var5.get()); } } @@ -125,7 +125,7 @@ public final class DemotingHashTable { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("demote") public void demote(int var1) { for (Wrapper var2 = (Wrapper)this.queue.last(); var2 != null; var2 = (Wrapper)this.queue.previous()) { @@ -146,7 +146,7 @@ public final class DemotingHashTable { } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("clear") public void clear() { this.queue.clear(); diff --git a/runescape-client/src/main/java/DesktopPlatformInfoProvider.java b/runescape-client/src/main/java/DesktopPlatformInfoProvider.java index 7afb8784fc..408c226efa 100644 --- a/runescape-client/src/main/java/DesktopPlatformInfoProvider.java +++ b/runescape-client/src/main/java/DesktopPlatformInfoProvider.java @@ -5,41 +5,44 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lv") +@ObfuscatedName("lf") @Implements("DesktopPlatformInfoProvider") public class DesktopPlatformInfoProvider implements PlatformInfoProvider { - @ObfuscatedName("bx") - @Export("otp") - static String otp; - @ObfuscatedName("u") - @ObfuscatedGetter( - intValue = -1774295629 + @ObfuscatedName("eg") + @ObfuscatedSignature( + signature = "Lij;" ) - int field3898; - @ObfuscatedName("r") + @Export("archive17") + static Archive archive17; + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1935188169 + intValue = -1279916099 + ) + int field3895; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = 1801255819 + ) + int field3896; + @ObfuscatedName("l") + @ObfuscatedGetter( + intValue = 10853499 ) int field3899; - @ObfuscatedName("p") - @ObfuscatedGetter( - intValue = 271278755 - ) - int field3900; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)Llt;", - garbageValue = "2006662723" + signature = "(I)Llk;", + garbageValue = "-1540970685" ) @Export("get") public PlatformInfo get() { byte var1; - if (class162.field1990.startsWith("win")) { + if (class96.field1299.startsWith("win")) { var1 = 1; - } else if (class162.field1990.startsWith("mac")) { + } else if (class96.field1299.startsWith("mac")) { var1 = 2; - } else if (class162.field1990.startsWith("linux")) { + } else if (class96.field1299.startsWith("linux")) { var1 = 3; } else { var1 = 4; @@ -137,11 +140,11 @@ public class DesktopPlatformInfoProvider implements PlatformInfoProvider { var8 = 4; } - this.method6239(var5); + this.method6392(var5); Runtime.getRuntime(); int var10 = (int)((long)((new Random()).nextInt(31457280) + 230686720) / 1048576L) + 1; int var11; - if (this.field3898 > 3) { + if (this.field3895 > 3) { var11 = Runtime.getRuntime().availableProcessors(); } else { var11 = 0; @@ -155,53 +158,53 @@ public class DesktopPlatformInfoProvider implements PlatformInfoProvider { String var17 = ""; String var18 = ""; int[] var23 = new int[3]; - return new PlatformInfo(var1, var24, var7, var8, this.field3898, this.field3899, this.field3900, false, var10, var11, var12, 0, var13, var14, var15, var16, 0, 0, 0, 0, var17, var18, var23, 0, ""); + return new PlatformInfo(var1, var24, var7, var8, this.field3895, this.field3896, this.field3899, false, var10, var11, var12, 0, var13, var14, var15, var16, 0, 0, 0, 0, var17, var18, var23, 0, ""); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "-611564637" + signature = "(Ljava/lang/String;S)V", + garbageValue = "4097" ) - void method6239(String var1) { + void method6392(String var1) { if (var1.startsWith("1.")) { - this.method6232(var1); + this.method6390(var1); } else { - this.method6233(var1); + this.method6395(var1); } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "1764264863" + signature = "(Ljava/lang/String;B)V", + garbageValue = "4" ) - void method6232(String var1) { + void method6390(String var1) { String[] var2 = var1.split("\\."); try { - this.field3898 = Integer.parseInt(var2[1]); + this.field3895 = Integer.parseInt(var2[1]); var2 = var2[2].split("_"); - this.field3899 = Integer.parseInt(var2[0]); - this.field3900 = Integer.parseInt(var2[1]); + this.field3896 = Integer.parseInt(var2[0]); + this.field3899 = Integer.parseInt(var2[1]); } catch (Exception var4) { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "-775775529" + signature = "(Ljava/lang/String;B)V", + garbageValue = "1" ) - void method6233(String var1) { + void method6395(String var1) { String[] var2 = var1.split("\\."); try { - this.field3898 = Integer.parseInt(var2[0]); - this.field3899 = Integer.parseInt(var2[1]); - this.field3900 = Integer.parseInt(var2[2]); + this.field3895 = Integer.parseInt(var2[0]); + this.field3896 = Integer.parseInt(var2[1]); + this.field3899 = Integer.parseInt(var2[2]); } catch (Exception var4) { } diff --git a/runescape-client/src/main/java/DevicePcmPlayer.java b/runescape-client/src/main/java/DevicePcmPlayer.java index a0040b3737..ffe25b46a0 100644 --- a/runescape-client/src/main/java/DevicePcmPlayer.java +++ b/runescape-client/src/main/java/DevicePcmPlayer.java @@ -9,61 +9,62 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("af") +@ObfuscatedName("at") @Implements("DevicePcmPlayer") public class DevicePcmPlayer extends PcmPlayer { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("format") AudioFormat format; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("line") SourceDataLine line; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -66296385 + intValue = 1308062251 ) @Export("capacity2") int capacity2; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("byteSamples") byte[] byteSamples; DevicePcmPlayer() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "8" + garbageValue = "-122" ) @Export("init") protected void init() { - this.format = new AudioFormat((float)UrlRequest.PcmPlayer_sampleRate, 16, PcmPlayer.PcmPlayer_stereo ? 2 : 1, true, false); - this.byteSamples = new byte[256 << (PcmPlayer.PcmPlayer_stereo ? 2 : 1)]; + this.format = new AudioFormat((float)(PcmPlayer.PcmPlayer_sampleRate * 22050), 16, InterfaceParent.PcmPlayer_stereo ? 2 : 1, true, false); + this.byteSamples = new byte[256 << (InterfaceParent.PcmPlayer_stereo ? 2 : 1)]; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IS)V", - garbageValue = "2148" + signature = "(II)V", + garbageValue = "1329305761" ) @Export("open") protected void open(int var1) throws LineUnavailableException { try { - Info var2 = new Info(SourceDataLine.class, this.format, var1 << (PcmPlayer.PcmPlayer_stereo ? 2 : 1)); + Info var2 = new Info(SourceDataLine.class, this.format, var1 << (InterfaceParent.PcmPlayer_stereo ? 2 : 1)); this.line = (SourceDataLine)AudioSystem.getLine(var2); this.line.open(); this.line.start(); this.capacity2 = var1; } catch (LineUnavailableException var5) { - int var4 = (var1 >>> 1 & 1431655765) + (var1 & 1431655765); - var4 = (var4 >>> 2 & 858993459) + (var4 & 858993459); - var4 = (var4 >>> 4) + var4 & 252645135; - var4 += var4 >>> 8; - var4 += var4 >>> 16; - int var3 = var4 & 255; - if (var3 != 1) { - this.open(Timer.method4935(var1)); + if (GraphicsObject.method2158(var1) != 1) { + int var4 = var1 - 1; + var4 |= var4 >>> 1; + var4 |= var4 >>> 2; + var4 |= var4 >>> 4; + var4 |= var4 >>> 8; + var4 |= var4 >>> 16; + int var3 = var4 + 1; + this.open(var3); } else { this.line = null; throw var5; @@ -71,21 +72,21 @@ public class DevicePcmPlayer extends PcmPlayer { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "1" + signature = "(I)I", + garbageValue = "-2053382901" ) @Export("position") protected int position() { - return this.capacity2 - (this.line.available() >> (PcmPlayer.PcmPlayer_stereo ? 2 : 1)); + return this.capacity2 - (this.line.available() >> (InterfaceParent.PcmPlayer_stereo ? 2 : 1)); } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("write") protected void write() { int var1 = 256; - if (PcmPlayer.PcmPlayer_stereo) { + if (InterfaceParent.PcmPlayer_stereo) { var1 <<= 1; } @@ -102,10 +103,10 @@ public class DevicePcmPlayer extends PcmPlayer { this.line.write(this.byteSamples, 0, var1 << 1); } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "90832052" + garbageValue = "-359946727" ) @Export("close") protected void close() { @@ -116,10 +117,10 @@ public class DevicePcmPlayer extends PcmPlayer { } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1875138754" + garbageValue = "47548316" ) @Export("discard") protected void discard() { diff --git a/runescape-client/src/main/java/DevicePcmPlayerProvider.java b/runescape-client/src/main/java/DevicePcmPlayerProvider.java index 2920482813..f18d926a37 100644 --- a/runescape-client/src/main/java/DevicePcmPlayerProvider.java +++ b/runescape-client/src/main/java/DevicePcmPlayerProvider.java @@ -1,97 +1,316 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ag") +@ObfuscatedName("az") @Implements("DevicePcmPlayerProvider") -public class DevicePcmPlayerProvider implements PcmPlayerProvider { - @ObfuscatedName("sg") - @ObfuscatedGetter( - intValue = 408059263 - ) - @Export("foundItemIdCount") - static int foundItemIdCount; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = -1430118873 - ) - @Export("KitDefinition_fileCount") - public static int KitDefinition_fileCount; - @ObfuscatedName("p") - static byte[][][] field393; - @ObfuscatedName("y") - static int[][] field386; - @ObfuscatedName("i") - public static short[][] field390; - @ObfuscatedName("ja") +public class DevicePcmPlayerProvider implements class99 { + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhq;" ) - static Widget field391; - @ObfuscatedName("lk") - @ObfuscatedGetter( - intValue = -783171563 - ) - @Export("selectedItemSlot") - static int selectedItemSlot; + @Export("SequenceDefinition_animationsArchive") + static AbstractArchive SequenceDefinition_animationsArchive; + @ObfuscatedName("co") + public static char field395; DevicePcmPlayerProvider() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)Ldv;", - garbageValue = "-79742550" + signature = "(I)Ldq;", + garbageValue = "1807765023" ) @Export("player") public PcmPlayer player() { return new DevicePcmPlayer(); } - @ObfuscatedName("im") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IIIIIII)V", - garbageValue = "405770761" + signature = "(Lkf;I)V", + garbageValue = "-1072829390" ) - static final void method877(int var0, int var1, int var2, int var3, int var4, int var5) { - int var6 = var2 - var0; - int var7 = var3 - var1; - int var8 = var6 >= 0 ? var6 : -var6; - int var9 = var7 >= 0 ? var7 : -var7; - int var10 = var8; - if (var8 < var9) { - var10 = var9; + static final void method919(PacketBuffer var0) { + int var1 = 0; + var0.importIndex(); + + byte[] var10000; + int var2; + int var3; + int var4; + for (var2 = 0; var2 < Players.Players_count; ++var2) { + var3 = Players.Players_indices[var2]; + if ((Players.field1227[var3] & 1) == 0) { + if (var1 > 0) { + --var1; + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else { + var4 = var0.readBits(1); + if (var4 == 0) { + var1 = class81.method2206(var0); + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else { + ClientPacket.readPlayerUpdate(var0, var3); + } + } + } } - if (var10 != 0) { - int var11 = (var6 << 16) / var10; - int var12 = (var7 << 16) / var10; - if (var12 <= var11) { - var11 = -var11; - } else { - var12 = -var12; + var0.exportIndex(); + if (var1 != 0) { + throw new RuntimeException(); + } else { + var0.importIndex(); + + for (var2 = 0; var2 < Players.Players_count; ++var2) { + var3 = Players.Players_indices[var2]; + if ((Players.field1227[var3] & 1) != 0) { + if (var1 > 0) { + --var1; + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else { + var4 = var0.readBits(1); + if (var4 == 0) { + var1 = class81.method2206(var0); + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else { + ClientPacket.readPlayerUpdate(var0, var3); + } + } + } } - int var13 = var5 * var12 >> 17; - int var14 = var5 * var12 + 1 >> 17; - int var15 = var5 * var11 >> 17; - int var16 = var5 * var11 + 1 >> 17; - var0 -= Rasterizer2D.Rasterizer2D_xClipStart; - var1 -= Rasterizer2D.Rasterizer2D_yClipStart; - int var17 = var0 + var13; - int var18 = var0 - var14; - int var19 = var0 + var6 - var14; - int var20 = var0 + var13 + var6; - int var21 = var15 + var1; - int var22 = var1 - var16; - int var23 = var7 + var1 - var16; - int var24 = var15 + var7 + var1; - Rasterizer3D.method2972(var17, var18, var19); - Rasterizer3D.method2975(var21, var22, var23, var17, var18, var19, var4); - Rasterizer3D.method2972(var17, var19, var20); - Rasterizer3D.method2975(var21, var23, var24, var17, var19, var20, var4); + var0.exportIndex(); + if (var1 != 0) { + throw new RuntimeException(); + } else { + var0.importIndex(); + + for (var2 = 0; var2 < Players.Players_emptyIdxCount; ++var2) { + var3 = Players.Players_emptyIndices[var2]; + if ((Players.field1227[var3] & 1) != 0) { + if (var1 > 0) { + --var1; + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else { + var4 = var0.readBits(1); + if (var4 == 0) { + var1 = class81.method2206(var0); + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else if (class247.updateExternalPlayer(var0, var3)) { + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } + } + } + } + + var0.exportIndex(); + if (var1 != 0) { + throw new RuntimeException(); + } else { + var0.importIndex(); + + for (var2 = 0; var2 < Players.Players_emptyIdxCount; ++var2) { + var3 = Players.Players_emptyIndices[var2]; + if ((Players.field1227[var3] & 1) == 0) { + if (var1 > 0) { + --var1; + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else { + var4 = var0.readBits(1); + if (var4 == 0) { + var1 = class81.method2206(var0); + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } else if (class247.updateExternalPlayer(var0, var3)) { + var10000 = Players.field1227; + var10000[var3] = (byte)(var10000[var3] | 2); + } + } + } + } + + var0.exportIndex(); + if (var1 != 0) { + throw new RuntimeException(); + } else { + Players.Players_count = 0; + Players.Players_emptyIdxCount = 0; + + for (var2 = 1; var2 < 2048; ++var2) { + var10000 = Players.field1227; + var10000[var2] = (byte)(var10000[var2] >> 1); + Player var5 = Client.players[var2]; + if (var5 != null) { + Players.Players_indices[++Players.Players_count - 1] = var2; + } else { + Players.Players_emptyIndices[++Players.Players_emptyIdxCount - 1] = var2; + } + } + + } + } + } + } + } + + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "(IIS)I", + garbageValue = "6602" + ) + static final int method918(int var0, int var1) { + int var2 = var0 + var1 * 57; + var2 ^= var2 << 13; + int var3 = var2 * (var2 * var2 * 15731 + 789221) + 1376312589 & Integer.MAX_VALUE; + return var3 >> 19 & 255; + } + + @ObfuscatedName("ag") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "1874090730" + ) + static int method916(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.CLIENTCLOCK) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.cycle; + return 1; + } else { + int var3; + int var4; + if (var0 == ScriptOpcodes.INV_GETOBJ) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class3.method68(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.INV_GETNUM) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapAreaData.ItemContainer_getCount(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.INV_TOTAL) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Canvas.method935(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.INV_SIZE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapSectionType.getInvDefinition(var3).size; + return 1; + } else if (var0 == ScriptOpcodes.STAT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.currentLevels[var3]; + return 1; + } else if (var0 == ScriptOpcodes.STAT_BASE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.levels[var3]; + return 1; + } else if (var0 == ScriptOpcodes.STAT_XP) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.experience[var3]; + return 1; + } else { + int var5; + if (var0 == ScriptOpcodes.COORD) { + var3 = Player.Scene_plane; + var4 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); + var5 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var4 << 14) + var5 + (var3 << 28); + return 1; + } else if (var0 == ScriptOpcodes.COORDX) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 >> 14 & 16383; + return 1; + } else if (var0 == ScriptOpcodes.COORDZ) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 >> 28; + return 1; + } else if (var0 == ScriptOpcodes.COORDY) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 & 16383; + return 1; + } else if (var0 == ScriptOpcodes.MAP_MEMBERS) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.isMembersWorld ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.INVOTHER_GETOBJ) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] + 32768; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class3.method68(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.INVOTHER_GETNUM) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] + 32768; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapAreaData.ItemContainer_getCount(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.INVOTHER_TOTAL) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] + 32768; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Canvas.method935(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.STAFFMODLEVEL) { + if (Client.staffModLevel >= 2) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.staffModLevel; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.REBOOTTIMER) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.rebootTimer; + return 1; + } else if (var0 == ScriptOpcodes.MAP_WORLD) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.worldId; + return 1; + } else if (var0 == ScriptOpcodes.RUNENERGY_VISIBLE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.runEnergy; + return 1; + } else if (var0 == ScriptOpcodes.RUNWEIGHT_VISIBLE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.weight; + return 1; + } else if (var0 == ScriptOpcodes.PLAYERMOD) { + if (Client.playerMod) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDFLAGS) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.worldProperties; + return 1; + } else if (var0 == ScriptOpcodes.MOVECOORD) { + Interpreter.Interpreter_intStackSize -= 4; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + int var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + var3 += var4 << 14; + var3 += var5 << 28; + var3 += var6; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + return 1; + } else { + return 2; + } + } } } } diff --git a/runescape-client/src/main/java/DirectByteArrayCopier.java b/runescape-client/src/main/java/DirectByteArrayCopier.java index 126837e45d..b985d4ee2a 100644 --- a/runescape-client/src/main/java/DirectByteArrayCopier.java +++ b/runescape-client/src/main/java/DirectByteArrayCopier.java @@ -1,29 +1,28 @@ -import java.io.IOException; import java.nio.ByteBuffer; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gj") +@ObfuscatedName("gv") @Implements("DirectByteArrayCopier") public class DirectByteArrayCopier extends AbstractByteArrayCopier { - @ObfuscatedName("l") - @Export("BZip2Decompressor_block") - static int[] BZip2Decompressor_block; - @ObfuscatedName("eu") - static int[] field2482; - @ObfuscatedName("z") + @ObfuscatedName("jz") + @ObfuscatedSignature( + signature = "Lhi;" + ) + static Widget field2476; + @ObfuscatedName("a") @Export("directBuffer") ByteBuffer directBuffer; DirectByteArrayCopier() { } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(B)[B", - garbageValue = "-37" + garbageValue = "19" ) @Export("get") byte[] get() { @@ -33,10 +32,10 @@ public class DirectByteArrayCopier extends AbstractByteArrayCopier { return var1; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "([BI)V", - garbageValue = "-793496359" + signature = "([BB)V", + garbageValue = "-93" ) @Export("set") void set(byte[] var1) { @@ -45,28 +44,59 @@ public class DirectByteArrayCopier extends AbstractByteArrayCopier { this.directBuffer.put(var1); } - @ObfuscatedName("n") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(ZI)V", - garbageValue = "-2052817052" + signature = "(B)V", + garbageValue = "102" ) - public static void method3924(boolean var0) { - if (NetCache.NetCache_socket != null) { - try { - Buffer var1 = new Buffer(4); - var1.writeByte(var0 ? 2 : 3); - var1.writeMedium(0); - NetCache.NetCache_socket.write(var1.array, 0, 4); - } catch (IOException var4) { - try { - NetCache.NetCache_socket.close(); - } catch (Exception var3) { + public static void method4101() { + PlayerAppearance.PlayerAppearance_cachedModels.clear(); + } + + @ObfuscatedName("kv") + @ObfuscatedSignature( + signature = "([Lhi;IB)V", + garbageValue = "126" + ) + @Export("runComponentCloseListeners") + static final void runComponentCloseListeners(Widget[] var0, int var1) { + for (int var2 = 0; var2 < var0.length; ++var2) { + Widget var3 = var0[var2]; + if (var3 != null) { + if (var3.type == 0) { + if (var3.children != null) { + runComponentCloseListeners(var3.children, var1); + } + + InterfaceParent var4 = (InterfaceParent)Client.interfaceParents.get((long)var3.id); + if (var4 != null) { + AttackOption.runIntfCloseListeners(var4.group, var1); + } } - ++NetCache.NetCache_ioExceptions; - NetCache.NetCache_socket = null; - } + ScriptEvent var5; + if (var1 == 0 && var3.onDialogAbort != null) { + var5 = new ScriptEvent(); + var5.widget = var3; + var5.args = var3.onDialogAbort; + GrandExchangeOfferAgeComparator.runScriptEvent(var5); + } + if (var1 == 1 && var3.onSubChange != null) { + if (var3.childIndex >= 0) { + Widget var6 = PacketBufferNode.getWidget(var3.id); + if (var6 == null || var6.children == null || var3.childIndex >= var6.children.length || var3 != var6.children[var3.childIndex]) { + continue; + } + } + + var5 = new ScriptEvent(); + var5.widget = var3; + var5.args = var3.onSubChange; + GrandExchangeOfferAgeComparator.runScriptEvent(var5); + } + } } + } } diff --git a/runescape-client/src/main/java/DirectWrapper.java b/runescape-client/src/main/java/DirectWrapper.java index 405f94125b..d8c7a0fb3e 100644 --- a/runescape-client/src/main/java/DirectWrapper.java +++ b/runescape-client/src/main/java/DirectWrapper.java @@ -2,10 +2,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("ez") +@ObfuscatedName("en") @Implements("DirectWrapper") public class DirectWrapper extends Wrapper { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("obj") Object obj; @@ -14,13 +14,13 @@ public class DirectWrapper extends Wrapper { this.obj = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("get") Object get() { return this.obj; } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("isSoft") boolean isSoft() { return false; diff --git a/runescape-client/src/main/java/DualNode.java b/runescape-client/src/main/java/DualNode.java index eaf4fa82e0..f83bdcd2d4 100644 --- a/runescape-client/src/main/java/DualNode.java +++ b/runescape-client/src/main/java/DualNode.java @@ -3,26 +3,26 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fw") +@ObfuscatedName("fa") @Implements("DualNode") public class DualNode extends Node { - @ObfuscatedName("cu") + @ObfuscatedName("cj") @Export("keyDual") public long keyDual; - @ObfuscatedName("ce") + @ObfuscatedName("cm") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("previousDual") public DualNode previousDual; - @ObfuscatedName("cc") + @ObfuscatedName("cb") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("nextDual") public DualNode nextDual; - @ObfuscatedName("ce") + @ObfuscatedName("cu") @Export("removeDual") public void removeDual() { if (this.nextDual != null) { diff --git a/runescape-client/src/main/java/DualNodeDeque.java b/runescape-client/src/main/java/DualNodeDeque.java index 865f3765c9..ecfd3d2e67 100644 --- a/runescape-client/src/main/java/DualNodeDeque.java +++ b/runescape-client/src/main/java/DualNodeDeque.java @@ -3,12 +3,12 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ic") +@ObfuscatedName("ia") @Implements("DualNodeDeque") public final class DualNodeDeque { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("sentinel") DualNode sentinel; @@ -19,9 +19,9 @@ public final class DualNodeDeque { this.sentinel.nextDual = this.sentinel; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lfw;)V" + signature = "(Lfa;)V" ) @Export("addFirst") public void addFirst(DualNode var1) { @@ -35,9 +35,9 @@ public final class DualNodeDeque { var1.previousDual.nextDual = var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lfw;)V" + signature = "(Lfa;)V" ) @Export("addLast") public void addLast(DualNode var1) { @@ -51,9 +51,9 @@ public final class DualNodeDeque { var1.previousDual.nextDual = var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "()Lfw;" + signature = "()Lfa;" ) @Export("removeLast") public DualNode removeLast() { diff --git a/runescape-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java index 4fca28b6c8..e9c7d84097 100644 --- a/runescape-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -4,66 +4,66 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ce") +@ObfuscatedName("cm") @Implements("DynamicObject") public class DynamicObject extends Entity { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1757320161 + intValue = 555172431 ) @Export("id") int id; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 270171291 + intValue = 1782600615 ) @Export("type") int type; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1684018413 + intValue = 984708177 ) @Export("orientation") int orientation; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -804761033 + intValue = -1991906229 ) @Export("plane") int plane; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1414323503 + intValue = -2040349825 ) @Export("x") int x; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1753767283 + intValue = 1510224555 ) @Export("y") int y; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lix;" + signature = "Liv;" ) @Export("sequenceDefinition") SequenceDefinition sequenceDefinition; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -1311165823 + intValue = 1143115641 ) @Export("frame") int frame; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 972994897 + intValue = -1689348079 ) @Export("cycleStart") int cycleStart; @ObfuscatedSignature( - signature = "(IIIIIIIZLer;)V" + signature = "(IIIIIIIZLep;)V" ) DynamicObject(int var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8, Entity var9) { this.id = var1; @@ -73,12 +73,12 @@ public class DynamicObject extends Entity { this.x = var5; this.y = var6; if (var7 != -1) { - this.sequenceDefinition = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var7); + this.sequenceDefinition = PlayerType.SequenceDefinition_get(var7); this.frame = 0; this.cycleStart = Client.cycle - 1; - if (this.sequenceDefinition.field3517 == 0 && var9 != null && var9 instanceof DynamicObject) { + if (this.sequenceDefinition.field3521 == 0 && var9 != null && var9 instanceof DynamicObject) { DynamicObject var10 = (DynamicObject)var9; - if (var10.sequenceDefinition == this.sequenceDefinition) { + if (this.sequenceDefinition == var10.sequenceDefinition) { this.frame = var10.frame; this.cycleStart = var10.cycleStart; return; @@ -93,10 +93,10 @@ public class DynamicObject extends Entity { } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected final Model getModel() { @@ -106,11 +106,11 @@ public class DynamicObject extends Entity { var1 = 100; } - label56: { + label55: { do { do { if (var1 <= this.sequenceDefinition.frameLengths[this.frame]) { - break label56; + break label55; } var1 -= this.sequenceDefinition.frameLengths[this.frame]; @@ -126,7 +126,7 @@ public class DynamicObject extends Entity { this.cycleStart = Client.cycle - var1; } - ObjectDefinition var12 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(this.id); + ObjectDefinition var12 = WorldMapDecorationType.getObjectDefinition(this.id); if (var12.transforms != null) { var12 = var12.transform(); } @@ -149,116 +149,10 @@ public class DynamicObject extends Entity { int var6 = (var3 >> 1) + this.y; int var7 = (var3 + 1 >> 1) + this.y; int[][] var8 = Tiles.Tiles_heights[this.plane]; - int var9 = var8[var5][var6] + var8[var4][var6] + var8[var4][var7] + var8[var5][var7] >> 2; + int var9 = var8[var4][var6] + var8[var5][var6] + var8[var4][var7] + var8[var5][var7] >> 2; int var10 = (this.x << 7) + (var2 << 6); int var11 = (this.y << 7) + (var3 << 6); return var12.getModelDynamic(this.type, this.orientation, var8, var10, var9, var11, this.sequenceDefinition, this.frame); } } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "1880284014" - ) - @Export("isKeyDown") - public static final boolean isKeyDown() { - synchronized(KeyHandler.KeyHandler_instance) { - if (KeyHandler.field380 == KeyHandler.field378) { - return false; - } else { - SecureRandomFuture.field1230 = KeyHandler.field375[KeyHandler.field378]; - KeyHandler.field381 = KeyHandler.field374[KeyHandler.field378]; - KeyHandler.field378 = KeyHandler.field378 + 1 & 127; - return true; - } - } - } - - @ObfuscatedName("ao") - @ObfuscatedSignature( - signature = "(Ldc;I)V", - garbageValue = "1888530585" - ) - @Export("PcmStream_disable") - static final void PcmStream_disable(PcmStream var0) { - var0.active = false; - if (var0.sound != null) { - var0.sound.position = 0; - } - - for (PcmStream var1 = var0.firstSubStream(); var1 != null; var1 = var0.nextSubStream()) { - PcmStream_disable(var1); - } - - } - - @ObfuscatedName("ea") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "274251023" - ) - @Export("logOut") - static final void logOut() { - Client.packetWriter.close(); - WorldMapIcon_1.method314(); - PacketWriter.scene.clear(); - - for (int var0 = 0; var0 < 4; ++var0) { - Client.collisionMaps[var0].clear(); - } - - System.gc(); - class197.field2386 = 1; - class197.musicTrackArchive = null; - class188.musicTrackGroupId = -1; - class49.musicTrackFileId = -1; - TileItem.field1223 = 0; - WorldMapSectionType.musicTrackBoolean = false; - MusicPatchNode2.field2382 = 2; - Client.field666 = -1; - Client.field759 = false; - ClientPacket.method3581(); - MouseRecorder.updateGameState(10); - } - - @ObfuscatedName("gn") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "652940971" - ) - static final void method2225() { - for (Projectile var0 = (Projectile)Client.projectiles.last(); var0 != null; var0 = (Projectile)Client.projectiles.previous()) { - if (var0.plane == WorldMapRectangle.plane && Client.cycle <= var0.cycleEnd) { - if (Client.cycle >= var0.cycleStart) { - if (var0.targetIndex > 0) { - NPC var1 = Client.npcs[var0.targetIndex - 1]; - if (var1 != null && var1.x >= 0 && var1.x < 13312 && var1.y >= 0 && var1.y < 13312) { - var0.setDestination(var1.x, var1.y, MusicPatchPcmStream.getTileHeight(var1.x, var1.y, var0.plane) - var0.endHeight, Client.cycle); - } - } - - if (var0.targetIndex < 0) { - int var2 = -var0.targetIndex - 1; - Player var3; - if (var2 == Client.localPlayerIndex) { - var3 = class223.localPlayer; - } else { - var3 = Client.players[var2]; - } - - if (var3 != null && var3.x >= 0 && var3.x < 13312 && var3.y >= 0 && var3.y < 13312) { - var0.setDestination(var3.x, var3.y, MusicPatchPcmStream.getTileHeight(var3.x, var3.y, var0.plane) - var0.endHeight, Client.cycle); - } - } - - var0.advance(Client.field698); - PacketWriter.scene.drawEntity(WorldMapRectangle.plane, (int)var0.x, (int)var0.y, (int)var0.z, 60, var0, var0.yaw, -1L, false); - } - } else { - var0.remove(); - } - } - - } } diff --git a/runescape-client/src/main/java/Entity.java b/runescape-client/src/main/java/Entity.java index 0e2d2f8e30..13f9160e26 100644 --- a/runescape-client/src/main/java/Entity.java +++ b/runescape-client/src/main/java/Entity.java @@ -1,17 +1,21 @@ -import java.util.Iterator; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("er") +@ObfuscatedName("ep") @Implements("Entity") public abstract class Entity extends DualNode { - @ObfuscatedName("ci") + @ObfuscatedName("dl") + @ObfuscatedSignature( + signature = "Lfw;" + ) + @Export("js5SocketTask") + static Task js5SocketTask; + @ObfuscatedName("cq") @ObfuscatedGetter( - intValue = -2145101269 + intValue = 1761306051 ) @Export("height") public int height; @@ -20,17 +24,17 @@ public abstract class Entity extends DualNode { this.height = 1000; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected Model getModel() { return null; } - @ObfuscatedName("cb") + @ObfuscatedName("ci") @Export("draw") void draw(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, long var9) { Model var11 = this.getModel(); @@ -41,185 +45,54 @@ public abstract class Entity extends DualNode { } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(CB)B", - garbageValue = "92" + signature = "([BILjava/lang/CharSequence;I)I", + garbageValue = "-1230334360" ) - @Export("charToByteCp1252") - public static byte charToByteCp1252(char var0) { - byte var1; - if (var0 > 0 && var0 < 128 || var0 >= 160 && var0 <= 255) { - var1 = (byte)var0; - } else if (var0 == 8364) { - var1 = -128; - } else if (var0 == 8218) { - var1 = -126; - } else if (var0 == 402) { - var1 = -125; - } else if (var0 == 8222) { - var1 = -124; - } else if (var0 == 8230) { - var1 = -123; - } else if (var0 == 8224) { - var1 = -122; - } else if (var0 == 8225) { - var1 = -121; - } else if (var0 == 710) { - var1 = -120; - } else if (var0 == 8240) { - var1 = -119; - } else if (var0 == 352) { - var1 = -118; - } else if (var0 == 8249) { - var1 = -117; - } else if (var0 == 338) { - var1 = -116; - } else if (var0 == 381) { - var1 = -114; - } else if (var0 == 8216) { - var1 = -111; - } else if (var0 == 8217) { - var1 = -110; - } else if (var0 == 8220) { - var1 = -109; - } else if (var0 == 8221) { - var1 = -108; - } else if (var0 == 8226) { - var1 = -107; - } else if (var0 == 8211) { - var1 = -106; - } else if (var0 == 8212) { - var1 = -105; - } else if (var0 == 732) { - var1 = -104; - } else if (var0 == 8482) { - var1 = -103; - } else if (var0 == 353) { - var1 = -102; - } else if (var0 == 8250) { - var1 = -101; - } else if (var0 == 339) { - var1 = -100; - } else if (var0 == 382) { - var1 = -98; - } else if (var0 == 376) { - var1 = -97; - } else { - var1 = 63; - } + public static int method3390(byte[] var0, int var1, CharSequence var2) { + int var3 = var2.length(); + int var4 = var1; - return var1; - } - - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "(I)Ljava/lang/String;", - garbageValue = "67381036" - ) - static String method3225() { - String var0 = ""; - - Message var2; - for (Iterator var1 = Messages.Messages_hashTable.iterator(); var1.hasNext(); var0 = var0 + var2.sender + ':' + var2.text + '\n') { - var2 = (Message)var1.next(); - } - - return var0; - } - - @ObfuscatedName("aq") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "160012965" - ) - static int method3216(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.VIEWPORT_SETFOV) { - Interpreter.Interpreter_intStackSize -= 2; - Client.field880 = (short)PlayerAppearance.method3978(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]); - if (Client.field880 <= 0) { - Client.field880 = 256; - } - - Client.field887 = (short)PlayerAppearance.method3978(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - if (Client.field887 <= 0) { - Client.field887 = 256; - } - - return 1; - } else if (var0 == ScriptOpcodes.VIEWPORT_SETZOOM) { - Interpreter.Interpreter_intStackSize -= 2; - Client.zoomHeight = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - if (Client.zoomHeight <= 0) { - Client.zoomHeight = 256; - } - - Client.zoomWidth = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - if (Client.zoomWidth <= 0) { - Client.zoomWidth = 320; - } - - return 1; - } else if (var0 == ScriptOpcodes.VIEWPORT_CLAMPFOV) { - Interpreter.Interpreter_intStackSize -= 4; - Client.field686 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - if (Client.field686 <= 0) { - Client.field686 = 1; - } - - Client.field891 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - if (Client.field891 <= 0) { - Client.field891 = 32767; - } else if (Client.field891 < Client.field686) { - Client.field891 = Client.field686; - } - - Client.field892 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - if (Client.field892 <= 0) { - Client.field892 = 1; - } - - Client.field893 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - if (Client.field893 <= 0) { - Client.field893 = 32767; - } else if (Client.field893 < Client.field892) { - Client.field893 = Client.field892; - } - - return 1; - } else if (var0 == ScriptOpcodes.VIEWPORT_GETEFFECTIVESIZE) { - if (Client.viewportWidget != null) { - AbstractByteArrayCopier.setViewportShape(0, 0, Client.viewportWidget.width, Client.viewportWidget.height, false); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.viewportWidth; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.viewportHeight; + for (int var5 = 0; var5 < var3; ++var5) { + char var6 = var2.charAt(var5); + if (var6 <= 127) { + var0[var4++] = (byte)var6; + } else if (var6 <= 2047) { + var0[var4++] = (byte)(192 | var6 >> 6); + var0[var4++] = (byte)(128 | var6 & '?'); } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + var0[var4++] = (byte)(224 | var6 >> '\f'); + var0[var4++] = (byte)(128 | var6 >> 6 & 63); + var0[var4++] = (byte)(128 | var6 & '?'); } + } - return 1; - } else if (var0 == ScriptOpcodes.VIEWPORT_GETZOOM) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.zoomHeight; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.zoomWidth; - return 1; - } else if (var0 == ScriptOpcodes.VIEWPORT_GETFOV) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class219.method4081(Client.field880); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class219.method4081(Client.field887); - return 1; - } else if (var0 == 6220) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 6221) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 6222) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = FloorDecoration.canvasWidth; - return 1; - } else if (var0 == 6223) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WallDecoration.canvasHeight; - return 1; - } else { - return 2; + return var4 - var1; + } + + @ObfuscatedName("hh") + @ObfuscatedSignature( + signature = "(Lbz;II)V", + garbageValue = "781315687" + ) + @Export("getActorScreenLocation") + static final void getActorScreenLocation(Actor var0, int var1) { + WorldMapCacheName.worldToScreen(var0.x, var0.y, var1); + } + + @ObfuscatedName("la") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;B)V", + garbageValue = "-43" + ) + @Export("Clan_joinChat") + static final void Clan_joinChat(String var0) { + if (!var0.equals("")) { + PacketBufferNode var1 = SoundSystem.getPacketBufferNode(ClientPacket.field2267, Client.packetWriter.isaacCipher); + var1.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var0)); + var1.packetBuffer.writeStringCp1252NullTerminated(var0); + Client.packetWriter.addNode(var1); } } } diff --git a/runescape-client/src/main/java/EnumDefinition.java b/runescape-client/src/main/java/EnumDefinition.java index e5acf912dd..65058f0c48 100644 --- a/runescape-client/src/main/java/EnumDefinition.java +++ b/runescape-client/src/main/java/EnumDefinition.java @@ -4,55 +4,49 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ia") +@ObfuscatedName("ih") @Implements("EnumDefinition") public class EnumDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("EnumDefinition_archive") - public static AbstractArchive EnumDefinition_archive; - @ObfuscatedName("n") + static AbstractArchive EnumDefinition_archive; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("EnumDefinition_cached") static EvictingDualNodeHashTable EnumDefinition_cached; - @ObfuscatedName("t") - @ObfuscatedSignature( - signature = "Laq;" - ) - @Export("worldMapEvent") - static WorldMapEvent worldMapEvent; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("inputType") public char inputType; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("outputType") public char outputType; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("defaultStr") public String defaultStr; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 213418595 + intValue = -308571373 ) @Export("defaultInt") public int defaultInt; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1372083607 + intValue = 1084759985 ) @Export("outputCount") public int outputCount; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("keys") public int[] keys; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("intVals") public int[] intVals; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("strVals") public String[] strVals; @@ -67,8 +61,8 @@ public class EnumDefinition extends DualNode { @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-1933011246" + signature = "(Lkc;S)V", + garbageValue = "-15054" ) @Export("decode") void decode(Buffer var1) { @@ -82,10 +76,10 @@ public class EnumDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "1574226398" + signature = "(Lkc;II)V", + garbageValue = "1118644647" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -122,22 +116,40 @@ public class EnumDefinition extends DualNode { } - @ObfuscatedName("u") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1423753567" + garbageValue = "-1832582259" ) @Export("size") public int size() { return this.outputCount; } - @ObfuscatedName("y") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(Ljava/lang/String;B)V", - garbageValue = "54" + signature = "(IIII)I", + garbageValue = "-1010207116" ) - static final void method4508(String var0) { - class210.addGameMessage(30, "", var0); + @Export("hslToRgb") + static final int hslToRgb(int var0, int var1, int var2) { + if (var2 > 179) { + var1 /= 2; + } + + if (var2 > 192) { + var1 /= 2; + } + + if (var2 > 217) { + var1 /= 2; + } + + if (var2 > 243) { + var1 /= 2; + } + + int var3 = (var1 / 32 << 7) + (var0 / 4 << 10) + var2 / 2; + return var3; } } diff --git a/runescape-client/src/main/java/Enumerated.java b/runescape-client/src/main/java/Enumerated.java index 77dcc0a95f..77411434cc 100644 --- a/runescape-client/src/main/java/Enumerated.java +++ b/runescape-client/src/main/java/Enumerated.java @@ -3,13 +3,13 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ga") +@ObfuscatedName("gy") @Implements("Enumerated") public interface Enumerated { - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") int rsOrdinal(); diff --git a/runescape-client/src/main/java/EvictingDualNodeHashTable.java b/runescape-client/src/main/java/EvictingDualNodeHashTable.java index 5b1bb37f05..b738a161de 100644 --- a/runescape-client/src/main/java/EvictingDualNodeHashTable.java +++ b/runescape-client/src/main/java/EvictingDualNodeHashTable.java @@ -3,35 +3,35 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("em") +@ObfuscatedName("eb") @Implements("EvictingDualNodeHashTable") public final class EvictingDualNodeHashTable { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) - DualNode field1937; - @ObfuscatedName("n") + DualNode field1936; + @ObfuscatedName("t") @Export("capacity") int capacity; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("remainingCapacity") int remainingCapacity; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("hashTable") IterableNodeHashTable hashTable; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lji;" + signature = "Ljq;" ) @Export("deque") IterableDualNodeQueue deque; public EvictingDualNodeHashTable(int var1) { - this.field1937 = new DualNode(); + this.field1936 = new DualNode(); this.deque = new IterableDualNodeQueue(); this.capacity = var1; this.remainingCapacity = var1; @@ -43,9 +43,9 @@ public final class EvictingDualNodeHashTable { this.hashTable = new IterableNodeHashTable(var2); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(J)Lfw;" + signature = "(J)Lfa;" ) @Export("get") public DualNode get(long var1) { @@ -57,7 +57,7 @@ public final class EvictingDualNodeHashTable { return var3; } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("remove") public void remove(long var1) { DualNode var3 = (DualNode)this.hashTable.get(var1); @@ -69,9 +69,9 @@ public final class EvictingDualNodeHashTable { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lfw;J)V" + signature = "(Lfa;J)V" ) @Export("put") public void put(DualNode var1, long var2) { @@ -79,7 +79,7 @@ public final class EvictingDualNodeHashTable { DualNode var4 = this.deque.removeLast(); var4.remove(); var4.removeDual(); - if (var4 == this.field1937) { + if (var4 == this.field1936) { var4 = this.deque.removeLast(); var4.remove(); var4.removeDual(); @@ -92,12 +92,12 @@ public final class EvictingDualNodeHashTable { this.deque.add(var1); } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("clear") public void clear() { this.deque.clear(); this.hashTable.clear(); - this.field1937 = new DualNode(); + this.field1936 = new DualNode(); this.remainingCapacity = this.capacity; } } diff --git a/runescape-client/src/main/java/FaceNormal.java b/runescape-client/src/main/java/FaceNormal.java index 1d19a60f00..4923b7be9f 100644 --- a/runescape-client/src/main/java/FaceNormal.java +++ b/runescape-client/src/main/java/FaceNormal.java @@ -4,42 +4,24 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ee") +@ObfuscatedName("eq") @Implements("FaceNormal") public class FaceNormal { - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lkn;" - ) - @Export("ItemDefinition_fontPlain11") - static Font ItemDefinition_fontPlain11; - @ObfuscatedName("w") - @ObfuscatedSignature( - signature = "Lkl;" - ) - @Export("NetCache_responseArchiveBuffer") - static Buffer NetCache_responseArchiveBuffer; - @ObfuscatedName("ds") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive2") - static Archive archive2; - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 149051353 + intValue = -749416207 ) @Export("x") int x; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1494841217 + intValue = 1897816947 ) @Export("y") int y; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 2026615431 + intValue = 1642061929 ) @Export("z") int z; @@ -47,82 +29,66 @@ public class FaceNormal { FaceNormal() { } - @ObfuscatedName("iy") + @ObfuscatedName("ao") @ObfuscatedSignature( - signature = "([Lho;IIIZI)V", - garbageValue = "2028417948" + signature = "(II)V", + garbageValue = "-973017204" ) - @Export("resizeInterface") - static void resizeInterface(Widget[] var0, int var1, int var2, int var3, boolean var4) { - for (int var5 = 0; var5 < var0.length; ++var5) { - Widget var6 = var0[var5]; - if (var6 != null && var6.parentId == var1) { - TileItem.alignWidgetSize(var6, var2, var3, var4); - class30.alignWidgetPosition(var6, var2, var3); - if (var6.scrollX > var6.scrollWidth - var6.width) { - var6.scrollX = var6.scrollWidth - var6.width; + @Export("runWidgetOnLoadListener") + static void runWidgetOnLoadListener(int var0) { + if (var0 != -1) { + if (TextureProvider.loadInterface(var0)) { + Widget[] var1 = Widget.Widget_interfaceComponents[var0]; + + for (int var2 = 0; var2 < var1.length; ++var2) { + Widget var3 = var1[var2]; + if (var3.onLoad != null) { + ScriptEvent var4 = new ScriptEvent(); + var4.widget = var3; + var4.args = var3.onLoad; + class4.runScript(var4, 5000000); + } } - if (var6.scrollX < 0) { - var6.scrollX = 0; - } - - if (var6.scrollY > var6.scrollHeight - var6.height) { - var6.scrollY = var6.scrollHeight - var6.height; - } - - if (var6.scrollY < 0) { - var6.scrollY = 0; - } - - if (var6.type == 0) { - GameShell.revalidateWidgetScroll(var0, var6, var4); - } } } - } - @ObfuscatedName("ki") + @ObfuscatedName("hl") @ObfuscatedSignature( - signature = "(Lho;II)Ljava/lang/String;", - garbageValue = "-1147965976" + signature = "(Lbn;I)V", + garbageValue = "-935329851" ) - static String method3228(Widget var0, int var1) { - int var3 = class2.getWidgetClickMask(var0); - boolean var2 = (var3 >> var1 + 1 & 1) != 0; - if (!var2 && var0.onOp == null) { - return null; - } else { - return var0.actions != null && var0.actions.length > var1 && var0.actions[var1] != null && var0.actions[var1].trim().length() != 0 ? var0.actions[var1] : null; - } - } - - @ObfuscatedName("kr") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;ZB)Ljava/lang/String;", - garbageValue = "17" - ) - static String method3229(String var0, boolean var1) { - String var2 = var1 ? "https://" : "http://"; - if (Client.gameBuild == 1) { - var0 = var0 + "-wtrc"; - } else if (Client.gameBuild == 2) { - var0 = var0 + "-wtqa"; - } else if (Client.gameBuild == 3) { - var0 = var0 + "-wtwip"; - } else if (Client.gameBuild == 5) { - var0 = var0 + "-wti"; - } else if (Client.gameBuild == 4) { - var0 = "local"; + static final void method3396(PendingSpawn var0) { + long var1 = 0L; + int var3 = -1; + int var4 = 0; + int var5 = 0; + if (var0.type == 0) { + var1 = WorldMapArea.scene.getBoundaryObjectTag(var0.plane, var0.x, var0.y); } - String var3 = ""; - if (class197.field2390 != null) { - var3 = "/p=" + class197.field2390; + if (var0.type == 1) { + var1 = WorldMapArea.scene.getWallDecorationTag(var0.plane, var0.x, var0.y); } - String var4 = "runescape.com"; - return var2 + var0 + "." + var4 + "/l=" + WorldMapLabelSize.clientLanguage + "/a=" + WorldMapArea.field218 + var3 + "/"; + if (var0.type == 2) { + var1 = WorldMapArea.scene.getGameObjectTag(var0.plane, var0.x, var0.y); + } + + if (var0.type == 3) { + var1 = WorldMapArea.scene.getFloorDecorationTag(var0.plane, var0.x, var0.y); + } + + if (var1 != 0L) { + int var6 = WorldMapArea.scene.getObjectFlags(var0.plane, var0.x, var0.y, var1); + var3 = UserComparator8.Entity_unpackID(var1); + var4 = var6 & 31; + var5 = var6 >> 6 & 3; + } + + var0.objectId = var3; + var0.field914 = var4; + var0.field913 = var5; } } diff --git a/runescape-client/src/main/java/FileSystem.java b/runescape-client/src/main/java/FileSystem.java index 8c2bc32a0d..b544056df8 100644 --- a/runescape-client/src/main/java/FileSystem.java +++ b/runescape-client/src/main/java/FileSystem.java @@ -4,16 +4,16 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("fg") +@ObfuscatedName("fv") @Implements("FileSystem") public class FileSystem { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("FileSystem_hasPermissions") - public static boolean FileSystem_hasPermissions; - @ObfuscatedName("n") + static boolean FileSystem_hasPermissions; + @ObfuscatedName("t") @Export("FileSystem_cacheDir") - public static File FileSystem_cacheDir; - @ObfuscatedName("v") + static File FileSystem_cacheDir; + @ObfuscatedName("n") @Export("FileSystem_cacheFiles") static Hashtable FileSystem_cacheFiles; diff --git a/runescape-client/src/main/java/FillMode.java b/runescape-client/src/main/java/FillMode.java index f5d4e2cefc..a5c05548b2 100644 --- a/runescape-client/src/main/java/FillMode.java +++ b/runescape-client/src/main/java/FillMode.java @@ -4,35 +4,35 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lu") +@ObfuscatedName("lt") @Implements("FillMode") public enum FillMode implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llu;" + signature = "Llt;" ) @Export("SOLID") SOLID(0, 0), + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Llt;" + ) + field3847(1, 1), @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Llu;" + signature = "Llt;" ) - field3856(1, 1), - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Llu;" - ) - field3857(2, 2); + field3849(2, 2); - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -640256921 + intValue = -626837763 ) @Export("value") public final int value; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -532498775 + intValue = -1570105459 ) @Export("id") final int id; @@ -42,43 +42,13 @@ public enum FillMode implements Enumerated { this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(I)Llf;", - garbageValue = "1508787563" - ) - static Sprite method6030() { - Sprite var0 = new Sprite(); - var0.width = class325.SpriteBuffer_spriteWidth; - var0.height = Frames.SpriteBuffer_spriteHeight; - var0.xOffset = class325.SpriteBuffer_xOffsets[0]; - var0.yOffset = MusicPatchPcmStream.SpriteBuffer_yOffsets[0]; - var0.subWidth = class325.SpriteBuffer_spriteWidths[0]; - var0.subHeight = RunException.SpriteBuffer_spriteHeights[0]; - int var1 = var0.subHeight * var0.subWidth; - byte[] var2 = PacketBufferNode.SpriteBuffer_pixels[0]; - var0.pixels = new int[var1]; - - for (int var3 = 0; var3 < var1; ++var3) { - var0.pixels[var3] = class325.SpriteBuffer_spritePalette[var2[var3] & 255]; - } - - class325.SpriteBuffer_xOffsets = null; - MusicPatchPcmStream.SpriteBuffer_yOffsets = null; - class325.SpriteBuffer_spriteWidths = null; - RunException.SpriteBuffer_spriteHeights = null; - class325.SpriteBuffer_spritePalette = null; - PacketBufferNode.SpriteBuffer_pixels = null; - return var0; - } } diff --git a/runescape-client/src/main/java/FloorDecoration.java b/runescape-client/src/main/java/FloorDecoration.java index e0a9fd65d3..3048ed9f1c 100644 --- a/runescape-client/src/main/java/FloorDecoration.java +++ b/runescape-client/src/main/java/FloorDecoration.java @@ -4,48 +4,54 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dj") +@ObfuscatedName("dx") @Implements("FloorDecoration") public final class FloorDecoration { - @ObfuscatedName("d") + @ObfuscatedName("na") @ObfuscatedGetter( - intValue = 1829552079 + intValue = 379430595 ) - @Export("canvasWidth") - public static int canvasWidth; - @ObfuscatedName("z") + @Export("widgetDragDuration") + static int widgetDragDuration; + @ObfuscatedName("pe") @ObfuscatedSignature( - signature = "Ler;" + signature = "Llx;" ) - @Export("entity") - public Entity entity; - @ObfuscatedName("n") + @Export("sceneMinimapSprite") + static Sprite sceneMinimapSprite; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1834213503 + intValue = 1575825247 ) @Export("tileHeight") int tileHeight; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 461857131 + intValue = -455882757 ) @Export("x") int x; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -848464295 + intValue = 733154095 ) @Export("y") int y; - @ObfuscatedName("r") + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "Lep;" + ) + @Export("entity") + public Entity entity; + @ObfuscatedName("v") @ObfuscatedGetter( - longValue = 3642112439868332829L + longValue = -4694647978187683379L ) @Export("tag") public long tag; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1953587145 + intValue = -984240523 ) @Export("flags") int flags; @@ -53,48 +59,25 @@ public final class FloorDecoration { FloorDecoration() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)Lhs;", - garbageValue = "-1156266256" + signature = "(IIIIIIB)I", + garbageValue = "30" ) - public static ServerBuild method2841(int var0) { - ServerBuild[] var1 = new ServerBuild[]{ServerBuild.BUILDLIVE, ServerBuild.LIVE, ServerBuild.RC, ServerBuild.WIP}; - ServerBuild[] var2 = var1; - - for (int var3 = 0; var3 < var2.length; ++var3) { - ServerBuild var4 = var2[var3]; - if (var0 == var4.field3079) { - return var4; - } + public static int method3010(int var0, int var1, int var2, int var3, int var4, int var5) { + if ((var5 & 1) == 1) { + int var6 = var3; + var3 = var4; + var4 = var6; } - return null; - } - - @ObfuscatedName("jl") - @ObfuscatedSignature( - signature = "(IIIILlf;Lhz;S)V", - garbageValue = "1700" - ) - @Export("worldToMinimap") - static final void worldToMinimap(int var0, int var1, int var2, int var3, Sprite var4, SpriteMask var5) { - int var6 = var3 * var3 + var2 * var2; - if (var6 > 4225 && var6 < 90000) { - int var7 = Client.camAngleY & 2047; - int var8 = Rasterizer3D.Rasterizer3D_sine[var7]; - int var9 = Rasterizer3D.Rasterizer3D_cosine[var7]; - int var10 = var9 * var2 + var3 * var8 >> 16; - int var11 = var3 * var9 - var8 * var2 >> 16; - double var12 = Math.atan2((double)var10, (double)var11); - int var14 = var5.width / 2 - 25; - int var15 = (int)(Math.sin(var12) * (double)var14); - int var16 = (int)(Math.cos(var12) * (double)var14); - byte var17 = 20; - PendingSpawn.redHintArrowSprite.method6090(var15 + (var0 + var5.width / 2 - var17 / 2), var5.height / 2 + var1 - var17 / 2 - var16 - 10, var17, var17, 15, 15, var12, 256); + var2 &= 3; + if (var2 == 0) { + return var0; + } else if (var2 == 1) { + return var1; } else { - class208.drawSpriteOnMinimap(var0, var1, var2, var3, var4, var5); + return var2 == 2 ? 7 - var0 - (var3 - 1) : 7 - var1 - (var4 - 1); } - } } diff --git a/runescape-client/src/main/java/FloorOverlayDefinition.java b/runescape-client/src/main/java/FloorOverlayDefinition.java index 1e446d717e..d5f9a06881 100644 --- a/runescape-client/src/main/java/FloorOverlayDefinition.java +++ b/runescape-client/src/main/java/FloorOverlayDefinition.java @@ -1,82 +1,78 @@ -import java.awt.FontMetrics; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ii") +@ObfuscatedName("is") @Implements("FloorOverlayDefinition") public class FloorOverlayDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("FloorOverlayDefinition_archive") - public static AbstractArchive FloorOverlayDefinition_archive; - @ObfuscatedName("n") + static AbstractArchive FloorOverlayDefinition_archive; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("FloorOverlayDefinition_cached") public static EvictingDualNodeHashTable FloorOverlayDefinition_cached; - @ObfuscatedName("ap") - @Export("loginScreenFontMetrics") - static FontMetrics loginScreenFontMetrics; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1255212273 + intValue = 174203121 ) @Export("primaryRgb") public int primaryRgb; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1279665091 + intValue = 1513667197 ) @Export("texture") public int texture; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("hideUnderlay") public boolean hideUnderlay; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 420813751 + intValue = -173396079 ) @Export("secondaryRgb") public int secondaryRgb; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1507689835 + intValue = -538711707 ) @Export("hue") public int hue; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -898918847 + intValue = 343032535 ) @Export("saturation") public int saturation; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -298509321 + intValue = -459750833 ) @Export("lightness") public int lightness; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 171308105 + intValue = 675536463 ) @Export("secondaryHue") public int secondaryHue; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1584668069 + intValue = -1939857721 ) @Export("secondarySaturation") public int secondarySaturation; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 1614583675 + intValue = 773106025 ) @Export("secondaryLightness") public int secondaryLightness; @@ -85,20 +81,20 @@ public class FloorOverlayDefinition extends DualNode { FloorOverlayDefinition_cached = new EvictingDualNodeHashTable(64); } - public FloorOverlayDefinition() { + FloorOverlayDefinition() { this.primaryRgb = 0; this.texture = -1; this.hideUnderlay = true; this.secondaryRgb = -1; } - @ObfuscatedName("z") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "1" + signature = "(S)V", + garbageValue = "-4204" ) @Export("postDecode") - public void postDecode() { + void postDecode() { if (this.secondaryRgb != -1) { this.setHsl(this.secondaryRgb); this.secondaryHue = this.hue; @@ -109,13 +105,13 @@ public class FloorOverlayDefinition extends DualNode { this.setHsl(this.primaryRgb); } - @ObfuscatedName("n") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;IB)V", - garbageValue = "64" + signature = "(Lkc;IB)V", + garbageValue = "-1" ) @Export("decode") - public void decode(Buffer var1, int var2) { + void decode(Buffer var1, int var2) { while (true) { int var3 = var1.readUnsignedByte(); if (var3 == 0) { @@ -128,8 +124,8 @@ public class FloorOverlayDefinition extends DualNode { @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lkl;III)V", - garbageValue = "-973510442" + signature = "(Lkc;III)V", + garbageValue = "1158781542" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2, int var3) { @@ -146,10 +142,10 @@ public class FloorOverlayDefinition extends DualNode { } - @ObfuscatedName("u") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-1969849655" + signature = "(IB)V", + garbageValue = "109" ) @Export("setHsl") void setHsl(int var1) { @@ -177,7 +173,7 @@ public class FloorOverlayDefinition extends DualNode { double var12 = 0.0D; double var14 = 0.0D; double var16 = (var8 + var10) / 2.0D; - if (var8 != var10) { + if (var10 != var8) { if (var16 < 0.5D) { var14 = (var10 - var8) / (var8 + var10); } @@ -190,15 +186,15 @@ public class FloorOverlayDefinition extends DualNode { var12 = (var4 - var6) / (var10 - var8); } else if (var10 == var4) { var12 = (var6 - var2) / (var10 - var8) + 2.0D; - } else if (var6 == var10) { - var12 = (var2 - var4) / (var10 - var8) + 4.0D; + } else if (var10 == var6) { + var12 = 4.0D + (var2 - var4) / (var10 - var8); } } var12 /= 6.0D; this.hue = (int)(256.0D * var12); this.saturation = (int)(256.0D * var14); - this.lightness = (int)(var16 * 256.0D); + this.lightness = (int)(256.0D * var16); if (this.saturation < 0) { this.saturation = 0; } else if (this.saturation > 255) { @@ -212,43 +208,4 @@ public class FloorOverlayDefinition extends DualNode { } } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "([Ljava/lang/CharSequence;III)Ljava/lang/String;", - garbageValue = "137024567" - ) - public static String method4716(CharSequence[] var0, int var1, int var2) { - if (var2 == 0) { - return ""; - } else if (var2 == 1) { - CharSequence var3 = var0[var1]; - return var3 == null ? "null" : var3.toString(); - } else { - int var8 = var2 + var1; - int var4 = 0; - - for (int var5 = var1; var5 < var8; ++var5) { - CharSequence var6 = var0[var5]; - if (var6 == null) { - var4 += 4; - } else { - var4 += var6.length(); - } - } - - StringBuilder var9 = new StringBuilder(var4); - - for (int var10 = var1; var10 < var8; ++var10) { - CharSequence var7 = var0[var10]; - if (var7 == null) { - var9.append("null"); - } else { - var9.append(var7); - } - } - - return var9.toString(); - } - } } diff --git a/runescape-client/src/main/java/FloorUnderlayDefinition.java b/runescape-client/src/main/java/FloorUnderlayDefinition.java index f6bccb61c5..995a56c23b 100644 --- a/runescape-client/src/main/java/FloorUnderlayDefinition.java +++ b/runescape-client/src/main/java/FloorUnderlayDefinition.java @@ -4,48 +4,60 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("iu") +@ObfuscatedName("ir") @Implements("FloorUnderlayDefinition") public class FloorUnderlayDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("qu") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lct;" + ) + @Export("pcmStreamMixer") + static PcmStreamMixer pcmStreamMixer; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "Lhq;" ) @Export("FloorUnderlayDefinition_archive") public static AbstractArchive FloorUnderlayDefinition_archive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("FloorUnderlayDefinition_cached") public static EvictingDualNodeHashTable FloorUnderlayDefinition_cached; - @ObfuscatedName("v") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = -1923870903 + intValue = 1804516089 + ) + @Export("canvasHeight") + public static int canvasHeight; + @ObfuscatedName("n") + @ObfuscatedGetter( + intValue = 1186961111 ) @Export("rgb") int rgb; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -2031878355 + intValue = 2037772261 ) @Export("hue") public int hue; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 922832793 + intValue = 232580593 ) @Export("saturation") public int saturation; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1084903515 + intValue = -818130019 ) @Export("lightness") public int lightness; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 568958993 + intValue = 820254553 ) @Export("hueMultiplier") public int hueMultiplier; @@ -54,27 +66,27 @@ public class FloorUnderlayDefinition extends DualNode { FloorUnderlayDefinition_cached = new EvictingDualNodeHashTable(64); } - FloorUnderlayDefinition() { + public FloorUnderlayDefinition() { this.rgb = 0; } + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "65" + ) + @Export("postDecode") + public void postDecode() { + this.setHsl(this.rgb); + } + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-2090929650" - ) - @Export("postDecode") - void postDecode() { - this.setHsl(this.rgb); - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-840924474" + signature = "(Lkc;II)V", + garbageValue = "-2043109243" ) @Export("decode") - void decode(Buffer var1, int var2) { + public void decode(Buffer var1, int var2) { while (true) { int var3 = var1.readUnsignedByte(); if (var3 == 0) { @@ -85,10 +97,10 @@ public class FloorUnderlayDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;III)V", - garbageValue = "-1673078715" + signature = "(Lkc;III)V", + garbageValue = "347709925" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2, int var3) { @@ -98,10 +110,10 @@ public class FloorUnderlayDefinition extends DualNode { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "307020215" + signature = "(IB)V", + garbageValue = "1" ) @Export("setHsl") void setHsl(int var1) { @@ -128,8 +140,8 @@ public class FloorUnderlayDefinition extends DualNode { double var12 = 0.0D; double var14 = 0.0D; - double var16 = (var10 + var8) / 2.0D; - if (var10 != var8) { + double var16 = (var8 + var10) / 2.0D; + if (var8 != var10) { if (var16 < 0.5D) { var14 = (var10 - var8) / (var8 + var10); } @@ -138,18 +150,18 @@ public class FloorUnderlayDefinition extends DualNode { var14 = (var10 - var8) / (2.0D - var10 - var8); } - if (var10 == var2) { + if (var2 == var10) { var12 = (var4 - var6) / (var10 - var8); - } else if (var10 == var4) { - var12 = 2.0D + (var6 - var2) / (var10 - var8); + } else if (var4 == var10) { + var12 = (var6 - var2) / (var10 - var8) + 2.0D; } else if (var6 == var10) { var12 = 4.0D + (var2 - var4) / (var10 - var8); } } var12 /= 6.0D; - this.saturation = (int)(256.0D * var14); - this.lightness = (int)(var16 * 256.0D); + this.saturation = (int)(var14 * 256.0D); + this.lightness = (int)(256.0D * var16); if (this.saturation < 0) { this.saturation = 0; } else if (this.saturation > 255) { @@ -163,9 +175,9 @@ public class FloorUnderlayDefinition extends DualNode { } if (var16 > 0.5D) { - this.hueMultiplier = (int)(512.0D * var14 * (1.0D - var16)); + this.hueMultiplier = (int)(var14 * (1.0D - var16) * 512.0D); } else { - this.hueMultiplier = (int)(512.0D * var16 * var14); + this.hueMultiplier = (int)(var14 * var16 * 512.0D); } if (this.hueMultiplier < 1) { @@ -174,28 +186,4 @@ public class FloorUnderlayDefinition extends DualNode { this.hue = (int)((double)this.hueMultiplier * var12); } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(B)[Lcn;", - garbageValue = "126" - ) - static AttackOption[] method4395() { - return new AttackOption[]{AttackOption.AttackOption_hidden, AttackOption.AttackOption_leftClickWhereAvailable, AttackOption.AttackOption_alwaysRightClick, AttackOption.AttackOption_dependsOnCombatLevels}; - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(IIB)I", - garbageValue = "1" - ) - @Export("ItemContainer_getCount") - static int ItemContainer_getCount(int var0, int var1) { - ItemContainer var2 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); - if (var2 == null) { - return 0; - } else { - return var1 >= 0 && var1 < var2.quantities.length ? var2.quantities[var1] : 0; - } - } } diff --git a/runescape-client/src/main/java/Font.java b/runescape-client/src/main/java/Font.java index cce3118881..de253dc7e7 100644 --- a/runescape-client/src/main/java/Font.java +++ b/runescape-client/src/main/java/Font.java @@ -2,7 +2,7 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("kn") +@ObfuscatedName("ks") @Implements("Font") public final class Font extends AbstractFont { public Font(byte[] var1, int[] var2, int[] var3, int[] var4, int[] var5, int[] var6, byte[][] var7) { @@ -13,7 +13,7 @@ public final class Font extends AbstractFont { super(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("drawGlyph") final void drawGlyph(byte[] var1, int var2, int var3, int var4, int var5, int var6) { int var7 = var3 * Rasterizer2D.Rasterizer2D_width + var2; @@ -55,7 +55,7 @@ public final class Font extends AbstractFont { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @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; diff --git a/runescape-client/src/main/java/FontName.java b/runescape-client/src/main/java/FontName.java index 74ede7d7c0..7fb8fa602a 100644 --- a/runescape-client/src/main/java/FontName.java +++ b/runescape-client/src/main/java/FontName.java @@ -2,57 +2,54 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; +import net.runelite.rs.Reflection; -@ObfuscatedName("ko") +@ObfuscatedName("kq") @Implements("FontName") public class FontName { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("FontName_plain11") public static final FontName FontName_plain11; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("FontName_plain12") public static final FontName FontName_plain12; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("FontName_bold12") public static final FontName FontName_bold12; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("FontName_verdana11") public static final FontName FontName_verdana11; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("FontName_verdana13") public static final FontName FontName_verdana13; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("FontName_verdana15") public static final FontName FontName_verdana15; - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "Llp;" - ) - @Export("logoSprite") - static IndexedSprite logoSprite; @ObfuscatedName("o") - @Export("Tiles_hueMultiplier") - static int[] Tiles_hueMultiplier; - @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "Llx;" + ) + @Export("rightTitleSprite") + static Sprite rightTitleSprite; + @ObfuscatedName("c") @Export("name") String name; @@ -69,82 +66,125 @@ public class FontName { this.name = var1; } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(B)[Lko;", - garbageValue = "-88" - ) - public static FontName[] method5272() { - return new FontName[]{FontName_verdana13, FontName_bold12, FontName_verdana11, FontName_plain12, FontName_verdana15, FontName_plain11}; - } - @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "14" + signature = "(Ljava/lang/String;I)Ljava/lang/Class;", + garbageValue = "703814886" ) - static void method5266() { - ItemContainer.itemContainers = new NodeHashTable(32); - } - - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1537038267" - ) - static int method5271(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - if (var0 == ScriptOpcodes.CC_GETX) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.x; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETY) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.y; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETWIDTH) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.width; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETHEIGHT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.height; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETHIDE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.isHidden ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETLAYER) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.parentId; - return 1; + @Export("loadClassFromDescriptor") + static Class loadClassFromDescriptor(String var0) throws ClassNotFoundException { + if (var0.equals("B")) { + return Byte.TYPE; + } else if (var0.equals("I")) { + return Integer.TYPE; + } else if (var0.equals("S")) { + return Short.TYPE; + } else if (var0.equals("J")) { + return Long.TYPE; + } else if (var0.equals("Z")) { + return Boolean.TYPE; + } else if (var0.equals("F")) { + return Float.TYPE; + } else if (var0.equals("D")) { + return Double.TYPE; + } else if (var0.equals("C")) { + return Character.TYPE; } else { - return 2; + return var0.equals("void") ? Void.TYPE : Reflection.findClass(var0); } } - @ObfuscatedName("jr") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lbk;ZI)V", - garbageValue = "2027801614" + signature = "(II)V", + garbageValue = "348293638" ) - @Export("closeInterface") - static final void closeInterface(InterfaceParent var0, boolean var1) { - int var2 = var0.group; - int var3 = (int)var0.key; - var0.remove(); - if (var1) { - InterfaceParent.method1192(var2); + @Export("clearItemContainer") + static void clearItemContainer(int var0) { + ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var1 != null) { + for (int var2 = 0; var2 < var1.ids.length; ++var2) { + var1.ids[var2] = -1; + var1.quantities[var2] = 0; + } + + } + } + + @ObfuscatedName("gh") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-837375180" + ) + @Export("setWindowedMode") + static void setWindowedMode(int var0) { + Client.field736 = 0L; + if (var0 >= 2) { + Client.isResizable = true; + } else { + Client.isResizable = false; } - for (IntegerNode var4 = (IntegerNode)Client.widgetClickMasks.first(); var4 != null; var4 = (IntegerNode)Client.widgetClickMasks.next()) { - if ((long)var2 == (var4.key >> 48 & 65535L)) { - var4.remove(); + if (WallDecoration.getWindowedMode() == 1) { + WorldMapID.client.setMaxCanvasSize(765, 503); + } else { + WorldMapID.client.setMaxCanvasSize(7680, 2160); + } + + if (Client.gameState >= 25) { + PacketBufferNode var1 = SoundSystem.getPacketBufferNode(ClientPacket.field2257, Client.packetWriter.isaacCipher); + var1.packetBuffer.writeByte(WallDecoration.getWindowedMode()); + var1.packetBuffer.writeShort(class286.canvasWidth); + var1.packetBuffer.writeShort(FloorUnderlayDefinition.canvasHeight); + Client.packetWriter.addNode(var1); + } + + } + + @ObfuscatedName("hw") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1528266884" + ) + static final void method5442() { + for (GraphicsObject var0 = (GraphicsObject)Client.graphicsObjects.last(); var0 != null; var0 = (GraphicsObject)Client.graphicsObjects.previous()) { + if (var0.plane == Player.Scene_plane && !var0.isFinished) { + if (Client.cycle >= var0.cycleStart) { + var0.advance(Client.field693); + if (var0.isFinished) { + var0.remove(); + } else { + WorldMapArea.scene.drawEntity(var0.plane, var0.x, var0.y, var0.height, 60, var0, 0, -1L, false); + } + } + } else { + var0.remove(); } } - Widget var5 = Canvas.getWidget(var3); - if (var5 != null) { - WorldMapSectionType.invalidateWidget(var5); - } + } - SecureRandomFuture.method2138(); - if (Client.rootInterface != -1) { - class40.runIntfCloseListeners(Client.rootInterface, 1); + @ObfuscatedName("lp") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1324423171" + ) + static void method5443() { + if (Client.field645 && class215.localPlayer != null) { + int var0 = class215.localPlayer.pathX[0]; + int var1 = class215.localPlayer.pathY[0]; + if (var0 < 0 || var1 < 0 || var0 >= 104 || var1 >= 104) { + return; + } + + IgnoreList.oculusOrbFocalPointX = class215.localPlayer.x; + int var2 = GraphicsObject.getTileHeight(class215.localPlayer.x, class215.localPlayer.y, Player.Scene_plane) - Client.camFollowHeight; + if (var2 < Tiles.field497) { + Tiles.field497 = var2; + } + + AbstractArchive.oculusOrbFocalPointY = class215.localPlayer.y; + Client.field645 = false; } } diff --git a/runescape-client/src/main/java/Fonts.java b/runescape-client/src/main/java/Fonts.java index 28d4cacc72..374a6c9afa 100644 --- a/runescape-client/src/main/java/Fonts.java +++ b/runescape-client/src/main/java/Fonts.java @@ -4,27 +4,27 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kr") +@ObfuscatedName("ko") @Implements("Fonts") public class Fonts { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("spritesArchive") AbstractArchive spritesArchive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("fontsArchive") AbstractArchive fontsArchive; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("map") HashMap map; @ObfuscatedSignature( - signature = "(Lhp;Lhp;)V" + signature = "(Lhq;Lhq;)V" ) public Fonts(AbstractArchive var1, AbstractArchive var2) { this.spritesArchive = var1; @@ -32,10 +32,10 @@ public class Fonts { this.map = new HashMap(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([Lko;I)Ljava/util/HashMap;", - garbageValue = "-1165155916" + signature = "([Lkq;B)Ljava/util/HashMap;", + garbageValue = "-73" ) @Export("createMap") public HashMap createMap(FontName[] var1) { @@ -52,7 +52,7 @@ public class Fonts { String var9 = var5.name; int var10 = var7.getGroupId(var9); int var11 = var7.getFileId(var10, ""); - Font var6 = ClanMate.method4976(var7, var8, var10, var11); + Font var6 = class269.method5114(var7, var8, var10, var11); if (var6 != null) { this.map.put(var5, var6); var2.put(var5, var6); @@ -62,22 +62,4 @@ public class Fonts { return var2; } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(II)Lkc;", - garbageValue = "202775938" - ) - public static PrivateChatMode method5273(int var0) { - PrivateChatMode[] var1 = BZip2State.ChatMode_values(); - - for (int var2 = 0; var2 < var1.length; ++var2) { - PrivateChatMode var3 = var1[var2]; - if (var0 == var3.field3793) { - return var3; - } - } - - return null; - } } diff --git a/runescape-client/src/main/java/Frames.java b/runescape-client/src/main/java/Frames.java index ad4aa7d2a2..d61482d088 100644 --- a/runescape-client/src/main/java/Frames.java +++ b/runescape-client/src/main/java/Frames.java @@ -1,39 +1,26 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ep") +@ObfuscatedName("em") @Implements("Frames") public class Frames extends DualNode { - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = -779358423 - ) - @Export("SpriteBuffer_spriteHeight") - public static int SpriteBuffer_spriteHeight; - @ObfuscatedName("ba") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "[Llp;" + signature = "Lkc;" ) - @Export("worldSelectStars") - static IndexedSprite[] worldSelectStars; - @ObfuscatedName("jg") + @Export("NetCache_responseArchiveBuffer") + public static Buffer NetCache_responseArchiveBuffer; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lho;" - ) - @Export("dragInventoryWidget") - static Widget dragInventoryWidget; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "[Lda;" + signature = "[Ldw;" ) @Export("frames") Animation[] frames; @ObfuscatedSignature( - signature = "(Lhp;Lhp;IZ)V", + signature = "(Lhq;Lhq;IZ)V", garbageValue = "0" ) public Frames(AbstractArchive var1, AbstractArchive var2, int var3, boolean var4) { @@ -65,13 +52,59 @@ public class Frames extends DualNode { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-546780661" + garbageValue = "1903935769" ) @Export("hasAlphaTransform") public boolean hasAlphaTransform(int var1) { return this.frames[var1].hasAlphaTransform; } + + @ObfuscatedName("fc") + @ObfuscatedSignature( + signature = "(IB)V", + garbageValue = "3" + ) + @Export("forceDisconnect") + static final void forceDisconnect(int var0) { + class1.logOut(); + switch(var0) { + case 1: + Login.loginIndex = 24; + GrandExchangeOffer.setLoginResponseString("", "You were disconnected from the server.", ""); + break; + case 2: + Players.method2298(); + } + + } + + @ObfuscatedName("gb") + @ObfuscatedSignature( + signature = "(S)V", + garbageValue = "-13007" + ) + static void method3397() { + if (class215.localPlayer.x >> 7 == Client.destinationX && class215.localPlayer.y >> 7 == Client.destinationY) { + Client.destinationX = 0; + } + + } + + @ObfuscatedName("jp") + @ObfuscatedSignature( + signature = "(II)Z", + garbageValue = "-244259971" + ) + static boolean method3400(int var0) { + for (int var1 = 0; var1 < Client.field866; ++var1) { + if (Client.field854[var1] == var0) { + return true; + } + } + + return false; + } } diff --git a/runescape-client/src/main/java/Friend.java b/runescape-client/src/main/java/Friend.java index 04bd529bf6..bff6c89b1d 100644 --- a/runescape-client/src/main/java/Friend.java +++ b/runescape-client/src/main/java/Friend.java @@ -3,21 +3,21 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jy") +@ObfuscatedName("jf") @Implements("Friend") public class Friend extends Buddy { - @ObfuscatedName("z") - boolean field3615; - @ObfuscatedName("n") - boolean field3614; + @ObfuscatedName("a") + boolean field3613; + @ObfuscatedName("t") + boolean field3611; Friend() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljy;I)I", - garbageValue = "371914259" + signature = "(Ljf;I)I", + garbageValue = "-1251947576" ) @Export("compareToFriend") int compareToFriend(Friend var1) { @@ -29,23 +29,23 @@ public class Friend extends Buddy { return -1; } else if (var1.world != 0 && super.world == 0) { return 1; - } else if (this.field3615 && !var1.field3615) { + } else if (this.field3613 && !var1.field3613) { return -1; - } else if (!this.field3615 && var1.field3615) { + } else if (!this.field3613 && var1.field3613) { return 1; - } else if (this.field3614 && !var1.field3614) { + } else if (this.field3611 && !var1.field3611) { return -1; - } else if (!this.field3614 && var1.field3614) { + } else if (!this.field3611 && var1.field3611) { return 1; } else { return super.world != 0 ? super.int2 - var1.int2 : var1.int2 - super.int2; } } - @ObfuscatedName("l") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(Ljh;I)I", - garbageValue = "-531306911" + signature = "(Ljg;I)I", + garbageValue = "105019827" ) @Export("compareTo_user") public int compareTo_user(User var1) { @@ -55,312 +55,4 @@ public class Friend extends Buddy { public int compareTo(Object var1) { return this.compareToFriend((Friend)var1); } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "530220947" - ) - static void method5148() { - Tiles.field501 = null; - Tiles.field483 = null; - DevicePcmPlayerProvider.field393 = null; - class287.field3634 = null; - Tiles.field488 = null; - Tiles.field486 = null; - DevicePcmPlayerProvider.field386 = null; - Tiles.Tiles_hue = null; - ArchiveLoader.Tiles_saturation = null; - Tiles.Tiles_lightness = null; - FontName.Tiles_hueMultiplier = null; - Tiles.field487 = null; - } - - @ObfuscatedName("fp") - @ObfuscatedSignature( - signature = "(IIIII)V", - garbageValue = "-541695875" - ) - @Export("drawEntities") - static final void drawEntities(int var0, int var1, int var2, int var3) { - ++Client.viewportDrawCount; - if (class223.localPlayer.x >> 7 == Client.destinationX && class223.localPlayer.y >> 7 == Client.destinationY) { - Client.destinationX = 0; - } - - if (Client.renderSelf) { - Players.addPlayerToScene(class223.localPlayer, false); - } - - UrlRequest.method3279(); - class4.addNpcsToScene(true); - Login.method2114(); - class4.addNpcsToScene(false); - DynamicObject.method2225(); - - for (GraphicsObject var4 = (GraphicsObject)Client.graphicsObjects.last(); var4 != null; var4 = (GraphicsObject)Client.graphicsObjects.previous()) { - if (var4.plane == WorldMapRectangle.plane && !var4.isFinished) { - if (Client.cycle >= var4.cycleStart) { - var4.advance(Client.field698); - if (var4.isFinished) { - var4.remove(); - } else { - PacketWriter.scene.drawEntity(var4.plane, var4.x, var4.y, var4.height, 60, var4, 0, -1L, false); - } - } - } else { - var4.remove(); - } - } - - AbstractByteArrayCopier.setViewportShape(var0, var1, var2, var3, true); - var0 = Client.viewportOffsetX; - var1 = Client.viewportOffsetY; - var2 = Client.viewportWidth; - var3 = Client.viewportHeight; - Rasterizer2D.Rasterizer2D_setClip(var0, var1, var0 + var2, var3 + var1); - Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); - int var5; - int var6; - int var7; - int var8; - int var11; - int var15; - if (!Client.isCameraLocked) { - var15 = Client.camAngleX; - if (Client.field722 / 256 > var15) { - var15 = Client.field722 / 256; - } - - if (Client.field835[4] && Client.field883[4] + 128 > var15) { - var15 = Client.field883[4] + 128; - } - - var5 = Client.camAngleY & 2047; - var6 = ObjectSound.oculusOrbFocalPointX; - var7 = ModelData0.field1840; - var8 = class14.oculusOrbFocalPointY; - var11 = var15 * 3 + 600; - NPCDefinition.method4677(var6, var7, var8, var15, var5, var11, var3); - } - - int var9; - int var10; - int var12; - int var13; - int var14; - if (!Client.isCameraLocked) { - if (AbstractArchive.clientPreferences.roofsHidden) { - var5 = WorldMapRectangle.plane; - } else { - label409: { - var6 = 3; - if (IgnoreList.cameraPitch < 310) { - if (Client.oculusOrbState == 1) { - var7 = ObjectSound.oculusOrbFocalPointX >> 7; - var8 = class14.oculusOrbFocalPointY >> 7; - } else { - var7 = class223.localPlayer.x >> 7; - var8 = class223.localPlayer.y >> 7; - } - - var9 = GrandExchangeOfferOwnWorldComparator.cameraX >> 7; - var10 = WorldMapIcon_1.cameraZ >> 7; - if (var9 < 0 || var10 < 0 || var9 >= 104 || var10 >= 104) { - var5 = WorldMapRectangle.plane; - break label409; - } - - if (var7 < 0 || var8 < 0 || var7 >= 104 || var8 >= 104) { - var5 = WorldMapRectangle.plane; - break label409; - } - - if ((Tiles.Tiles_renderFlags[WorldMapRectangle.plane][var9][var10] & 4) != 0) { - var6 = WorldMapRectangle.plane; - } - - if (var7 > var9) { - var11 = var7 - var9; - } else { - var11 = var9 - var7; - } - - if (var8 > var10) { - var12 = var8 - var10; - } else { - var12 = var10 - var8; - } - - if (var11 > var12) { - var13 = var12 * 65536 / var11; - var14 = 32768; - - while (var7 != var9) { - if (var9 < var7) { - ++var9; - } else if (var9 > var7) { - --var9; - } - - if ((Tiles.Tiles_renderFlags[WorldMapRectangle.plane][var9][var10] & 4) != 0) { - var6 = WorldMapRectangle.plane; - } - - var14 += var13; - if (var14 >= 65536) { - var14 -= 65536; - if (var10 < var8) { - ++var10; - } else if (var10 > var8) { - --var10; - } - - if ((Tiles.Tiles_renderFlags[WorldMapRectangle.plane][var9][var10] & 4) != 0) { - var6 = WorldMapRectangle.plane; - } - } - } - } else if (var12 > 0) { - var13 = var11 * 65536 / var12; - var14 = 32768; - - while (var8 != var10) { - if (var10 < var8) { - ++var10; - } else if (var10 > var8) { - --var10; - } - - if ((Tiles.Tiles_renderFlags[WorldMapRectangle.plane][var9][var10] & 4) != 0) { - var6 = WorldMapRectangle.plane; - } - - var14 += var13; - if (var14 >= 65536) { - var14 -= 65536; - if (var9 < var7) { - ++var9; - } else if (var9 > var7) { - --var9; - } - - if ((Tiles.Tiles_renderFlags[WorldMapRectangle.plane][var9][var10] & 4) != 0) { - var6 = WorldMapRectangle.plane; - } - } - } - } - } - - if (class223.localPlayer.x >= 0 && class223.localPlayer.y >= 0 && class223.localPlayer.x < 13312 && class223.localPlayer.y < 13312) { - if ((Tiles.Tiles_renderFlags[WorldMapRectangle.plane][class223.localPlayer.x >> 7][class223.localPlayer.y >> 7] & 4) != 0) { - var6 = WorldMapRectangle.plane; - } - - var5 = var6; - } else { - var5 = WorldMapRectangle.plane; - } - } - } - - var15 = var5; - } else { - var15 = class208.getHighestVisiblePlane(); - } - - var5 = GrandExchangeOfferOwnWorldComparator.cameraX; - var6 = Varcs.cameraY; - var7 = WorldMapIcon_1.cameraZ; - var8 = IgnoreList.cameraPitch; - var9 = WorldMapSection2.cameraYaw; - - for (var10 = 0; var10 < 5; ++var10) { - if (Client.field835[var10]) { - var11 = (int)(Math.random() * (double)(Client.field882[var10] * 2 + 1) - (double)Client.field882[var10] + Math.sin((double)Client.field884[var10] / 100.0D * (double)Client.field885[var10]) * (double)Client.field883[var10]); - if (var10 == 0) { - GrandExchangeOfferOwnWorldComparator.cameraX += var11; - } - - if (var10 == 1) { - Varcs.cameraY += var11; - } - - if (var10 == 2) { - WorldMapIcon_1.cameraZ += var11; - } - - if (var10 == 3) { - WorldMapSection2.cameraYaw = var11 + WorldMapSection2.cameraYaw & 2047; - } - - if (var10 == 4) { - IgnoreList.cameraPitch += var11; - if (IgnoreList.cameraPitch < 128) { - IgnoreList.cameraPitch = 128; - } - - if (IgnoreList.cameraPitch > 383) { - IgnoreList.cameraPitch = 383; - } - } - } - } - - var10 = MouseHandler.MouseHandler_x; - var11 = MouseHandler.MouseHandler_y; - if (MouseHandler.MouseHandler_lastButton != 0) { - var10 = MouseHandler.MouseHandler_lastPressedX; - var11 = MouseHandler.MouseHandler_lastPressedY; - } - - if (var10 >= var0 && var10 < var0 + var2 && var11 >= var1 && var11 < var3 + var1) { - WorldMapSection1.method582(var10 - var0, var11 - var1); - } else { - MenuAction.method2066(); - } - - WorldMapID.playPcmPlayers(); - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var3, 0); - WorldMapID.playPcmPlayers(); - var12 = Rasterizer3D.Rasterizer3D_zoom; - Rasterizer3D.Rasterizer3D_zoom = Client.viewportZoom; - PacketWriter.scene.draw(GrandExchangeOfferOwnWorldComparator.cameraX, Varcs.cameraY, WorldMapIcon_1.cameraZ, IgnoreList.cameraPitch, WorldMapSection2.cameraYaw, var15); - Rasterizer3D.Rasterizer3D_zoom = var12; - WorldMapID.playPcmPlayers(); - PacketWriter.scene.clearTempGameObjects(); - ViewportMouse.method2954(var0, var1, var2, var3); - Message.method1231(var0, var1); - ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).animate(Client.field698); - Client.field634 = 0; - var13 = class223.baseX * 64 + (class223.localPlayer.x >> 7); - var14 = class286.baseY * 64 + (class223.localPlayer.y >> 7); - if (var13 >= 3053 && var13 <= 3156 && var14 >= 3056 && var14 <= 3136) { - Client.field634 = 1; - } - - if (var13 >= 3072 && var13 <= 3118 && var14 >= 9492 && var14 <= 9535) { - Client.field634 = 1; - } - - if (Client.field634 == 1 && var13 >= 3139 && var13 <= 3199 && var14 >= 3008 && var14 <= 3062) { - Client.field634 = 0; - } - - GrandExchangeOfferOwnWorldComparator.cameraX = var5; - Varcs.cameraY = var6; - WorldMapIcon_1.cameraZ = var7; - IgnoreList.cameraPitch = var8; - WorldMapSection2.cameraYaw = var9; - if (Client.isLoading && class1.method5(true, false) == 0) { - Client.isLoading = false; - } - - if (Client.isLoading) { - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var3, 0); - WorldMapSprite.drawLoadingMessage("Loading - please wait.", false); - } - - } } diff --git a/runescape-client/src/main/java/FriendLoginUpdate.java b/runescape-client/src/main/java/FriendLoginUpdate.java index 196341310a..e2c4849aad 100644 --- a/runescape-client/src/main/java/FriendLoginUpdate.java +++ b/runescape-client/src/main/java/FriendLoginUpdate.java @@ -3,96 +3,37 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; @ObfuscatedName("jj") @Implements("FriendLoginUpdate") public class FriendLoginUpdate extends Link { - @ObfuscatedName("o") + @ObfuscatedName("gr") @ObfuscatedSignature( - signature = "Ldq;" + signature = "[Llx;" ) - @Export("soundCache") - public static SoundCache soundCache; - @ObfuscatedName("v") + @Export("headIconPkSprites") + static Sprite[] headIconPkSprites; + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1649732045 + intValue = -1234988847 ) - public int field3627; - @ObfuscatedName("u") + public int field3624; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Ljq;" + signature = "Lju;" ) @Export("username") public Username username; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("world") public short world; @ObfuscatedSignature( - signature = "(Ljq;I)V" + signature = "(Lju;I)V" ) FriendLoginUpdate(Username var1, int var2) { - this.field3627 = (int)(class30.currentTimeMillis() / 1000L); + this.field3624 = (int)(PlayerAppearance.currentTimeMillis() / 1000L); this.username = var1; this.world = (short)var2; } - - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(ILcu;ZS)I", - garbageValue = "-14883" - ) - static int method5193(int var0, Script var1, boolean var2) { - Widget var3; - if (var0 >= 2000) { - var0 -= 1000; - var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - } else { - var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - } - - WorldMapSectionType.invalidateWidget(var3); - if (var0 != ScriptOpcodes.CC_SETOBJECT && var0 != ScriptOpcodes.CC_SETOBJECT_NONUM && var0 != ScriptOpcodes.CC_SETOBJECT_ALWAYS_NUM) { - if (var0 == ScriptOpcodes.CC_SETNPCHEAD) { - var3.modelType = 2; - var3.modelId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETPLAYERHEAD_SELF) { - var3.modelType = 3; - var3.modelId = class223.localPlayer.appearance.getChatHeadId(); - return 1; - } else { - return 2; - } - } else { - Interpreter.Interpreter_intStackSize -= 2; - int var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var3.itemId = var4; - var3.itemQuantity = var5; - ItemDefinition var6 = Occluder.ItemDefinition_get(var4); - var3.modelAngleX = var6.xan2d; - var3.modelAngleY = var6.yan2d; - var3.modelAngleZ = var6.zan2d; - var3.modelOffsetX = var6.offsetX2d; - var3.modelOffsetY = var6.offsetY2d; - var3.modelZoom = var6.zoom2d; - if (var0 == ScriptOpcodes.CC_SETOBJECT_NONUM) { - var3.itemQuantityMode = 0; - } else if (var0 == ScriptOpcodes.CC_SETOBJECT_ALWAYS_NUM | var6.isStackable == 1) { - var3.itemQuantityMode = 1; - } else { - var3.itemQuantityMode = 2; - } - - if (var3.field2667 > 0) { - var3.modelZoom = var3.modelZoom * 32 / var3.field2667; - } else if (var3.rawWidth > 0) { - var3.modelZoom = var3.modelZoom * 32 / var3.rawWidth; - } - - return 1; - } - } } diff --git a/runescape-client/src/main/java/FriendSystem.java b/runescape-client/src/main/java/FriendSystem.java index 0c8c224209..4efcf20198 100644 --- a/runescape-client/src/main/java/FriendSystem.java +++ b/runescape-client/src/main/java/FriendSystem.java @@ -4,94 +4,88 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bf") +@ObfuscatedName("bb") @Implements("FriendSystem") public class FriendSystem { - @ObfuscatedName("kp") - @ObfuscatedGetter( - intValue = 784647043 - ) - @Export("menuWidth") - static int menuWidth; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) @Export("loginType") final LoginType loginType; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Ljz;" + signature = "Ljh;" ) @Export("friendsList") public final FriendsList friendsList; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Ljw;" + signature = "Lje;" ) @Export("ignoreList") public final IgnoreList ignoreList; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -154127357 + intValue = -1502987485 ) - int field1052; + int field1044; @ObfuscatedSignature( - signature = "(Lli;)V" + signature = "(Lln;)V" ) FriendSystem(LoginType var1) { - this.field1052 = 0; + this.field1044 = 0; this.loginType = var1; this.friendsList = new FriendsList(var1); this.ignoreList = new IgnoreList(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-537546182" + garbageValue = "-2101343080" ) - boolean method1863() { - return this.field1052 == 2; + boolean method1973() { + return this.field1044 == 2; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "1650406039" + ) + final void method1968() { + this.field1044 = 1; } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1827488115" - ) - final void method1864() { - this.field1052 = 1; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "87159269" + signature = "(Lkc;II)V", + garbageValue = "1319465817" ) @Export("readUpdate") final void readUpdate(Buffer var1, int var2) { this.friendsList.read(var1, var2); - this.field1052 = 2; - Coord.FriendSystem_invalidateFriends(); + this.field1044 = 2; + ByteArrayPool.FriendSystem_invalidateFriends(); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1809100173" + garbageValue = "-885412524" ) @Export("processFriendUpdates") final void processFriendUpdates() { for (FriendLoginUpdate var1 = (FriendLoginUpdate)this.friendsList.friendLoginUpdates.last(); var1 != null; var1 = (FriendLoginUpdate)this.friendsList.friendLoginUpdates.previous()) { - if ((long)var1.field3627 < class30.currentTimeMillis() / 1000L - 5L) { + if ((long)var1.field3624 < PlayerAppearance.currentTimeMillis() / 1000L - 5L) { if (var1.world > 0) { - class210.addGameMessage(5, "", var1.username + " has logged in."); + class30.addGameMessage(5, "", var1.username + " has logged in."); } if (var1.world == 0) { - class210.addGameMessage(5, "", var1.username + " has logged out."); + class30.addGameMessage(5, "", var1.username + " has logged out."); } var1.remove(); @@ -100,38 +94,38 @@ public class FriendSystem { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2097335947" + signature = "(B)V", + garbageValue = "-44" ) @Export("clear") final void clear() { - this.field1052 = 0; + this.field1044 = 0; this.friendsList.clear(); this.ignoreList.clear(); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Ljq;ZI)Z", - garbageValue = "-99546473" + signature = "(Lju;ZB)Z", + garbageValue = "-128" ) @Export("isFriended") final boolean isFriended(Username var1, boolean var2) { if (var1 == null) { return false; - } else if (var1.equals(class223.localPlayer.username)) { + } else if (var1.equals(class215.localPlayer.username)) { return true; } else { return this.friendsList.isFriended(var1, var2); } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Ljq;I)Z", - garbageValue = "-1271048446" + signature = "(Lju;S)Z", + garbageValue = "19045" ) @Export("isIgnored") final boolean isIgnored(Username var1) { @@ -142,10 +136,10 @@ public class FriendSystem { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "70213064" + signature = "(Ljava/lang/String;B)V", + garbageValue = "14" ) @Export("addFriend") final void addFriend(String var1) { @@ -153,54 +147,41 @@ public class FriendSystem { Username var2 = new Username(var1, this.loginType); if (var2.hasCleanName()) { StringBuilder var10000; - String var4; + String var3; if (this.friendsListIsFull()) { var10000 = null; - var4 = "Your friend list is full. Max of 200 for free users, and 400 for members"; - class210.addGameMessage(30, "", var4); - } else if (class223.localPlayer.username.equals(var2)) { - var10000 = null; - var4 = "You can't add yourself to your own friend list"; - class210.addGameMessage(30, "", var4); + var3 = "Your friend list is full. Max of 200 for free users, and 400 for members"; + class30.addGameMessage(30, "", var3); + } else if (class215.localPlayer.username.equals(var2)) { + WorldMapRegion.method599(); + } else if (this.isFriended(var2, false)) { + var10000 = (new StringBuilder()).append(var1); + Object var10001 = null; + var3 = var10000.append(" is already on your friend list").toString(); + class30.addGameMessage(30, "", var3); + } else if (this.isIgnored(var2)) { + Players.method2308(var1); } else { - Object var10001; - if (this.isFriended(var2, false)) { - var10000 = (new StringBuilder()).append(var1); - var10001 = null; - var4 = var10000.append(" is already on your friend list").toString(); - class210.addGameMessage(30, "", var4); - } else if (this.isIgnored(var2)) { - var10000 = new StringBuilder(); - var10001 = null; - var10000 = var10000.append("Please remove ").append(var1); - var10001 = null; - var4 = var10000.append(" from your ignore list first").toString(); - class210.addGameMessage(30, "", var4); - } else { - PacketBufferNode var3 = InterfaceParent.getPacketBufferNode(ClientPacket.field2264, Client.packetWriter.isaacCipher); - var3.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var1)); - var3.packetBuffer.writeStringCp1252NullTerminated(var1); - Client.packetWriter.addNode(var3); - } + method2024(var1); } } } } - @ObfuscatedName("i") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-414102513" + garbageValue = "1177214541" ) @Export("friendsListIsFull") final boolean friendsListIsFull() { - return this.friendsList.isFull() || this.friendsList.getSize() >= 200 && Client.field636 != 1; + return this.friendsList.isFull() || this.friendsList.getSize() >= 200 && Client.field749 != 1; } - @ObfuscatedName("c") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "1251138329" + signature = "(Ljava/lang/String;B)V", + garbageValue = "22" ) @Export("addIgnore") final void addIgnore(String var1) { @@ -208,54 +189,37 @@ public class FriendSystem { Username var2 = new Username(var1, this.loginType); if (var2.hasCleanName()) { if (this.canAddIgnore()) { - WorldMapCacheName.method644(); + ModelData0.method3380(); + } else if (class215.localPlayer.username.equals(var2)) { + class247.method4642(); + } else if (this.isIgnored(var2)) { + VarbitDefinition.method4651(var1); + } else if (this.isFriended(var2, false)) { + WorldMapIcon_1.method355(var1); } else { - StringBuilder var10000; - String var4; - if (class223.localPlayer.username.equals(var2)) { - var10000 = null; - var4 = "You can't add yourself to your own ignore list"; - class210.addGameMessage(30, "", var4); - } else { - Object var10001; - if (this.isIgnored(var2)) { - var10000 = (new StringBuilder()).append(var1); - var10001 = null; - var4 = var10000.append(" is already on your ignore list").toString(); - class210.addGameMessage(30, "", var4); - } else if (this.isFriended(var2, false)) { - var10000 = new StringBuilder(); - var10001 = null; - var10000 = var10000.append("Please remove ").append(var1); - var10001 = null; - var4 = var10000.append(" from your friend list first").toString(); - class210.addGameMessage(30, "", var4); - } else { - PacketBufferNode var3 = InterfaceParent.getPacketBufferNode(ClientPacket.field2279, Client.packetWriter.isaacCipher); - var3.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var1)); - var3.packetBuffer.writeStringCp1252NullTerminated(var1); - Client.packetWriter.addNode(var3); - } - } + PacketBufferNode var3 = SoundSystem.getPacketBufferNode(ClientPacket.field2202, Client.packetWriter.isaacCipher); + var3.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var1)); + var3.packetBuffer.writeStringCp1252NullTerminated(var1); + Client.packetWriter.addNode(var3); } } } } - @ObfuscatedName("o") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(S)Z", - garbageValue = "30910" + signature = "(B)Z", + garbageValue = "-54" ) @Export("canAddIgnore") final boolean canAddIgnore() { - return this.ignoreList.isFull() || this.ignoreList.getSize() >= 100 && Client.field636 != 1; + return this.ignoreList.isFull() || this.ignoreList.getSize() >= 100 && Client.field749 != 1; } - @ObfuscatedName("a") + @ObfuscatedName("s") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)V", - garbageValue = "1378951166" + garbageValue = "-248973546" ) @Export("removeFriend") final void removeFriend(String var1) { @@ -263,22 +227,22 @@ public class FriendSystem { Username var2 = new Username(var1, this.loginType); if (var2.hasCleanName()) { if (this.friendsList.removeByUsername(var2)) { - Client.field744 = Client.cycleCntr; - PacketBufferNode var3 = InterfaceParent.getPacketBufferNode(ClientPacket.field2232, Client.packetWriter.isaacCipher); - var3.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var1)); + MilliClock.method3604(); + PacketBufferNode var3 = SoundSystem.getPacketBufferNode(ClientPacket.field2227, Client.packetWriter.isaacCipher); + var3.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var1)); var3.packetBuffer.writeStringCp1252NullTerminated(var1); Client.packetWriter.addNode(var3); } - Coord.FriendSystem_invalidateFriends(); + ByteArrayPool.FriendSystem_invalidateFriends(); } } } - @ObfuscatedName("e") + @ObfuscatedName("b") @ObfuscatedSignature( signature = "(Ljava/lang/String;I)V", - garbageValue = "-1989545258" + garbageValue = "1867823329" ) @Export("removeIgnore") final void removeIgnore(String var1) { @@ -286,26 +250,49 @@ public class FriendSystem { Username var2 = new Username(var1, this.loginType); if (var2.hasCleanName()) { if (this.ignoreList.removeByUsername(var2)) { - Client.field744 = Client.cycleCntr; - PacketBufferNode var3 = InterfaceParent.getPacketBufferNode(ClientPacket.field2268, Client.packetWriter.isaacCipher); - var3.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var1)); + MilliClock.method3604(); + PacketBufferNode var3 = SoundSystem.getPacketBufferNode(ClientPacket.field2197, Client.packetWriter.isaacCipher); + var3.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var1)); var3.packetBuffer.writeStringCp1252NullTerminated(var1); Client.packetWriter.addNode(var3); } - class195.FriendSystem_invalidateIgnoreds(); + class42.FriendSystem_invalidateIgnoreds(); } } } - @ObfuscatedName("h") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "(Ljq;I)Z", - garbageValue = "869979117" + signature = "(Lju;B)Z", + garbageValue = "-6" ) @Export("isFriendAndHasWorld") final boolean isFriendAndHasWorld(Username var1) { Friend var2 = (Friend)this.friendsList.getByUsername(var1); return var2 != null && var2.hasWorld(); } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;I)V", + garbageValue = "-758327012" + ) + static final void method2024(String var0) { + PacketBufferNode var1 = SoundSystem.getPacketBufferNode(ClientPacket.field2247, Client.packetWriter.isaacCipher); + var1.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var0)); + var1.packetBuffer.writeStringCp1252NullTerminated(var0); + Client.packetWriter.addNode(var1); + } + + @ObfuscatedName("s") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "896810620" + ) + public static void method2038() { + ItemDefinition.ItemDefinition_cached.clear(); + ItemDefinition.ItemDefinition_cachedModels.clear(); + ItemDefinition.ItemDefinition_cachedSprites.clear(); + } } diff --git a/runescape-client/src/main/java/FriendsList.java b/runescape-client/src/main/java/FriendsList.java index 0fa2e79ec6..c68601b6b6 100644 --- a/runescape-client/src/main/java/FriendsList.java +++ b/runescape-client/src/main/java/FriendsList.java @@ -4,61 +4,61 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jz") +@ObfuscatedName("jh") @Implements("FriendsList") public class FriendsList extends UserList { - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) @Export("loginType") final LoginType loginType; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 348884647 + intValue = 823977789 ) - int field3607; - @ObfuscatedName("c") + int field3603; + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Lje;" + signature = "Lja;" ) @Export("friendLoginUpdates") public LinkDeque friendLoginUpdates; @ObfuscatedSignature( - signature = "(Lli;)V" + signature = "(Lln;)V" ) public FriendsList(LoginType var1) { super(400); - this.field3607 = 1; + this.field3603 = 1; this.friendLoginUpdates = new LinkDeque(); this.loginType = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)Ljh;", - garbageValue = "2" + signature = "(I)Ljg;", + garbageValue = "-706396611" ) @Export("newInstance") User newInstance() { return new Friend(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)[Ljh;", - garbageValue = "951526901" + signature = "(II)[Ljg;", + garbageValue = "1510983955" ) @Export("newTypedArray") User[] newTypedArray(int var1) { return new Friend[var1]; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljq;ZB)Z", - garbageValue = "-80" + signature = "(Lju;ZI)Z", + garbageValue = "-163065823" ) @Export("isFriended") public boolean isFriended(Username var1, boolean var2) { @@ -70,10 +70,10 @@ public class FriendsList extends UserList { } } - @ObfuscatedName("m") + @ObfuscatedName("cw") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-1601651584" + signature = "(Lkc;II)V", + garbageValue = "1371210383" ) @Export("read") public void read(Buffer var1, int var2) { @@ -137,17 +137,17 @@ public class FriendsList extends UserList { } if (var6 != var11.world) { - var11.int2 = ++this.field3607 - 1; + var11.int2 = ++this.field3603 - 1; if (var11.world == -1 && var6 == 0) { - var11.int2 = -(var11.int2 * 1171982777) * -1761858423; + var11.int2 = -(var11.int2 * 357239599) * 1797004239; } var11.world = var6; } var11.rank = var7; - var11.field3615 = var9; - var11.field3614 = var10; + var11.field3613 = var9; + var11.field3611 = var10; continue; } @@ -158,4 +158,18 @@ public class FriendsList extends UserList { return; } } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Llr;III)I", + garbageValue = "2102175416" + ) + static int method5306(IterableNodeHashTable var0, int var1, int var2) { + if (var0 == null) { + return var2; + } else { + IntegerNode var3 = (IntegerNode)var0.get((long)var1); + return var3 == null ? var2 : var3.integer; + } + } } diff --git a/runescape-client/src/main/java/GZipDecompressor.java b/runescape-client/src/main/java/GZipDecompressor.java index 6affd021d4..9cc91785eb 100644 --- a/runescape-client/src/main/java/GZipDecompressor.java +++ b/runescape-client/src/main/java/GZipDecompressor.java @@ -1,20 +1,20 @@ +import java.security.SecureRandom; import java.util.zip.Inflater; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lr") +@ObfuscatedName("lj") @Implements("GZipDecompressor") public class GZipDecompressor { - @ObfuscatedName("z") + @ObfuscatedName("eo") + @Export("secureRandom") + static SecureRandom secureRandom; + @ObfuscatedName("a") @Export("inflater") Inflater inflater; - public GZipDecompressor() { - this(-1, 1000000, 1000000); - } - @ObfuscatedSignature( signature = "(III)V", garbageValue = "1000000" @@ -22,10 +22,14 @@ public class GZipDecompressor { GZipDecompressor(int var1, int var2, int var3) { } - @ObfuscatedName("z") + public GZipDecompressor() { + this(-1, 1000000, 1000000); + } + + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;[BI)V", - garbageValue = "-1227959018" + signature = "(Lkc;[BI)V", + garbageValue = "924316150" ) @Export("decompress") public void decompress(Buffer var1, byte[] var2) { diff --git a/runescape-client/src/main/java/GameObject.java b/runescape-client/src/main/java/GameObject.java index d8cdd8b7f8..daf08cf491 100644 --- a/runescape-client/src/main/java/GameObject.java +++ b/runescape-client/src/main/java/GameObject.java @@ -4,95 +4,89 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ej") +@ObfuscatedName("ex") @Implements("GameObject") public final class GameObject { - @ObfuscatedName("gh") - @ObfuscatedSignature( - signature = "[Llf;" - ) - @Export("mapMarkerSprites") - static Sprite[] mapMarkerSprites; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Ler;" - ) - @Export("entity") - public Entity entity; - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 23072497 + intValue = -1950933673 ) @Export("plane") int plane; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1467218039 + intValue = -1570818829 ) @Export("height") int height; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1096373851 + intValue = -1477915037 ) @Export("centerX") int centerX; - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -921514335 + intValue = 1448814329 ) @Export("centerY") int centerY; - @ObfuscatedName("p") + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "Lep;" + ) + @Export("entity") + public Entity entity; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1901316909 + intValue = -1886669661 ) @Export("orientation") int orientation; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -714921437 + intValue = -564679873 ) @Export("startX") int startX; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -1336647537 + intValue = -441030449 ) @Export("endX") int endX; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1244242871 + intValue = -187063391 ) @Export("startY") int startY; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 1759509999 + intValue = -1484089673 ) @Export("endY") int endY; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -1933245697 + intValue = -875771859 ) - int field1914; - @ObfuscatedName("b") + int field1912; + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 505349389 + intValue = -1503559581 ) @Export("lastDrawn") int lastDrawn; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - longValue = 2276908467403178719L + longValue = -3849133574729992117L ) @Export("tag") public long tag; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 8294449 + intValue = 823124257 ) @Export("flags") int flags; @@ -101,4 +95,49 @@ public final class GameObject { this.tag = 0L; this.flags = 0; } + + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "(Lhi;I[B[BB)V", + garbageValue = "-22" + ) + @Export("Widget_setKey") + static final void Widget_setKey(Widget var0, int var1, byte[] var2, byte[] var3) { + if (var0.field2623 == null) { + if (var2 == null) { + return; + } + + var0.field2623 = new byte[11][]; + var0.field2624 = new byte[11][]; + var0.field2628 = new int[11]; + var0.field2626 = new int[11]; + } + + var0.field2623[var1] = var2; + if (var2 != null) { + var0.field2606 = true; + } else { + var0.field2606 = false; + + for (int var4 = 0; var4 < var0.field2623.length; ++var4) { + if (var0.field2623[var4] != null) { + var0.field2606 = true; + break; + } + } + } + + var0.field2624[var1] = var3; + } + + @ObfuscatedName("ii") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;Ljava/lang/String;IIIIB)V", + garbageValue = "-59" + ) + @Export("insertMenuItemNoShift") + public static final void insertMenuItemNoShift(String var0, String var1, int var2, int var3, int var4, int var5) { + ArchiveDiskAction.insertMenuItem(var0, var1, var2, var3, var4, var5, false); + } } diff --git a/runescape-client/src/main/java/GameShell.java b/runescape-client/src/main/java/GameShell.java index 002a66ad9e..660970500c 100644 --- a/runescape-client/src/main/java/GameShell.java +++ b/runescape-client/src/main/java/GameShell.java @@ -23,176 +23,166 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bh") +@ObfuscatedName("bg") @Implements("GameShell") public abstract class GameShell extends Applet implements Runnable, FocusListener, WindowListener { - @ObfuscatedName("rx") - @ObfuscatedGetter( - intValue = 41369600 - ) - static int field455; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfm;" + signature = "Lff;" ) @Export("taskHandler") protected static TaskHandler taskHandler; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lbh;" + signature = "Lbg;" ) @Export("gameShell") static GameShell gameShell; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1510935923 + intValue = -1568380543 ) @Export("GameShell_redundantStartThreadCount") static int GameShell_redundantStartThreadCount; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - longValue = -6691432732698375703L + longValue = -3934802970152503561L ) @Export("stopTimeMs") static long stopTimeMs; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("isKilled") static boolean isKilled; - @ObfuscatedName("q") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 1528666585 - ) - @Export("gameCyclesToDo") - static int gameCyclesToDo; - @ObfuscatedName("m") - @ObfuscatedGetter( - intValue = 1545406367 + intValue = -1371255407 ) @Export("cycleDurationMillis") static int cycleDurationMillis; @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1198168777 + intValue = 1482162353 ) @Export("fiveOrOne") static int fiveOrOne; - @ObfuscatedName("c") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 1818100921 + intValue = 808514129 ) @Export("fps") protected static int fps; - @ObfuscatedName("b") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Lfz;" + signature = "Lfk;" ) @Export("clock") static Clock clock; - @ObfuscatedName("a") + @ObfuscatedName("h") @Export("graphicsTickTimes") static long[] graphicsTickTimes; - @ObfuscatedName("t") + @ObfuscatedName("j") @Export("clientTickTimes") static long[] clientTickTimes; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = -1408016773 + intValue = 1342168007 ) - static int field443; - @ObfuscatedName("av") + static int field442; + @ObfuscatedName("af") @Export("volatileFocus") static volatile boolean volatileFocus; - @ObfuscatedName("aj") + @ObfuscatedName("ao") @ObfuscatedGetter( - longValue = -3573600455328537839L + longValue = -177025641845415175L ) @Export("garbageCollectorLastCollectionTime") static long garbageCollectorLastCollectionTime; - @ObfuscatedName("ay") + @ObfuscatedName("ai") @ObfuscatedGetter( - longValue = -7014184548821540431L + longValue = -5558564081282193119L ) @Export("garbageCollectorLastCheckTimeMs") static long garbageCollectorLastCheckTimeMs; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("hasErrored") boolean hasErrored; - @ObfuscatedName("h") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = -1930363707 + intValue = -204703651 ) @Export("contentWidth") protected int contentWidth; @ObfuscatedName("s") @ObfuscatedGetter( - intValue = -1513929399 + intValue = 392229745 ) @Export("contentHeight") protected int contentHeight; - @ObfuscatedName("f") + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = 618502281 + intValue = -1066655429 ) @Export("canvasX") int canvasX; - @ObfuscatedName("j") + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = -1744199249 + intValue = 1472937073 ) @Export("canvasY") int canvasY; - @ObfuscatedName("k") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = 2108655365 + intValue = 656950483 ) - int field436; - @ObfuscatedName("ac") + int field435; + @ObfuscatedName("aa") @ObfuscatedGetter( - intValue = -569680121 + intValue = 144301553 ) - int field437; - @ObfuscatedName("az") + int field419; + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = -1457123993 + intValue = 1666707357 ) @Export("maxCanvasWidth") int maxCanvasWidth; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @ObfuscatedGetter( - intValue = -587207601 + intValue = -298093883 ) @Export("maxCanvasHeight") int maxCanvasHeight; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @Export("frame") Frame frame; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("canvas") java.awt.Canvas canvas; + @ObfuscatedName("av") + volatile boolean field441; @ObfuscatedName("ax") - volatile boolean field420; - @ObfuscatedName("al") @Export("resizeCanvasNextFrame") boolean resizeCanvasNextFrame; - @ObfuscatedName("ad") + @ObfuscatedName("al") @Export("isCanvasInvalid") volatile boolean isCanvasInvalid; - @ObfuscatedName("an") + @ObfuscatedName("ap") @ObfuscatedGetter( - longValue = -4063357795447176907L + longValue = 1167951270454872895L ) - volatile long field446; - @ObfuscatedName("aq") + volatile long field445; + @ObfuscatedName("au") @ObfuscatedSignature( - signature = "Lav;" + signature = "Laf;" ) @Export("mouseWheelHandler") MouseWheelHandler mouseWheelHandler; - @ObfuscatedName("am") + @ObfuscatedName("ah") @Export("clipboard") Clipboard clipboard; - @ObfuscatedName("ae") + @ObfuscatedName("an") @Export("eventQueue") final EventQueue eventQueue; @@ -206,7 +196,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene fps = 0; graphicsTickTimes = new long[32]; clientTickTimes = new long[32]; - field443 = 500; + field442 = 500; volatileFocus = true; garbageCollectorLastCollectionTime = -1L; garbageCollectorLastCheckTimeMs = -1L; @@ -216,10 +206,10 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.hasErrored = false; this.canvasX = 0; this.canvasY = 0; - this.field420 = true; + this.field441 = true; this.resizeCanvasNextFrame = false; this.isCanvasInvalid = false; - this.field446 = 0L; + this.field445 = 0L; EventQueue var1 = null; try { @@ -228,37 +218,34 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } this.eventQueue = var1; - WorldMapDecoration.method345(new DevicePcmPlayerProvider()); + class297.method5550(new DevicePcmPlayerProvider()); } - @ObfuscatedName("u") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "1753820196" + garbageValue = "-2135691733" ) @Export("setMaxCanvasSize") protected final void setMaxCanvasSize(int var1, int var2) { if (this.maxCanvasWidth != var1 || var2 != this.maxCanvasHeight) { - this.method955(); + this.method1012(); } this.maxCanvasWidth = var1; this.maxCanvasHeight = var2; } - @ObfuscatedName("r") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(Ljava/lang/Object;I)V", - garbageValue = "669071767" + garbageValue = "1374052820" ) @Export("post") final void post(Object var1) { if (this.eventQueue != null) { for (int var2 = 0; var2 < 50 && this.eventQueue.peekEvent() != null; ++var2) { - try { - Thread.sleep(1L); - } catch (InterruptedException var4) { - } + ClanChat.method5367(1L); } if (var1 != null) { @@ -268,10 +255,10 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } } - @ObfuscatedName("p") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Lft;", - garbageValue = "-133806221" + signature = "(I)Lfl;", + garbageValue = "304684246" ) @Export("mouseWheel") protected MouseWheel mouseWheel() { @@ -283,10 +270,10 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene return this.mouseWheelHandler; } - @ObfuscatedName("q") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-2040782454" + garbageValue = "-1135938442" ) @Export("setUpClipboard") protected void setUpClipboard() { @@ -295,50 +282,53 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "-23270963" + signature = "(Ljava/lang/String;B)V", + garbageValue = "18" ) @Export("clipboardSetString") protected void clipboardSetString(String var1) { this.clipboard.setContents(new StringSelection(var1), (ClipboardOwner)null); } - @ObfuscatedName("y") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1635814939" + signature = "(B)V", + garbageValue = "-36" ) @Export("setUpKeyboard") protected final void setUpKeyboard() { - Skills.method4088(); + GrandExchangeEvents.method110(); java.awt.Canvas var1 = this.canvas; var1.setFocusTraversalKeysEnabled(false); var1.addKeyListener(KeyHandler.KeyHandler_instance); var1.addFocusListener(KeyHandler.KeyHandler_instance); } - @ObfuscatedName("i") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "2" + signature = "(I)V", + garbageValue = "-878530927" ) @Export("setUpMouse") protected final void setUpMouse() { - class43.method838(this.canvas); + java.awt.Canvas var1 = this.canvas; + var1.addMouseListener(MouseHandler.MouseHandler_instance); + var1.addMouseMotionListener(MouseHandler.MouseHandler_instance); + var1.addFocusListener(MouseHandler.MouseHandler_instance); } - @ObfuscatedName("c") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "684720685" + signature = "(B)V", + garbageValue = "-31" ) @Export("resizeCanvas") final void resizeCanvas() { Container var1 = this.container(); if (var1 != null) { Bounds var2 = this.getFrameContentBounds(); - this.contentWidth = Math.max(var2.highX, this.field436); - this.contentHeight = Math.max(var2.highY, this.field437); + this.contentWidth = Math.max(var2.highX, this.field435); + this.contentHeight = Math.max(var2.highY, this.field419); if (this.contentWidth <= 0) { this.contentWidth = 1; } @@ -347,43 +337,43 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.contentHeight = 1; } - FloorDecoration.canvasWidth = Math.min(this.contentWidth, this.maxCanvasWidth); - WallDecoration.canvasHeight = Math.min(this.contentHeight, this.maxCanvasHeight); - this.canvasX = (this.contentWidth - FloorDecoration.canvasWidth) / 2; + class286.canvasWidth = Math.min(this.contentWidth, this.maxCanvasWidth); + FloorUnderlayDefinition.canvasHeight = Math.min(this.contentHeight, this.maxCanvasHeight); + this.canvasX = (this.contentWidth - class286.canvasWidth) / 2; this.canvasY = 0; - this.canvas.setSize(FloorDecoration.canvasWidth, WallDecoration.canvasHeight); - class42.rasterProvider = new RasterProvider(FloorDecoration.canvasWidth, WallDecoration.canvasHeight, this.canvas); + this.canvas.setSize(class286.canvasWidth, FloorUnderlayDefinition.canvasHeight); + AbstractWorldMapData.rasterProvider = new RasterProvider(class286.canvasWidth, FloorUnderlayDefinition.canvasHeight, this.canvas); if (var1 == this.frame) { Insets var3 = this.frame.getInsets(); - this.canvas.setLocation(var3.left + this.canvasX, this.canvasY + var3.top); + this.canvas.setLocation(this.canvasX + var3.left, this.canvasY + var3.top); } else { this.canvas.setLocation(this.canvasX, this.canvasY); } - this.field420 = true; + this.field441 = true; this.resizeGame(); } } - @ObfuscatedName("b") + @ObfuscatedName("x") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "2027797509" + garbageValue = "2060332880" ) @Export("resizeGame") protected abstract void resizeGame(); - @ObfuscatedName("o") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1270672810" + signature = "(B)V", + garbageValue = "-77" ) @Export("clearBackground") void clearBackground() { int var1 = this.canvasX; int var2 = this.canvasY; - int var3 = this.contentWidth - FloorDecoration.canvasWidth - var1; - int var4 = this.contentHeight - WallDecoration.canvasHeight - var2; + int var3 = this.contentWidth - class286.canvasWidth - var1; + int var4 = this.contentHeight - FloorUnderlayDefinition.canvasHeight - var2; if (var1 > 0 || var3 > 0 || var2 > 0 || var4 > 0) { try { Container var5 = this.container(); @@ -418,36 +408,42 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } - @ObfuscatedName("a") + @ObfuscatedName("r") @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "147" + signature = "(I)V", + garbageValue = "1138022384" ) @Export("replaceCanvas") final void replaceCanvas() { - class83.method2069(this.canvas); - CollisionMap.method3544(this.canvas); + java.awt.Canvas var1 = this.canvas; + var1.removeKeyListener(KeyHandler.KeyHandler_instance); + var1.removeFocusListener(KeyHandler.KeyHandler_instance); + KeyHandler.field380 = -1; + KeyHandler.method914(this.canvas); if (this.mouseWheelHandler != null) { this.mouseWheelHandler.removeFrom(this.canvas); } this.addCanvas(); - java.awt.Canvas var1 = this.canvas; - var1.setFocusTraversalKeysEnabled(false); - var1.addKeyListener(KeyHandler.KeyHandler_instance); - var1.addFocusListener(KeyHandler.KeyHandler_instance); - class43.method838(this.canvas); + java.awt.Canvas var2 = this.canvas; + var2.setFocusTraversalKeysEnabled(false); + var2.addKeyListener(KeyHandler.KeyHandler_instance); + var2.addFocusListener(KeyHandler.KeyHandler_instance); + java.awt.Canvas var3 = this.canvas; + var3.addMouseListener(MouseHandler.MouseHandler_instance); + var3.addMouseMotionListener(MouseHandler.MouseHandler_instance); + var3.addFocusListener(MouseHandler.MouseHandler_instance); if (this.mouseWheelHandler != null) { this.mouseWheelHandler.addTo(this.canvas); } - this.method955(); + this.method1012(); } @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(IIII)V", - garbageValue = "-2112987351" + signature = "(IIIB)V", + garbageValue = "-122" ) @Export("startThread") protected final void startThread(int var1, int var2, int var3) { @@ -464,8 +460,8 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } gameShell = this; - FloorDecoration.canvasWidth = var1; - WallDecoration.canvasHeight = var2; + class286.canvasWidth = var1; + FloorUnderlayDefinition.canvasHeight = var2; RunException.RunException_revision = var3; RunException.RunException_applet = this; if (taskHandler == null) { @@ -474,16 +470,16 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene taskHandler.newThreadTask(this, 1); } catch (Exception var5) { - class32.RunException_sendStackTrace((String)null, var5); + User.RunException_sendStackTrace((String)null, var5); this.error("crash"); } } - @ObfuscatedName("x") + @ObfuscatedName("ag") @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "338" + signature = "(I)V", + garbageValue = "-1386190897" ) @Export("addCanvas") final synchronized void addCanvas() { @@ -493,47 +489,47 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene var1.remove(this.canvas); } - FloorDecoration.canvasWidth = Math.max(var1.getWidth(), this.field436); - WallDecoration.canvasHeight = Math.max(var1.getHeight(), this.field437); + class286.canvasWidth = Math.max(var1.getWidth(), this.field435); + FloorUnderlayDefinition.canvasHeight = Math.max(var1.getHeight(), this.field419); Insets var2; if (this.frame != null) { var2 = this.frame.getInsets(); - FloorDecoration.canvasWidth -= var2.right + var2.left; - WallDecoration.canvasHeight -= var2.bottom + var2.top; + class286.canvasWidth -= var2.left + var2.right; + FloorUnderlayDefinition.canvasHeight -= var2.top + var2.bottom; } this.canvas = new Canvas(this); var1.setBackground(Color.BLACK); var1.setLayout((LayoutManager)null); var1.add(this.canvas); - this.canvas.setSize(FloorDecoration.canvasWidth, WallDecoration.canvasHeight); + this.canvas.setSize(class286.canvasWidth, FloorUnderlayDefinition.canvasHeight); this.canvas.setVisible(true); this.canvas.setBackground(Color.BLACK); if (var1 == this.frame) { var2 = this.frame.getInsets(); - this.canvas.setLocation(var2.left + this.canvasX, this.canvasY + var2.top); + this.canvas.setLocation(var2.left + this.canvasX, var2.top + this.canvasY); } else { this.canvas.setLocation(this.canvasX, this.canvasY); } this.canvas.addFocusListener(this); this.canvas.requestFocus(); - this.field420 = true; - if (class42.rasterProvider != null && FloorDecoration.canvasWidth == class42.rasterProvider.width && WallDecoration.canvasHeight == class42.rasterProvider.height) { - ((RasterProvider)class42.rasterProvider).setComponent(this.canvas); - class42.rasterProvider.drawFull(0, 0); + this.field441 = true; + if (AbstractWorldMapData.rasterProvider != null && class286.canvasWidth == AbstractWorldMapData.rasterProvider.width && FloorUnderlayDefinition.canvasHeight == AbstractWorldMapData.rasterProvider.height) { + ((RasterProvider)AbstractWorldMapData.rasterProvider).setComponent(this.canvas); + AbstractWorldMapData.rasterProvider.drawFull(0, 0); } else { - class42.rasterProvider = new RasterProvider(FloorDecoration.canvasWidth, WallDecoration.canvasHeight, this.canvas); + AbstractWorldMapData.rasterProvider = new RasterProvider(class286.canvasWidth, FloorUnderlayDefinition.canvasHeight, this.canvas); } this.isCanvasInvalid = false; - this.field446 = class30.currentTimeMillis(); + this.field445 = PlayerAppearance.currentTimeMillis(); } - @ObfuscatedName("h") + @ObfuscatedName("ak") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "1598778852" + garbageValue = "927173753" ) @Export("checkHost") protected final boolean checkHost() { @@ -562,52 +558,52 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } } - @ObfuscatedName("s") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1775618326" + signature = "(B)V", + garbageValue = "0" ) @Export("clientTick") void clientTick() { - long var1 = class30.currentTimeMillis(); - long var3 = clientTickTimes[WorldMapID.clientTickTimeIdx]; - clientTickTimes[WorldMapID.clientTickTimeIdx] = var1; - WorldMapID.clientTickTimeIdx = WorldMapID.clientTickTimeIdx + 1 & 31; + long var1 = PlayerAppearance.currentTimeMillis(); + long var3 = clientTickTimes[class49.clientTickTimeIdx]; + clientTickTimes[class49.clientTickTimeIdx] = var1; + class49.clientTickTimeIdx = class49.clientTickTimeIdx + 1 & 31; if (0L != var3 && var1 > var3) { } synchronized(this) { - TaskHandler.hasFocus = volatileFocus; + class30.hasFocus = volatileFocus; } this.doCycle(); } - @ObfuscatedName("f") + @ObfuscatedName("am") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-2138228896" + signature = "(B)V", + garbageValue = "4" ) @Export("graphicsTick") void graphicsTick() { Container var1 = this.container(); - long var2 = class30.currentTimeMillis(); - long var4 = graphicsTickTimes[Varcs.graphicsTickTimeIdx]; - graphicsTickTimes[Varcs.graphicsTickTimeIdx] = var2; - Varcs.graphicsTickTimeIdx = Varcs.graphicsTickTimeIdx + 1 & 31; - if (var4 != 0L && var2 > var4) { + long var2 = PlayerAppearance.currentTimeMillis(); + long var4 = graphicsTickTimes[Messages.graphicsTickTimeIdx]; + graphicsTickTimes[Messages.graphicsTickTimeIdx] = var2; + Messages.graphicsTickTimeIdx = Messages.graphicsTickTimeIdx + 1 & 31; + if (0L != var4 && var2 > var4) { int var6 = (int)(var2 - var4); fps = ((var6 >> 1) + 32000) / var6; } - if (++field443 - 1 > 50) { - field443 -= 50; - this.field420 = true; - this.canvas.setSize(FloorDecoration.canvasWidth, WallDecoration.canvasHeight); + if (++field442 - 1 > 50) { + field442 -= 50; + this.field441 = true; + this.canvas.setSize(class286.canvasWidth, FloorUnderlayDefinition.canvasHeight); this.canvas.setVisible(true); if (var1 == this.frame) { Insets var7 = this.frame.getInsets(); - this.canvas.setLocation(this.canvasX + var7.left, var7.top + this.canvasY); + this.canvas.setLocation(this.canvasX + var7.left, this.canvasY + var7.top); } else { this.canvas.setLocation(this.canvasX, this.canvasY); } @@ -617,21 +613,21 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.replaceCanvas(); } - this.method957(); - this.draw(this.field420); - if (this.field420) { + this.method1011(); + this.draw(this.field441); + if (this.field441) { this.clearBackground(); } - this.field420 = false; + this.field441 = false; } - @ObfuscatedName("j") + @ObfuscatedName("ab") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "26" + signature = "(I)V", + garbageValue = "-2098606310" ) - final void method957() { + final void method1011() { Bounds var1 = this.getFrameContentBounds(); if (var1.highX != this.contentWidth || this.contentHeight != var1.highY || this.resizeCanvasNextFrame) { this.resizeCanvas(); @@ -640,19 +636,19 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } - @ObfuscatedName("d") + @ObfuscatedName("ax") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1152400885" + garbageValue = "65535" ) - final void method955() { + final void method1012() { this.resizeCanvasNextFrame = true; } - @ObfuscatedName("l") + @ObfuscatedName("al") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "65280" + signature = "(B)V", + garbageValue = "26" ) @Export("kill") final synchronized void kill() { @@ -683,91 +679,91 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } } - this.vmethod1307(); + this.vmethod1393(); } } - @ObfuscatedName("ar") + @ObfuscatedName("aj") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "16" + signature = "(I)V", + garbageValue = "-1799342365" ) @Export("setUp") protected abstract void setUp(); - @ObfuscatedName("ab") + @ObfuscatedName("ae") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-60" + garbageValue = "-127" ) @Export("doCycle") protected abstract void doCycle(); - @ObfuscatedName("ax") + @ObfuscatedName("au") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "-1679134607" + garbageValue = "-1361952953" ) @Export("draw") protected abstract void draw(boolean var1); - @ObfuscatedName("as") + @ObfuscatedName("ah") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "87" + signature = "(I)V", + garbageValue = "-1838623985" ) @Export("kill0") protected abstract void kill0(); - @ObfuscatedName("ao") + @ObfuscatedName("an") @ObfuscatedSignature( signature = "(ILjava/lang/String;ZB)V", - garbageValue = "-67" + garbageValue = "74" ) @Export("drawInitial") protected final void drawInitial(int var1, String var2, boolean var3) { try { Graphics var4 = this.canvas.getGraphics(); - if (SequenceDefinition.fontHelvetica13 == null) { - SequenceDefinition.fontHelvetica13 = new java.awt.Font("Helvetica", 1, 13); - FloorOverlayDefinition.loginScreenFontMetrics = this.canvas.getFontMetrics(SequenceDefinition.fontHelvetica13); + if (GrandExchangeOffer.fontHelvetica13 == null) { + GrandExchangeOffer.fontHelvetica13 = new java.awt.Font("Helvetica", 1, 13); + class30.loginScreenFontMetrics = this.canvas.getFontMetrics(GrandExchangeOffer.fontHelvetica13); } if (var3) { var4.setColor(Color.black); - var4.fillRect(0, 0, FloorDecoration.canvasWidth, WallDecoration.canvasHeight); + var4.fillRect(0, 0, class286.canvasWidth, FloorUnderlayDefinition.canvasHeight); } Color var5 = new Color(140, 17, 17); try { - if (class81.field1127 == null) { - class81.field1127 = this.canvas.createImage(304, 34); + if (World.field996 == null) { + World.field996 = this.canvas.createImage(304, 34); } - Graphics var6 = class81.field1127.getGraphics(); + Graphics var6 = World.field996.getGraphics(); var6.setColor(var5); var6.drawRect(0, 0, 303, 33); var6.fillRect(2, 2, var1 * 3, 30); var6.setColor(Color.black); var6.drawRect(1, 1, 301, 31); var6.fillRect(var1 * 3 + 2, 2, 300 - var1 * 3, 30); - var6.setFont(SequenceDefinition.fontHelvetica13); + var6.setFont(GrandExchangeOffer.fontHelvetica13); var6.setColor(Color.white); - var6.drawString(var2, (304 - FloorOverlayDefinition.loginScreenFontMetrics.stringWidth(var2)) / 2, 22); - var4.drawImage(class81.field1127, FloorDecoration.canvasWidth / 2 - 152, WallDecoration.canvasHeight / 2 - 18, (ImageObserver)null); + var6.drawString(var2, (304 - class30.loginScreenFontMetrics.stringWidth(var2)) / 2, 22); + var4.drawImage(World.field996, class286.canvasWidth / 2 - 152, FloorUnderlayDefinition.canvasHeight / 2 - 18, (ImageObserver)null); } catch (Exception var9) { - int var7 = FloorDecoration.canvasWidth / 2 - 152; - int var8 = WallDecoration.canvasHeight / 2 - 18; + int var7 = class286.canvasWidth / 2 - 152; + int var8 = FloorUnderlayDefinition.canvasHeight / 2 - 18; var4.setColor(var5); var4.drawRect(var7, var8, 303, 33); var4.fillRect(var7 + 2, var8 + 2, var1 * 3, 30); var4.setColor(Color.black); var4.drawRect(var7 + 1, var8 + 1, 301, 31); var4.fillRect(var1 * 3 + var7 + 2, var8 + 2, 300 - var1 * 3, 30); - var4.setFont(SequenceDefinition.fontHelvetica13); + var4.setFont(GrandExchangeOffer.fontHelvetica13); var4.setColor(Color.white); - var4.drawString(var2, var7 + (304 - FloorOverlayDefinition.loginScreenFontMetrics.stringWidth(var2)) / 2, var8 + 22); + var4.drawString(var2, var7 + (304 - class30.loginScreenFontMetrics.stringWidth(var2)) / 2, var8 + 22); } } catch (Exception var10) { this.canvas.repaint(); @@ -775,21 +771,21 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } - @ObfuscatedName("al") + @ObfuscatedName("af") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "2129811981" + garbageValue = "807770545" ) - protected final void method1024() { - class81.field1127 = null; - SequenceDefinition.fontHelvetica13 = null; - FloorOverlayDefinition.loginScreenFontMetrics = null; + protected final void method1029() { + World.field996 = null; + GrandExchangeOffer.fontHelvetica13 = null; + class30.loginScreenFontMetrics = null; } - @ObfuscatedName("ad") + @ObfuscatedName("ay") @ObfuscatedSignature( signature = "(Ljava/lang/String;B)V", - garbageValue = "0" + garbageValue = "-32" ) @Export("error") protected void error(String var1) { @@ -805,26 +801,26 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } } - @ObfuscatedName("an") + @ObfuscatedName("az") @ObfuscatedSignature( - signature = "(B)Ljava/awt/Container;", - garbageValue = "-78" + signature = "(I)Ljava/awt/Container;", + garbageValue = "-1606453002" ) @Export("container") Container container() { return (Container)(this.frame != null ? this.frame : this); } - @ObfuscatedName("ai") + @ObfuscatedName("ao") @ObfuscatedSignature( - signature = "(B)Lll;", - garbageValue = "0" + signature = "(I)Lls;", + garbageValue = "-1228957997" ) @Export("getFrameContentBounds") Bounds getFrameContentBounds() { Container var1 = this.container(); - int var2 = Math.max(var1.getWidth(), this.field436); - int var3 = Math.max(var1.getHeight(), this.field437); + int var2 = Math.max(var1.getWidth(), this.field435); + int var3 = Math.max(var1.getHeight(), this.field419); if (this.frame != null) { Insets var4 = this.frame.getInsets(); var2 -= var4.left + var4.right; @@ -834,48 +830,37 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene return new Bounds(var2, var3); } - @ObfuscatedName("ak") + @ObfuscatedName("ai") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "97221829" + signature = "(B)Z", + garbageValue = "95" ) @Export("hasFrame") protected final boolean hasFrame() { return this.frame != null; } - @ObfuscatedName("am") + @ObfuscatedName("at") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-2052837160" + signature = "(B)V", + garbageValue = "-22" ) - protected abstract void vmethod1307(); + protected abstract void vmethod1393(); public final void destroy() { if (this == gameShell && !isKilled) { - stopTimeMs = class30.currentTimeMillis(); - long var1 = 4999L; - - try { - Thread.sleep(var1); - } catch (InterruptedException var5) { - } - - try { - Thread.sleep(1L); - } catch (InterruptedException var4) { - } - + stopTimeMs = PlayerAppearance.currentTimeMillis(); + ClanChat.method5367(5000L); this.kill(); } } public final synchronized void paint(Graphics var1) { if (this == gameShell && !isKilled) { - this.field420 = true; - if (class30.currentTimeMillis() - this.field446 > 1000L) { + this.field441 = true; + if (PlayerAppearance.currentTimeMillis() - this.field445 > 1000L) { Rectangle var2 = var1.getClipBounds(); - if (var2 == null || var2.width >= FloorDecoration.canvasWidth && var2.height >= WallDecoration.canvasHeight) { + if (var2 == null || var2.width >= class286.canvasWidth && var2.height >= FloorUnderlayDefinition.canvasHeight) { this.isCanvasInvalid = true; } } @@ -896,11 +881,11 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene if (var2.startsWith("1.6.0_")) { int var3; - for (var3 = 6; var3 < var2.length() && AbstractWorldMapIcon.isDigit(var2.charAt(var3)); ++var3) { + for (var3 = 6; var3 < var2.length() && ClientPacket.isDigit(var2.charAt(var3)); ++var3) { } String var4 = var2.substring(6, var3); - if (NetSocket.isNumber(var4) && TilePaint.parseInt(var4) < 10) { + if (AbstractWorldMapData.isNumber(var4) && ClientPreferences.parseInt(var4) < 10) { this.error("wrongjava"); return; } @@ -913,20 +898,28 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.setFocusCycleRoot(true); this.addCanvas(); this.setUp(); - clock = ItemContainer.newClock(); - while (0L == stopTimeMs || class30.currentTimeMillis() < stopTimeMs) { - gameCyclesToDo = clock.wait(cycleDurationMillis, fiveOrOne); + Object var8; + try { + var8 = new NanoClock(); + } catch (Throwable var6) { + var8 = new MilliClock(); + } - for (int var5 = 0; var5 < gameCyclesToDo; ++var5) { + clock = (Clock)var8; + + while (stopTimeMs == 0L || PlayerAppearance.currentTimeMillis() < stopTimeMs) { + ArchiveLoader.gameCyclesToDo = clock.wait(cycleDurationMillis, fiveOrOne); + + for (int var5 = 0; var5 < ArchiveLoader.gameCyclesToDo; ++var5) { this.clientTick(); } this.graphicsTick(); this.post(this.canvas); } - } catch (Exception var6) { - class32.RunException_sendStackTrace((String)null, var6); + } catch (Exception var7) { + User.RunException_sendStackTrace((String)null, var7); this.error("crash"); } @@ -941,19 +934,20 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public final void stop() { if (this == gameShell && !isKilled) { - stopTimeMs = class30.currentTimeMillis() + 4000L; + stopTimeMs = PlayerAppearance.currentTimeMillis() + 4000L; } } - public final void update(Graphics var1) { - this.paint(var1); + public final void focusGained(FocusEvent var1) { + volatileFocus = true; + this.field441 = true; } public final void focusLost(FocusEvent var1) { volatileFocus = false; } - public final void windowClosed(WindowEvent var1) { + public final void windowActivated(WindowEvent var1) { } public final void windowDeiconified(WindowEvent var1) { @@ -967,69 +961,70 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public abstract void init(); - public final void windowClosing(WindowEvent var1) { - this.destroy(); - } - - public final void windowActivated(WindowEvent var1) { + public final void windowClosed(WindowEvent var1) { } public final void windowDeactivated(WindowEvent var1) { } - public final void focusGained(FocusEvent var1) { - volatileFocus = true; - this.field420 = true; + public final void update(Graphics var1) { + this.paint(var1); } - @ObfuscatedName("ik") - @ObfuscatedSignature( - signature = "([Lho;Lho;ZI)V", - garbageValue = "-55146374" - ) - @Export("revalidateWidgetScroll") - static void revalidateWidgetScroll(Widget[] var0, Widget var1, boolean var2) { - int var3 = var1.scrollWidth != 0 ? var1.scrollWidth : var1.width; - int var4 = var1.scrollHeight != 0 ? var1.scrollHeight : var1.height; - FaceNormal.resizeInterface(var0, var1.id, var3, var4, var2); - if (var1.children != null) { - FaceNormal.resizeInterface(var1.children, var1.id, var3, var4, var2); - } - - InterfaceParent var5 = (InterfaceParent)Client.interfaceParents.get((long)var1.id); - if (var5 != null) { - class247.resizeComponents(var5.group, var3, var4, var2); - } - - if (var1.contentType == 1337) { - } - + public final void windowClosing(WindowEvent var1) { + this.destroy(); } - @ObfuscatedName("if") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIIIII)V", - garbageValue = "1376272907" + signature = "(I)V", + garbageValue = "1395167338" ) - @Export("drawScrollBar") - static final void drawScrollBar(int var0, int var1, int var2, int var3, int var4) { - class4.scrollBarSprites[0].drawAt(var0, var1); - class4.scrollBarSprites[1].drawAt(var0, var3 + var1 - 16); - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1 + 16, 16, var3 - 32, Client.field699); - int var5 = var3 * (var3 - 32) / var4; - if (var5 < 8) { - var5 = 8; + static void method1141() { + for (ObjectSound var0 = (ObjectSound)ObjectSound.objectSounds.last(); var0 != null; var0 = (ObjectSound)ObjectSound.objectSounds.previous()) { + if (var0.stream1 != null) { + FloorUnderlayDefinition.pcmStreamMixer.removeSubStream(var0.stream1); + var0.stream1 = null; + } + + if (var0.stream2 != null) { + FloorUnderlayDefinition.pcmStreamMixer.removeSubStream(var0.stream2); + var0.stream2 = null; + } } - int var6 = (var3 - 32 - var5) * var2 / (var4 - var3); - Rasterizer2D.Rasterizer2D_fillRectangle(var0, var6 + var1 + 16, 16, var5, Client.field700); - Rasterizer2D.Rasterizer2D_drawVerticalLine(var0, var6 + var1 + 16, var5, Client.field702); - Rasterizer2D.Rasterizer2D_drawVerticalLine(var0 + 1, var6 + var1 + 16, var5, Client.field702); - Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0, var6 + var1 + 16, 16, Client.field702); - Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0, var6 + var1 + 17, 16, Client.field702); - Rasterizer2D.Rasterizer2D_drawVerticalLine(var0 + 15, var6 + var1 + 16, var5, Client.field701); - Rasterizer2D.Rasterizer2D_drawVerticalLine(var0 + 14, var6 + var1 + 17, var5 - 1, Client.field701); - Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0, var6 + var5 + var1 + 15, 16, Client.field701); - Rasterizer2D.Rasterizer2D_drawHorizontalLine(var0 + 1, var5 + var6 + var1 + 14, 15, Client.field701); + ObjectSound.objectSounds.clear(); + } + + @ObfuscatedName("r") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-459731769" + ) + static int method1142(int var0, Script var1, boolean var2) { + Widget var3; + if (var0 >= 2000) { + var0 -= 1000; + var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + } else { + var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + } + + if (var0 == ScriptOpcodes.CC_CALLONRESIZE) { + if (Interpreter.field1080 >= 10) { + throw new RuntimeException(); + } else if (var3.onResize == null) { + return 0; + } else { + ScriptEvent var4 = new ScriptEvent(); + var4.widget = var3; + var4.args = var3.onResize; + var4.field550 = Interpreter.field1080 + 1; + Client.scriptEvents.addFirst(var4); + return 1; + } + } else { + return 2; + } } } diff --git a/runescape-client/src/main/java/GrandExchangeEvent.java b/runescape-client/src/main/java/GrandExchangeEvent.java index 4819050c65..b18689c590 100644 --- a/runescape-client/src/main/java/GrandExchangeEvent.java +++ b/runescape-client/src/main/java/GrandExchangeEvent.java @@ -4,36 +4,47 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("m") +@ObfuscatedName("o") @Implements("GrandExchangeEvent") public class GrandExchangeEvent { - @ObfuscatedName("z") + @ObfuscatedName("nl") @ObfuscatedGetter( - intValue = 1358084805 + intValue = -1005036451 + ) + static int field46; + @ObfuscatedName("bu") + @ObfuscatedSignature( + signature = "[Llx;" + ) + @Export("worldSelectBackSprites") + static Sprite[] worldSelectBackSprites; + @ObfuscatedName("a") + @ObfuscatedGetter( + intValue = 1055414531 ) @Export("world") public final int world; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - longValue = 5655370423736122045L + longValue = -1970915304396216385L ) @Export("age") public final long age; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Li;" + signature = "Ld;" ) @Export("grandExchangeOffer") public final GrandExchangeOffer grandExchangeOffer; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("offerName") String offerName; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("previousOfferName") String previousOfferName; @ObfuscatedSignature( - signature = "(Lkl;BI)V" + signature = "(Lkc;BI)V" ) GrandExchangeEvent(Buffer var1, byte var2, int var3) { this.offerName = var1.readStringCp1252NullTerminated(); @@ -43,8 +54,8 @@ public class GrandExchangeEvent { int var4 = var1.readInt(); int var5 = var1.readInt(); this.grandExchangeOffer = new GrandExchangeOffer(); - this.grandExchangeOffer.method110(2); - this.grandExchangeOffer.method117(var2); + this.grandExchangeOffer.method139(2); + this.grandExchangeOffer.method152(var2); this.grandExchangeOffer.unitPrice = var4; this.grandExchangeOffer.totalQuantity = var5; this.grandExchangeOffer.currentQuantity = 0; @@ -52,163 +63,50 @@ public class GrandExchangeEvent { this.grandExchangeOffer.id = var3; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "963027705" + garbageValue = "65536" ) @Export("getOfferName") public String getOfferName() { return this.offerName; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Ljava/lang/String;", - garbageValue = "1720570985" + signature = "(S)Ljava/lang/String;", + garbageValue = "3632" ) @Export("getPreviousOfferName") public String getPreviousOfferName() { return this.previousOfferName; } - @ObfuscatedName("c") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "33" + signature = "(II)Ljava/lang/String;", + garbageValue = "1325412403" ) - public static void method83() { - HitSplatDefinition.HitSplatDefinition_cached.clear(); - HitSplatDefinition.HitSplatDefinition_cachedSprites.clear(); - HitSplatDefinition.HitSplatDefinition_cachedFonts.clear(); + static String method122(int var0) { + return ""; } - @ObfuscatedName("gj") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lbt;B)V", - garbageValue = "76" + signature = "(DDII)[D", + garbageValue = "-2110450939" ) - static final void method88(PendingSpawn var0) { - long var1 = 0L; - int var3 = -1; - int var4 = 0; - int var5 = 0; - if (var0.type == 0) { - var1 = PacketWriter.scene.getBoundaryObjectTag(var0.plane, var0.x, var0.y); + public static double[] method123(double var0, double var2, int var4) { + int var5 = var4 * 2 + 1; + double[] var6 = new double[var5]; + int var7 = -var4; + + for (int var8 = 0; var7 <= var4; ++var8) { + var6[var8] = WorldMapSection1.method636((double)var7, var0, var2); + ++var7; } - if (var0.type == 1) { - var1 = PacketWriter.scene.getWallDecorationTag(var0.plane, var0.x, var0.y); - } - - if (var0.type == 2) { - var1 = PacketWriter.scene.getGameObjectTag(var0.plane, var0.x, var0.y); - } - - if (var0.type == 3) { - var1 = PacketWriter.scene.getFloorDecorationTag(var0.plane, var0.x, var0.y); - } - - if (0L != var1) { - int var6 = PacketWriter.scene.getObjectFlags(var0.plane, var0.x, var0.y, var1); - var3 = class81.Entity_unpackID(var1); - var4 = var6 & 31; - var5 = var6 >> 6 & 3; - } - - var0.objectId = var3; - var0.field921 = var4; - var0.field922 = var5; - } - - @ObfuscatedName("ie") - @ObfuscatedSignature( - signature = "(Lbi;IIII)V", - garbageValue = "1547441010" - ) - @Export("addPlayerToMenu") - static final void addPlayerToMenu(Player var0, int var1, int var2, int var3) { - if (class223.localPlayer != var0) { - if (Client.menuOptionsCount < 400) { - String var4; - int var7; - if (var0.skillLevel == 0) { - String var5 = var0.actions[0] + var0.username + var0.actions[1]; - var7 = var0.combatLevel; - int var8 = class223.localPlayer.combatLevel; - int var9 = var8 - var7; - String var6; - if (var9 < -9) { - var6 = World.colorStartTag(16711680); - } else if (var9 < -6) { - var6 = World.colorStartTag(16723968); - } else if (var9 < -3) { - var6 = World.colorStartTag(16740352); - } else if (var9 < 0) { - var6 = World.colorStartTag(16756736); - } else if (var9 > 9) { - var6 = World.colorStartTag(65280); - } else if (var9 > 6) { - var6 = World.colorStartTag(4259584); - } else if (var9 > 3) { - var6 = World.colorStartTag(8453888); - } else if (var9 > 0) { - var6 = World.colorStartTag(12648192); - } else { - var6 = World.colorStartTag(16776960); - } - - var4 = var5 + var6 + " " + " (" + "level-" + var0.combatLevel + ")" + var0.actions[2]; - } else { - var4 = var0.actions[0] + var0.username + var0.actions[1] + " " + " (" + "skill-" + var0.skillLevel + ")" + var0.actions[2]; - } - - int var10; - if (Client.isItemSelected == 1) { - WorldMapData_1.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + World.colorStartTag(16777215) + var4, 14, var1, var2, var3); - } else if (Client.isSpellSelected) { - if ((ItemContainer.selectedSpellFlags & 8) == 8) { - WorldMapData_1.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + World.colorStartTag(16777215) + var4, 15, var1, var2, var3); - } - } else { - for (var10 = 7; var10 >= 0; --var10) { - if (Client.playerMenuActions[var10] != null) { - short var11 = 0; - if (Client.playerMenuActions[var10].equalsIgnoreCase("Attack")) { - if (AttackOption.AttackOption_hidden == Client.playerAttackOption) { - continue; - } - - if (AttackOption.AttackOption_alwaysRightClick == Client.playerAttackOption || Client.playerAttackOption == AttackOption.AttackOption_dependsOnCombatLevels && var0.combatLevel > class223.localPlayer.combatLevel) { - var11 = 2000; - } - - if (class223.localPlayer.team != 0 && var0.team != 0) { - if (var0.team == class223.localPlayer.team) { - var11 = 2000; - } else { - var11 = 0; - } - } - } else if (Client.playerOptionsPriorities[var10]) { - var11 = 2000; - } - - boolean var12 = false; - var7 = Client.playerMenuOpcodes[var10] + var11; - WorldMapData_1.insertMenuItemNoShift(Client.playerMenuActions[var10], World.colorStartTag(16777215) + var4, var7, var1, var2, var3); - } - } - } - - for (var10 = 0; var10 < Client.menuOptionsCount; ++var10) { - if (Client.menuOpcodes[var10] == 23) { - Client.menuTargets[var10] = World.colorStartTag(16777215) + var4; - break; - } - } - - } - } + return var6; } } diff --git a/runescape-client/src/main/java/GrandExchangeEvents.java b/runescape-client/src/main/java/GrandExchangeEvents.java index 0204314d9c..c1c49465ed 100644 --- a/runescape-client/src/main/java/GrandExchangeEvents.java +++ b/runescape-client/src/main/java/GrandExchangeEvents.java @@ -7,22 +7,27 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("q") +@ObfuscatedName("c") @Implements("GrandExchangeEvents") public class GrandExchangeEvents { - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("GrandExchangeEvents_ageComparator") public static Comparator GrandExchangeEvents_ageComparator; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("GrandExchangeEvents_priceComparator") public static Comparator GrandExchangeEvents_priceComparator; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("GrandExchangeEvents_nameComparator") public static Comparator GrandExchangeEvents_nameComparator; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("GrandExchangeEvents_quantityComparator") public static Comparator GrandExchangeEvents_quantityComparator; - @ObfuscatedName("z") + @ObfuscatedName("lk") + @ObfuscatedSignature( + signature = "Lhi;" + ) + static Widget field39; + @ObfuscatedName("a") @Export("events") public final List events; @@ -35,7 +40,7 @@ public class GrandExchangeEvents { } @ObfuscatedSignature( - signature = "(Lkl;Z)V", + signature = "(Lkc;Z)V", garbageValue = "1" ) public GrandExchangeEvents(Buffer var1, boolean var2) { @@ -57,10 +62,10 @@ public class GrandExchangeEvents { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/util/Comparator;ZI)V", - garbageValue = "663869471" + signature = "(Ljava/util/Comparator;ZB)V", + garbageValue = "-120" ) @Export("sort") public void sort(Comparator var1, boolean var2) { @@ -72,41 +77,138 @@ public class GrandExchangeEvents { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([BZB)Ljava/lang/Object;", - garbageValue = "-1" + signature = "(I)V", + garbageValue = "-11933082" ) - public static Object method76(byte[] var0, boolean var1) { - if (var0 == null) { - return null; - } else if (var0.length > 136) { - DirectByteArrayCopier var2 = new DirectByteArrayCopier(); - var2.set(var0); - return var2; + static void method110() { + if (TaskHandler.javaVendor.toLowerCase().indexOf("microsoft") != -1) { + KeyHandler.KeyHandler_keyCodes[186] = 57; + KeyHandler.KeyHandler_keyCodes[187] = 27; + KeyHandler.KeyHandler_keyCodes[188] = 71; + KeyHandler.KeyHandler_keyCodes[189] = 26; + KeyHandler.KeyHandler_keyCodes[190] = 72; + KeyHandler.KeyHandler_keyCodes[191] = 73; + KeyHandler.KeyHandler_keyCodes[192] = 58; + KeyHandler.KeyHandler_keyCodes[219] = 42; + KeyHandler.KeyHandler_keyCodes[220] = 74; + KeyHandler.KeyHandler_keyCodes[221] = 43; + KeyHandler.KeyHandler_keyCodes[222] = 59; + KeyHandler.KeyHandler_keyCodes[223] = 28; } else { - return var0; + KeyHandler.KeyHandler_keyCodes[44] = 71; + KeyHandler.KeyHandler_keyCodes[45] = 26; + KeyHandler.KeyHandler_keyCodes[46] = 72; + KeyHandler.KeyHandler_keyCodes[47] = 73; + KeyHandler.KeyHandler_keyCodes[59] = 57; + KeyHandler.KeyHandler_keyCodes[61] = 27; + KeyHandler.KeyHandler_keyCodes[91] = 42; + KeyHandler.KeyHandler_keyCodes[92] = 74; + KeyHandler.KeyHandler_keyCodes[93] = 43; + KeyHandler.KeyHandler_keyCodes[192] = 28; + KeyHandler.KeyHandler_keyCodes[222] = 58; + KeyHandler.KeyHandler_keyCodes[520] = 59; } + } - @ObfuscatedName("ke") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lho;B)Lho;", - garbageValue = "91" + signature = "(IB)J", + garbageValue = "27" ) - static Widget method81(Widget var0) { - int var1 = UserComparator9.method3359(class2.getWidgetClickMask(var0)); - if (var1 == 0) { - return null; + public static long method109(int var0) { + return ViewportMouse.ViewportMouse_entityTags[var0]; + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(Ljava/lang/CharSequence;I)I", + garbageValue = "83870185" + ) + public static int method108(CharSequence var0) { + int var1 = var0.length(); + int var2 = 0; + + for (int var3 = 0; var3 < var1; ++var3) { + var2 = (var2 << 5) - var2 + var0.charAt(var3); + } + + return var2; + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(IS)Lem;", + garbageValue = "9638" + ) + @Export("getFrames") + static Frames getFrames(int var0) { + Frames var1 = (Frames)SequenceDefinition.SequenceDefinition_cachedFrames.get((long)var0); + if (var1 != null) { + return var1; } else { - for (int var2 = 0; var2 < var1; ++var2) { - var0 = Canvas.getWidget(var0.parentId); - if (var0 == null) { - return null; + AbstractArchive var3 = DevicePcmPlayerProvider.SequenceDefinition_animationsArchive; + AbstractArchive var4 = SequenceDefinition.SequenceDefinition_skeletonsArchive; + boolean var5 = true; + int[] var6 = var3.getGroupFileIds(var0); + + for (int var7 = 0; var7 < var6.length; ++var7) { + byte[] var8 = var3.getFile(var0, var6[var7]); + if (var8 == null) { + var5 = false; + } else { + int var9 = (var8[0] & 255) << 8 | var8[1] & 255; + byte[] var10 = var4.getFile(var9, 0); + if (var10 == null) { + var5 = false; + } } } - return var0; + Frames var2; + if (!var5) { + var2 = null; + } else { + try { + var2 = new Frames(var3, var4, var0, false); + } catch (Exception var12) { + var2 = null; + } + } + + if (var2 != null) { + SequenceDefinition.SequenceDefinition_cachedFrames.put(var2, (long)var0); + } + + return var2; + } + } + + @ObfuscatedName("gr") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;ZI)V", + garbageValue = "1827699856" + ) + @Export("drawLoadingMessage") + static final void drawLoadingMessage(String var0, boolean var1) { + if (Client.showLoadingMessages) { + byte var2 = 4; + int var3 = var2 + 6; + int var4 = var2 + 6; + int var5 = ArchiveDiskActionHandler.fontPlain12.lineWidth(var0, 250); + int var6 = ArchiveDiskActionHandler.fontPlain12.lineCount(var0, 250) * 13; + Rasterizer2D.Rasterizer2D_fillRectangle(var3 - var2, var4 - var2, var5 + var2 + var2, var2 + var6 + var2, 0); + Rasterizer2D.Rasterizer2D_drawRectangle(var3 - var2, var4 - var2, var2 + var5 + var2, var2 + var2 + var6, 16777215); + ArchiveDiskActionHandler.fontPlain12.drawLines(var0, var3, var4, var5, var6, 16777215, -1, 1, 1, 0); + class83.method2212(var3 - var2, var4 - var2, var2 + var2 + var5, var2 + var2 + var6); + if (var1) { + AbstractWorldMapData.rasterProvider.drawFull(0, 0); + } else { + WorldMapSection0.method279(var3, var4, var5, var6); + } + } } } diff --git a/runescape-client/src/main/java/GrandExchangeOffer.java b/runescape-client/src/main/java/GrandExchangeOffer.java index 17854de13d..d27a8e9937 100644 --- a/runescape-client/src/main/java/GrandExchangeOffer.java +++ b/runescape-client/src/main/java/GrandExchangeOffer.java @@ -1,48 +1,56 @@ -import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("i") +@ObfuscatedName("d") @Implements("GrandExchangeOffer") public class GrandExchangeOffer { - @ObfuscatedName("nx") - @ObfuscatedSignature( - signature = "[Lho;" + @ObfuscatedName("aq") + @Export("fontHelvetica13") + static java.awt.Font fontHelvetica13; + @ObfuscatedName("go") + @ObfuscatedGetter( + intValue = 1997230309 ) - static Widget[] field61; - @ObfuscatedName("z") + static int field61; + @ObfuscatedName("jo") + @ObfuscatedSignature( + signature = "Lhi;" + ) + @Export("dragInventoryWidget") + static Widget dragInventoryWidget; + @ObfuscatedName("a") @Export("state") byte state; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 152227217 + intValue = 517689507 ) @Export("id") public int id; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1304592967 + intValue = 969157751 ) @Export("unitPrice") public int unitPrice; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1942003277 + intValue = 1699214933 ) @Export("totalQuantity") public int totalQuantity; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 244433103 + intValue = 573459647 ) @Export("currentQuantity") public int currentQuantity; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 22250551 + intValue = 494126965 ) @Export("currentPrice") public int currentPrice; @@ -51,7 +59,7 @@ public class GrandExchangeOffer { } @ObfuscatedSignature( - signature = "(Lkl;Z)V", + signature = "(Lkc;Z)V", garbageValue = "0" ) public GrandExchangeOffer(Buffer var1, boolean var2) { @@ -63,42 +71,42 @@ public class GrandExchangeOffer { this.currentPrice = var1.readInt(); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-719257783" + signature = "(B)I", + garbageValue = "-108" ) @Export("status") public int status() { return this.state & 7; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-9" + signature = "(I)I", + garbageValue = "-928896233" ) @Export("type") public int type() { return (this.state & 8) == 8 ? 1 : 0; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1269791927" + signature = "(IS)V", + garbageValue = "-24365" ) - void method110(int var1) { + void method139(int var1) { this.state &= -8; this.state = (byte)(this.state | var1 & 7); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "3" + signature = "(II)V", + garbageValue = "-268336020" ) - void method117(int var1) { + void method152(int var1) { this.state &= -9; if (var1 == 1) { this.state = (byte)(this.state | 8); @@ -106,27 +114,158 @@ public class GrandExchangeOffer { } - @ObfuscatedName("gc") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ZI)V", - garbageValue = "2022647645" + signature = "(II)Lcj;", + garbageValue = "538429635" ) - static final void method129(boolean var0) { - WorldMapID.playPcmPlayers(); - ++Client.packetWriter.pendingWrites; - if (Client.packetWriter.pendingWrites >= 50 || var0) { - Client.packetWriter.pendingWrites = 0; - if (!Client.field730 && Client.packetWriter.getSocket() != null) { - PacketBufferNode var1 = InterfaceParent.getPacketBufferNode(ClientPacket.field2207, Client.packetWriter.isaacCipher); - Client.packetWriter.addNode(var1); - - try { - Client.packetWriter.flush(); - } catch (IOException var3) { - Client.field730 = true; - } + @Export("getScript") + static Script getScript(int var0) { + Script var1 = (Script)Script.Script_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = Occluder.archive12.takeFile(var0, 0); + if (var2 == null) { + return null; + } else { + var1 = WorldMapIcon_0.newScript(var2); + Script.Script_cached.put(var1, (long)var0); + return var1; } + } + } + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(Ljava/lang/CharSequence;II[BIB)I", + garbageValue = "-73" + ) + @Export("encodeStringCp1252") + public static int encodeStringCp1252(CharSequence var0, int var1, int var2, byte[] var3, int var4) { + int var5 = var2 - var1; + + for (int var6 = 0; var6 < var5; ++var6) { + char var7 = var0.charAt(var6 + var1); + if (var7 > 0 && var7 < 128 || var7 >= 160 && var7 <= 255) { + var3[var6 + var4] = (byte)var7; + } else if (var7 == 8364) { + var3[var6 + var4] = -128; + } else if (var7 == 8218) { + var3[var6 + var4] = -126; + } else if (var7 == 402) { + var3[var6 + var4] = -125; + } else if (var7 == 8222) { + var3[var6 + var4] = -124; + } else if (var7 == 8230) { + var3[var6 + var4] = -123; + } else if (var7 == 8224) { + var3[var6 + var4] = -122; + } else if (var7 == 8225) { + var3[var6 + var4] = -121; + } else if (var7 == 710) { + var3[var6 + var4] = -120; + } else if (var7 == 8240) { + var3[var6 + var4] = -119; + } else if (var7 == 352) { + var3[var6 + var4] = -118; + } else if (var7 == 8249) { + var3[var6 + var4] = -117; + } else if (var7 == 338) { + var3[var6 + var4] = -116; + } else if (var7 == 381) { + var3[var6 + var4] = -114; + } else if (var7 == 8216) { + var3[var6 + var4] = -111; + } else if (var7 == 8217) { + var3[var6 + var4] = -110; + } else if (var7 == 8220) { + var3[var6 + var4] = -109; + } else if (var7 == 8221) { + var3[var6 + var4] = -108; + } else if (var7 == 8226) { + var3[var6 + var4] = -107; + } else if (var7 == 8211) { + var3[var6 + var4] = -106; + } else if (var7 == 8212) { + var3[var6 + var4] = -105; + } else if (var7 == 732) { + var3[var6 + var4] = -104; + } else if (var7 == 8482) { + var3[var6 + var4] = -103; + } else if (var7 == 353) { + var3[var6 + var4] = -102; + } else if (var7 == 8250) { + var3[var6 + var4] = -101; + } else if (var7 == 339) { + var3[var6 + var4] = -100; + } else if (var7 == 382) { + var3[var6 + var4] = -98; + } else if (var7 == 376) { + var3[var6 + var4] = -97; + } else { + var3[var6 + var4] = 63; + } + } + + return var5; + } + + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V", + garbageValue = "-1089712950" + ) + @Export("setLoginResponseString") + static void setLoginResponseString(String var0, String var1, String var2) { + Login.Login_response1 = var0; + Login.Login_response2 = var1; + Login.Login_response3 = var2; + } + + @ObfuscatedName("jm") + @ObfuscatedSignature( + signature = "(III)Ljava/lang/String;", + garbageValue = "76295628" + ) + static final String method159(int var0, int var1) { + int var2 = var1 - var0; + if (var2 < -9) { + return AbstractArchive.colorStartTag(16711680); + } else if (var2 < -6) { + return AbstractArchive.colorStartTag(16723968); + } else if (var2 < -3) { + return AbstractArchive.colorStartTag(16740352); + } else if (var2 < 0) { + return AbstractArchive.colorStartTag(16756736); + } else if (var2 > 9) { + return AbstractArchive.colorStartTag(65280); + } else if (var2 > 6) { + return AbstractArchive.colorStartTag(4259584); + } else if (var2 > 3) { + return AbstractArchive.colorStartTag(8453888); + } else { + return var2 > 0 ? AbstractArchive.colorStartTag(12648192) : AbstractArchive.colorStartTag(16776960); + } + } + + @ObfuscatedName("jq") + @ObfuscatedSignature( + signature = "(II)Ljava/lang/String;", + garbageValue = "354835371" + ) + @Export("formatItemStacks") + static final String formatItemStacks(int var0) { + String var1 = Integer.toString(var0); + + for (int var2 = var1.length() - 3; var2 > 0; var2 -= 3) { + var1 = var1.substring(0, var2) + "," + var1.substring(var2); + } + + if (var1.length() > 9) { + return " " + AbstractArchive.colorStartTag(65408) + var1.substring(0, var1.length() - 8) + "M" + " " + " (" + var1 + ")" + ""; + } else { + return var1.length() > 6 ? " " + AbstractArchive.colorStartTag(16777215) + var1.substring(0, var1.length() - 4) + "K" + " " + " (" + var1 + ")" + "" : " " + AbstractArchive.colorStartTag(16776960) + var1 + ""; } } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferAgeComparator.java b/runescape-client/src/main/java/GrandExchangeOfferAgeComparator.java index feaa07f89c..265798c5e0 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferAgeComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferAgeComparator.java @@ -1,43 +1,26 @@ -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.net.URL; -import java.net.URLConnection; import java.util.Comparator; -import java.util.Random; +import java.util.Date; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("o") +@ObfuscatedName("h") @Implements("GrandExchangeOfferAgeComparator") final class GrandExchangeOfferAgeComparator implements Comparator { - @ObfuscatedName("pq") - @Export("ClanChat_inClanChat") - static boolean ClanChat_inClanChat; + @ObfuscatedName("hk") + @ObfuscatedGetter( + intValue = -1448356175 + ) + @Export("cameraZ") + static int cameraZ; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lho;" - ) - static Widget field76; - @ObfuscatedName("di") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive4") - static Archive archive4; - @ObfuscatedName("do") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive8") - static Archive archive8; - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lm;Lm;B)I", - garbageValue = "24" + signature = "(Lo;Lo;B)I", + garbageValue = "46" ) @Export("compare_bridged") int compare_bridged(GrandExchangeEvent var1, GrandExchangeEvent var2) { @@ -52,691 +35,215 @@ final class GrandExchangeOfferAgeComparator implements Comparator { return this.compare_bridged((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @ObfuscatedName("p") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-72081221" + signature = "(Lbi;I)V", + garbageValue = "-794060784" ) - static void method167() { - Login.Login_username = Login.Login_username.trim(); - if (Login.Login_username.length() == 0) { - PlayerType.setLoginResponseString("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); + @Export("runScriptEvent") + public static void runScriptEvent(ScriptEvent var0) { + class4.runScript(var0, 500000); + } + + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "(IIIII)I", + garbageValue = "1637402959" + ) + static final int method195(int var0, int var1, int var2, int var3) { + int var4 = 65536 - Rasterizer3D.Rasterizer3D_cosine[var2 * 1024 / var3] >> 1; + return ((65536 - var4) * var0 >> 16) + (var4 * var1 >> 16); + } + + @ObfuscatedName("ax") + @ObfuscatedSignature( + signature = "(ILcj;ZB)I", + garbageValue = "88" + ) + static int method196(int var0, Script var1, boolean var2) { + String var3; + int var4; + if (var0 == ScriptOpcodes.APPEND_NUM) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3 + var4; + return 1; } else { - long var1; - try { - URL var3 = new URL(FaceNormal.method3229("services", false) + "m=accountappeal/login.ws"); - URLConnection var4 = var3.openConnection(); - var4.setRequestProperty("connection", "close"); - var4.setDoInput(true); - var4.setDoOutput(true); - var4.setConnectTimeout(5000); - OutputStreamWriter var5 = new OutputStreamWriter(var4.getOutputStream()); - var5.write("data1=req"); - var5.flush(); - InputStream var6 = var4.getInputStream(); - Buffer var7 = new Buffer(new byte[1000]); - - while (true) { - int var8 = var6.read(var7.array, var7.offset, 1000 - var7.offset); - if (var8 == -1) { - var7.offset = 0; - long var31 = var7.readLong(); - var1 = var31; - break; - } - - var7.offset += var8; - if (var7.offset >= 1000) { - var1 = 0L; - break; - } - } - } catch (Exception var46) { - var1 = 0L; - } - - byte var0; - if (0L == var1) { - var0 = 5; + String var9; + if (var0 == ScriptOpcodes.APPEND) { + WorldMapDecoration.Interpreter_stringStackSize -= 2; + var3 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize]; + var9 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3 + var9; + return 1; + } else if (var0 == ScriptOpcodes.APPEND_SIGNNUM) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3 + WorldMapData_0.intToString(var4, true); + return 1; + } else if (var0 == ScriptOpcodes.LOWERCASE) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.toLowerCase(); + return 1; } else { - String var47 = Login.Login_username; - Random var48 = new Random(); - Buffer var35 = new Buffer(128); - Buffer var9 = new Buffer(128); - int[] var10 = new int[]{var48.nextInt(), var48.nextInt(), (int)(var1 >> 32), (int)var1}; - var35.writeByte(10); + int var6; + int var10; + if (var0 == ScriptOpcodes.FROMDATE) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + long var11 = (11745L + (long)var10) * 86400000L; + Interpreter.Interpreter_calendar.setTime(new Date(var11)); + var6 = Interpreter.Interpreter_calendar.get(5); + int var16 = Interpreter.Interpreter_calendar.get(2); + int var8 = Interpreter.Interpreter_calendar.get(1); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var6 + "-" + Interpreter.Interpreter_MONTHS[var16] + "-" + var8; + return 1; + } else if (var0 != ScriptOpcodes.TEXT_GENDER) { + if (var0 == ScriptOpcodes.TOSTRING) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = Integer.toString(var10); + return 1; + } else if (var0 == ScriptOpcodes.COMPARE) { + WorldMapDecoration.Interpreter_stringStackSize -= 2; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class326.method6375(ArchiveDiskAction.compareStrings(Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize], Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1], WorldMapSection1.clientLanguage)); + return 1; + } else { + int var5; + byte[] var13; + Font var14; + if (var0 == ScriptOpcodes.PARAHEIGHT) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Interpreter.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var13 = UrlRequest.archive13.takeFile(var5, 0); + var14 = new Font(var13); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14.lineCount(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.PARAWIDTH) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Interpreter.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var13 = UrlRequest.archive13.takeFile(var5, 0); + var14 = new Font(var13); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14.lineWidth(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.TEXT_SWITCH) { + WorldMapDecoration.Interpreter_stringStackSize -= 2; + var3 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize]; + var9 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1]; + if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var9; + } - int var11; - for (var11 = 0; var11 < 4; ++var11) { - var35.writeInt(var48.nextInt()); - } + return 1; + } else if (var0 == ScriptOpcodes.ESCAPE) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = AbstractFont.escapeBrackets(var3); + return 1; + } else if (var0 == ScriptOpcodes.APPEND_CHAR) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3 + (char)var4; + return 1; + } else if (var0 == ScriptOpcodes.CHAR_ISPRINTABLE) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapElement.isCharPrintable((char)var10) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CHAR_ISALPHANUMERIC) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator8.isAlphaNumeric((char)var10) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CHAR_ISALPHA) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ChatChannel.isCharAlphabetic((char)var10) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CHAR_ISNUMERIC) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ClientPacket.isDigit((char)var10) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.STRING_LENGTH) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + if (var3 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.length(); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } - var35.writeInt(var10[0]); - var35.writeInt(var10[1]); - var35.writeLong(var1); - var35.writeLong(0L); + return 1; + } else if (var0 == ScriptOpcodes.SUBSTRING) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Interpreter.Interpreter_intStackSize -= 2; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.substring(var4, var5); + return 1; + } else if (var0 == ScriptOpcodes.REMOVETAGS) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + StringBuilder var17 = new StringBuilder(var3.length()); + boolean var15 = false; - for (var11 = 0; var11 < 4; ++var11) { - var35.writeInt(var48.nextInt()); - } + for (var6 = 0; var6 < var3.length(); ++var6) { + char var7 = var3.charAt(var6); + if (var7 == '<') { + var15 = true; + } else if (var7 == '>') { + var15 = false; + } else if (!var15) { + var17.append(var7); + } + } - var35.encryptRsa(class80.field1119, class80.field1120); - var9.writeByte(10); - - for (var11 = 0; var11 < 3; ++var11) { - var9.writeInt(var48.nextInt()); - } - - var9.writeLong(var48.nextLong()); - var9.writeLongMedium(var48.nextLong()); - if (Client.randomDatData != null) { - var9.writeBytes(Client.randomDatData, 0, Client.randomDatData.length); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var17.toString(); + return 1; + } else if (var0 == ScriptOpcodes.STRING_INDEXOF_CHAR) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.indexOf(var4); + return 1; + } else if (var0 == ScriptOpcodes.STRING_INDEXOF_STRING) { + WorldMapDecoration.Interpreter_stringStackSize -= 2; + var3 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize]; + var9 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1]; + var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.indexOf(var9, var5); + return 1; + } else if (var0 == ScriptOpcodes.UPPERCASE) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.toUpperCase(); + return 1; + } else { + return 2; + } + } } else { - byte[] var12 = new byte[24]; - - try { - JagexCache.JagexCache_randomDat.seek(0L); - JagexCache.JagexCache_randomDat.readFully(var12); - - int var13; - for (var13 = 0; var13 < 24 && var12[var13] == 0; ++var13) { - } - - if (var13 >= 24) { - throw new IOException(); - } - } catch (Exception var45) { - for (int var14 = 0; var14 < 24; ++var14) { - var12[var14] = -1; - } - } - - var9.writeBytes(var12, 0, var12.length); - } - - var9.writeLong(var48.nextLong()); - var9.encryptRsa(class80.field1119, class80.field1120); - var11 = class268.stringCp1252NullTerminatedByteSize(var47); - if (var11 % 8 != 0) { - var11 += 8 - var11 % 8; - } - - Buffer var49 = new Buffer(var11); - var49.writeStringCp1252NullTerminated(var47); - var49.offset = var11; - var49.xteaEncryptAll(var10); - Buffer var36 = new Buffer(var49.offset + var35.offset + var9.offset + 5); - var36.writeByte(2); - var36.writeByte(var35.offset); - var36.writeBytes(var35.array, 0, var35.offset); - var36.writeByte(var9.offset); - var36.writeBytes(var9.array, 0, var9.offset); - var36.writeShort(var49.offset); - var36.writeBytes(var49.array, 0, var49.offset); - byte[] var15 = var36.array; - String var38 = class3.method52(var15, 0, var15.length); - String var16 = var38; - - byte var43; - try { - URL var17 = new URL(FaceNormal.method3229("services", false) + "m=accountappeal/login.ws"); - URLConnection var18 = var17.openConnection(); - var18.setDoInput(true); - var18.setDoOutput(true); - var18.setConnectTimeout(5000); - OutputStreamWriter var19 = new OutputStreamWriter(var18.getOutputStream()); - int var22 = var16.length(); - StringBuilder var23 = new StringBuilder(var22); - - int var27; - for (int var24 = 0; var24 < var22; ++var24) { - char var25 = var16.charAt(var24); - if ((var25 < 'a' || var25 > 'z') && (var25 < 'A' || var25 > 'Z') && (var25 < '0' || var25 > '9') && var25 != '.' && var25 != '-' && var25 != '*' && var25 != '_') { - if (var25 == ' ') { - var23.append('+'); - } else { - byte var26 = Entity.charToByteCp1252(var25); - var23.append('%'); - var27 = var26 >> 4 & 15; - if (var27 >= 10) { - var23.append((char)(var27 + 55)); - } else { - var23.append((char)(var27 + 48)); - } - - var27 = var26 & 15; - if (var27 >= 10) { - var23.append((char)(var27 + 55)); - } else { - var23.append((char)(var27 + 48)); - } - } - } else { - var23.append(var25); - } - } - - String var21 = var23.toString(); - String var50 = "data2=" + var21 + "&dest="; - int var51 = "passwordchoice.ws".length(); - StringBuilder var40 = new StringBuilder(var51); - - for (var27 = 0; var27 < var51; ++var27) { - char var28 = "passwordchoice.ws".charAt(var27); - if ((var28 < 'a' || var28 > 'z') && (var28 < 'A' || var28 > 'Z') && (var28 < '0' || var28 > '9') && var28 != '.' && var28 != '-' && var28 != '*' && var28 != '_') { - if (var28 == ' ') { - var40.append('+'); - } else { - byte var29 = Entity.charToByteCp1252(var28); - var40.append('%'); - int var30 = var29 >> 4 & 15; - if (var30 >= 10) { - var40.append((char)(var30 + 55)); - } else { - var40.append((char)(var30 + 48)); - } - - var30 = var29 & 15; - if (var30 >= 10) { - var40.append((char)(var30 + 55)); - } else { - var40.append((char)(var30 + 48)); - } - } - } else { - var40.append(var28); - } - } - - String var41 = var40.toString(); - var19.write(var50 + var41); - var19.flush(); - InputStream var42 = var18.getInputStream(); - var36 = new Buffer(new byte[1000]); - - while (true) { - int var52 = var42.read(var36.array, var36.offset, 1000 - var36.offset); - if (var52 == -1) { - var19.close(); - var42.close(); - String var53 = new String(var36.array); - if (var53.startsWith("OFFLINE")) { - var43 = 4; - } else if (var53.startsWith("WRONG")) { - var43 = 7; - } else if (var53.startsWith("RELOAD")) { - var43 = 3; - } else if (var53.startsWith("Not permitted for social network accounts.")) { - var43 = 6; - } else { - var36.xteaDecryptAll(var10); - - while (var36.offset > 0 && var36.array[var36.offset - 1] == 0) { - --var36.offset; - } - - var53 = new String(var36.array, 0, var36.offset); - if (LoginScreenAnimation.isValidURL(var53)) { - ArchiveDiskActionHandler.openURL(var53, true, false); - var43 = 2; - } else { - var43 = 5; - } - } - break; - } - - var36.offset += var52; - if (var36.offset >= 1000) { - var43 = 5; - break; - } - } - } catch (Throwable var44) { - var44.printStackTrace(); - var43 = 5; - } - - var0 = var43; - } - - switch(var0) { - case 2: - PlayerType.setLoginResponseString(Strings.field3008, Strings.field3009, Strings.field3010); - Login.loginIndex = 6; - break; - case 3: - PlayerType.setLoginResponseString("", "Error connecting to server.", ""); - break; - case 4: - PlayerType.setLoginResponseString("The part of the website you are trying", "to connect to is offline at the moment.", "Please try again later."); - break; - case 5: - PlayerType.setLoginResponseString("Sorry, there was an error trying to", "log you in to this part of the website.", "Please try again later."); - break; - case 6: - PlayerType.setLoginResponseString("", "Error connecting to server.", ""); - break; - case 7: - PlayerType.setLoginResponseString("You must enter a valid login to proceed. For accounts", "created after 24th November 2010, please use your", "email address. Otherwise please use your username."); - } - - } - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(IIIIIILex;Lfa;I)V", - garbageValue = "2071227561" - ) - static final void method165(int var0, int var1, int var2, int var3, int var4, int var5, Scene var6, CollisionMap var7) { - if (!Client.isLowDetail || (Tiles.Tiles_renderFlags[0][var1][var2] & 2) != 0 || (Tiles.Tiles_renderFlags[var0][var1][var2] & 16) == 0) { - if (var0 < Tiles.Tiles_minPlane) { - Tiles.Tiles_minPlane = var0; - } - - ObjectDefinition var8 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var3); - int var9; - int var10; - if (var4 != 1 && var4 != 3) { - var9 = var8.sizeX; - var10 = var8.sizeY; - } else { - var9 = var8.sizeY; - var10 = var8.sizeX; - } - - int var11; - int var12; - if (var9 + var1 <= 104) { - var11 = (var9 >> 1) + var1; - var12 = (var9 + 1 >> 1) + var1; - } else { - var11 = var1; - var12 = var1 + 1; - } - - int var13; - int var14; - if (var10 + var2 <= 104) { - var13 = (var10 >> 1) + var2; - var14 = var2 + (var10 + 1 >> 1); - } else { - var13 = var2; - var14 = var2 + 1; - } - - int[][] var15 = Tiles.Tiles_heights[var0]; - int var16 = var15[var12][var13] + var15[var11][var13] + var15[var11][var14] + var15[var12][var14] >> 2; - int var17 = (var1 << 7) + (var9 << 6); - int var18 = (var2 << 7) + (var10 << 6); - long var19 = class267.calculateTag(var1, var2, 2, var8.int1 == 0, var3); - int var21 = var5 + (var4 << 6); - if (var8.int3 == 1) { - var21 += 256; - } - - int var23; - int var24; - if (var8.hasSound()) { - ObjectSound var22 = new ObjectSound(); - var22.plane = var0; - var22.x = var1 * 128; - var22.y = var2 * 16384; - var23 = var8.sizeX; - var24 = var8.sizeY; - if (var4 == 1 || var4 == 3) { - var23 = var8.sizeY; - var24 = var8.sizeX; - } - - var22.field1059 = (var23 + var1) * 16384; - var22.field1060 = (var24 + var2) * 16384; - var22.soundEffectId = var8.ambientSoundId; - var22.field1061 = var8.int4 * 128; - var22.field1064 = var8.int5; - var22.field1070 = var8.int6; - var22.soundEffectIds = var8.soundEffectIds; - if (var8.transforms != null) { - var22.obj = var8; - var22.set(); - } - - ObjectSound.objectSounds.addFirst(var22); - if (var22.soundEffectIds != null) { - var22.field1067 = var22.field1064 + (int)(Math.random() * (double)(var22.field1070 - var22.field1064)); - } - } - - Object var34; - if (var5 == 22) { - if (!Client.isLowDetail || var8.int1 != 0 || var8.interactType == 1 || var8.boolean2) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(22, var4, var15, var17, var16, var18); + WorldMapDecoration.Interpreter_stringStackSize -= 2; + var3 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize]; + var9 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1]; + if (class215.localPlayer.appearance != null && class215.localPlayer.appearance.isFemale) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var9; } else { - var34 = new DynamicObject(var3, 22, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newFloorDecoration(var0, var1, var2, var16, (Entity)var34, var19, var21); - if (var8.interactType == 1 && var7 != null) { - var7.setBlockedByFloorDec(var1, var2); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3; } + return 1; } - } else if (var5 != 10 && var5 != 11) { - int[] var10000; - if (var5 >= 12) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(var5, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, var5, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.method3056(var0, var1, var2, var16, 1, 1, (Entity)var34, 0, var19, var21); - if (var5 >= 12 && var5 <= 17 && var5 != 13 && var0 > 0) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 2340; - } - - if (var8.interactType != 0 && var7 != null) { - var7.addGameObject(var1, var2, var9, var10, var8.boolean1); - } - - } else if (var5 == 0) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(0, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, 0, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var34, (Entity)null, Tiles.field489[var4], 0, var19, var21); - if (var4 == 0) { - if (var8.clipped) { - Tiles.field486[var0][var1][var2] = 50; - Tiles.field486[var0][var1][var2 + 1] = 50; - } - - if (var8.modelClipped) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 585; - } - } else if (var4 == 1) { - if (var8.clipped) { - Tiles.field486[var0][var1][var2 + 1] = 50; - Tiles.field486[var0][var1 + 1][var2 + 1] = 50; - } - - if (var8.modelClipped) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2 + 1] |= 1170; - } - } else if (var4 == 2) { - if (var8.clipped) { - Tiles.field486[var0][var1 + 1][var2] = 50; - Tiles.field486[var0][var1 + 1][var2 + 1] = 50; - } - - if (var8.modelClipped) { - var10000 = Tiles.field488[var0][var1 + 1]; - var10000[var2] |= 585; - } - } else if (var4 == 3) { - if (var8.clipped) { - Tiles.field486[var0][var1][var2] = 50; - Tiles.field486[var0][var1 + 1][var2] = 50; - } - - if (var8.modelClipped) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 1170; - } - } - - if (var8.interactType != 0 && var7 != null) { - var7.method3508(var1, var2, var5, var4, var8.boolean1); - } - - if (var8.int2 != 16) { - var6.method3127(var0, var1, var2, var8.int2); - } - - } else if (var5 == 1) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(1, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, 1, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var34, (Entity)null, Tiles.field493[var4], 0, var19, var21); - if (var8.clipped) { - if (var4 == 0) { - Tiles.field486[var0][var1][var2 + 1] = 50; - } else if (var4 == 1) { - Tiles.field486[var0][var1 + 1][var2 + 1] = 50; - } else if (var4 == 2) { - Tiles.field486[var0][var1 + 1][var2] = 50; - } else if (var4 == 3) { - Tiles.field486[var0][var1][var2] = 50; - } - } - - if (var8.interactType != 0 && var7 != null) { - var7.method3508(var1, var2, var5, var4, var8.boolean1); - } - - } else { - int var28; - if (var5 == 2) { - var28 = var4 + 1 & 3; - Object var29; - Object var30; - if (var8.animationId == -1 && var8.transforms == null) { - var29 = var8.getEntity(2, var4 + 4, var15, var17, var16, var18); - var30 = var8.getEntity(2, var28, var15, var17, var16, var18); - } else { - var29 = new DynamicObject(var3, 2, var4 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); - var30 = new DynamicObject(var3, 2, var28, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var29, (Entity)var30, Tiles.field489[var4], Tiles.field489[var28], var19, var21); - if (var8.modelClipped) { - if (var4 == 0) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 585; - var10000 = Tiles.field488[var0][var1]; - var10000[1 + var2] |= 1170; - } else if (var4 == 1) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2 + 1] |= 1170; - var10000 = Tiles.field488[var0][var1 + 1]; - var10000[var2] |= 585; - } else if (var4 == 2) { - var10000 = Tiles.field488[var0][var1 + 1]; - var10000[var2] |= 585; - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 1170; - } else if (var4 == 3) { - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 1170; - var10000 = Tiles.field488[var0][var1]; - var10000[var2] |= 585; - } - } - - if (var8.interactType != 0 && var7 != null) { - var7.method3508(var1, var2, var5, var4, var8.boolean1); - } - - if (var8.int2 != 16) { - var6.method3127(var0, var1, var2, var8.int2); - } - - } else if (var5 == 3) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(3, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, 3, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var34, (Entity)null, Tiles.field493[var4], 0, var19, var21); - if (var8.clipped) { - if (var4 == 0) { - Tiles.field486[var0][var1][var2 + 1] = 50; - } else if (var4 == 1) { - Tiles.field486[var0][var1 + 1][var2 + 1] = 50; - } else if (var4 == 2) { - Tiles.field486[var0][var1 + 1][var2] = 50; - } else if (var4 == 3) { - Tiles.field486[var0][var1][var2] = 50; - } - } - - if (var8.interactType != 0 && var7 != null) { - var7.method3508(var1, var2, var5, var4, var8.boolean1); - } - - } else if (var5 == 9) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(var5, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, var5, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.method3056(var0, var1, var2, var16, 1, 1, (Entity)var34, 0, var19, var21); - if (var8.interactType != 0 && var7 != null) { - var7.addGameObject(var1, var2, var9, var10, var8.boolean1); - } - - if (var8.int2 != 16) { - var6.method3127(var0, var1, var2, var8.int2); - } - - } else if (var5 == 4) { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(4, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, 4, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newWallDecoration(var0, var1, var2, var16, (Entity)var34, (Entity)null, Tiles.field489[var4], 0, 0, 0, var19, var21); - } else { - long var31; - Object var33; - if (var5 == 5) { - var28 = 16; - var31 = var6.getBoundaryObjectTag(var0, var1, var2); - if (0L != var31) { - var28 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(class81.Entity_unpackID(var31)).int2; - } - - if (var8.animationId == -1 && var8.transforms == null) { - var33 = var8.getEntity(4, var4, var15, var17, var16, var18); - } else { - var33 = new DynamicObject(var3, 4, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newWallDecoration(var0, var1, var2, var16, (Entity)var33, (Entity)null, Tiles.field489[var4], 0, var28 * Tiles.field491[var4], var28 * Tiles.field492[var4], var19, var21); - } else if (var5 == 6) { - var28 = 8; - var31 = var6.getBoundaryObjectTag(var0, var1, var2); - if (0L != var31) { - var28 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(class81.Entity_unpackID(var31)).int2 / 2; - } - - if (var8.animationId == -1 && var8.transforms == null) { - var33 = var8.getEntity(4, var4 + 4, var15, var17, var16, var18); - } else { - var33 = new DynamicObject(var3, 4, var4 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newWallDecoration(var0, var1, var2, var16, (Entity)var33, (Entity)null, 256, var4, var28 * Tiles.field484[var4], var28 * Tiles.field494[var4], var19, var21); - } else if (var5 == 7) { - var23 = var4 + 2 & 3; - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(4, var23 + 4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, 4, var23 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newWallDecoration(var0, var1, var2, var16, (Entity)var34, (Entity)null, 256, var23, 0, 0, var19, var21); - } else if (var5 == 8) { - var28 = 8; - var31 = var6.getBoundaryObjectTag(var0, var1, var2); - if (0L != var31) { - var28 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(class81.Entity_unpackID(var31)).int2 / 2; - } - - int var27 = var4 + 2 & 3; - Object var26; - if (var8.animationId == -1 && var8.transforms == null) { - var33 = var8.getEntity(4, var4 + 4, var15, var17, var16, var18); - var26 = var8.getEntity(4, var27 + 4, var15, var17, var16, var18); - } else { - var33 = new DynamicObject(var3, 4, var4 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); - var26 = new DynamicObject(var3, 4, var27 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - var6.newWallDecoration(var0, var1, var2, var16, (Entity)var33, (Entity)var26, 256, var4, var28 * Tiles.field484[var4], var28 * Tiles.field494[var4], var19, var21); - } - } - } - } else { - if (var8.animationId == -1 && var8.transforms == null) { - var34 = var8.getEntity(10, var4, var15, var17, var16, var18); - } else { - var34 = new DynamicObject(var3, 10, var4, var0, var1, var2, var8.animationId, true, (Entity)null); - } - - if (var34 != null && var6.method3056(var0, var1, var2, var16, var9, var10, (Entity)var34, var5 == 11 ? 256 : 0, var19, var21) && var8.clipped) { - var23 = 15; - if (var34 instanceof Model) { - var23 = ((Model)var34).method2859() / 4; - if (var23 > 30) { - var23 = 30; - } - } - - for (var24 = 0; var24 <= var9; ++var24) { - for (int var25 = 0; var25 <= var10; ++var25) { - if (var23 > Tiles.field486[var0][var24 + var1][var25 + var2]) { - Tiles.field486[var0][var24 + var1][var25 + var2] = (byte)var23; - } - } - } - } - - if (var8.interactType != 0 && var7 != null) { - var7.addGameObject(var1, var2, var9, var10, var8.boolean1); - } - } } } - @ObfuscatedName("x") + @ObfuscatedName("kq") @ObfuscatedSignature( - signature = "(IIII)I", - garbageValue = "1521796882" + signature = "(Lhi;I)V", + garbageValue = "-1910417202" ) - @Export("hslToRgb") - static final int hslToRgb(int var0, int var1, int var2) { - if (var2 > 179) { - var1 /= 2; + @Export("invalidateWidget") + static void invalidateWidget(Widget var0) { + if (var0.cycle == Client.field835) { + Client.field842[var0.rootIndex] = true; } - if (var2 > 192) { - var1 /= 2; - } - - if (var2 > 217) { - var1 /= 2; - } - - if (var2 > 243) { - var1 /= 2; - } - - int var3 = (var1 / 32 << 7) + (var0 / 4 << 10) + var2 / 2; - return var3; } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java b/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java index 2ce0b53478..866a238575 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java @@ -1,24 +1,17 @@ +import java.io.IOException; import java.util.Comparator; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("b") +@ObfuscatedName("p") @Implements("GrandExchangeOfferNameComparator") final class GrandExchangeOfferNameComparator implements Comparator { - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" - ) - static AbstractArchive field66; - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lm;Lm;I)I", - garbageValue = "1692871938" + signature = "(Lo;Lo;I)I", + garbageValue = "1525556475" ) @Export("compare_bridged") int compare_bridged(GrandExchangeEvent var1, GrandExchangeEvent var2) { @@ -33,97 +26,343 @@ final class GrandExchangeOfferNameComparator implements Comparator { return super.equals(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;I)V", - garbageValue = "1206640259" + signature = "(Lhq;Lhq;B)I", + garbageValue = "75" ) - public static void method153(AbstractArchive var0) { - VarbitDefinition.VarbitDefinition_archive = var0; + static int method182(AbstractArchive var0, AbstractArchive var1) { + int var2 = 0; + if (var0.tryLoadFileByNames("title.jpg", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("logo", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("logo_deadman_mode", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("logo_seasonal_mode", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("titlebox", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("titlebutton", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("runes", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("title_mute", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("options_radio_buttons,0", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("options_radio_buttons,2", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("options_radio_buttons,4", "")) { + ++var2; + } + + if (var1.tryLoadFileByNames("options_radio_buttons,6", "")) { + ++var2; + } + + var1.tryLoadFileByNames("sl_back", ""); + var1.tryLoadFileByNames("sl_flags", ""); + var1.tryLoadFileByNames("sl_arrows", ""); + var1.tryLoadFileByNames("sl_stars", ""); + var1.tryLoadFileByNames("sl_button", ""); + return var2; } - @ObfuscatedName("z") + @ObfuscatedName("ha") @ObfuscatedSignature( - signature = "([Ljava/lang/String;[SIIB)V", - garbageValue = "-18" + signature = "(IIIIIIII)V", + garbageValue = "-1414450696" ) - @Export("sortItemsByName") - public static void sortItemsByName(String[] var0, short[] var1, int var2, int var3) { - if (var2 < var3) { - int var4 = (var3 + var2) / 2; - int var5 = var2; - String var6 = var0[var4]; - var0[var4] = var0[var3]; - var0[var3] = var6; - short var7 = var1[var4]; - var1[var4] = var1[var3]; - var1[var3] = var7; + static final void method183(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { + var5 = PcmPlayer.method2637(var5, var6); + int var7 = 2048 - var3 & 2047; + int var8 = 2048 - var4 & 2047; + int var9 = 0; + int var10 = 0; + int var11 = var5; + int var12; + int var13; + int var14; + if (var7 != 0) { + var12 = Rasterizer3D.Rasterizer3D_sine[var7]; + var13 = Rasterizer3D.Rasterizer3D_cosine[var7]; + var14 = var10 * var13 - var12 * var5 >> 16; + var11 = var13 * var5 + var12 * var10 >> 16; + var10 = var14; + } - for (int var8 = var2; var8 < var3; ++var8) { - if (var6 == null || var0[var8] != null && var0[var8].compareTo(var6) < (var8 & 1)) { - String var9 = var0[var8]; - var0[var8] = var0[var5]; - var0[var5] = var9; - short var10 = var1[var8]; - var1[var8] = var1[var5]; - var1[var5++] = var10; - } - } + if (var8 != 0) { + var12 = Rasterizer3D.Rasterizer3D_sine[var8]; + var13 = Rasterizer3D.Rasterizer3D_cosine[var8]; + var14 = var13 * var9 + var11 * var12 >> 16; + var11 = var13 * var11 - var9 * var12 >> 16; + var9 = var14; + } - var0[var3] = var0[var5]; - var0[var5] = var6; - var1[var3] = var1[var5]; - var1[var5] = var7; - sortItemsByName(var0, var1, var2, var5 - 1); - sortItemsByName(var0, var1, var5 + 1, var3); + UrlRequester.cameraX = var0 - var9; + class16.cameraY = var1 - var10; + GrandExchangeOfferAgeComparator.cameraZ = var2 - var11; + class247.cameraPitch = var3; + WorldMapData_1.cameraYaw = var4; + if (Client.oculusOrbState == 1 && Client.staffModLevel >= 2 && Client.cycle % 50 == 0 && (IgnoreList.oculusOrbFocalPointX >> 7 != class215.localPlayer.x >> 7 || AbstractArchive.oculusOrbFocalPointY >> 7 != class215.localPlayer.y >> 7)) { + var12 = class215.localPlayer.Scene_plane; + var13 = UserComparator8.baseX * 64 + (IgnoreList.oculusOrbFocalPointX >> 7); + var14 = HealthBar.baseY * 64 + (AbstractArchive.oculusOrbFocalPointY >> 7); + PacketBufferNode var15 = SoundSystem.getPacketBufferNode(ClientPacket.field2228, Client.packetWriter.isaacCipher); + var15.packetBuffer.writeIntME(Client.field799); + var15.packetBuffer.writeByte(var12); + var15.packetBuffer.method5644(var14); + var15.packetBuffer.writeShortLE(var13); + Client.packetWriter.addNode(var15); } } - @ObfuscatedName("k") + @ObfuscatedName("hz") @ObfuscatedSignature( - signature = "(Lfm;III)Ldv;", - garbageValue = "-1644992820" + signature = "(ZI)V", + garbageValue = "-604205678" ) - public static final PcmPlayer method151(TaskHandler var0, int var1, int var2) { - if (UrlRequest.PcmPlayer_sampleRate == 0) { - throw new IllegalStateException(); - } else if (var1 >= 0 && var1 < 2) { - if (var2 < 256) { - var2 = 256; + static final void method172(boolean var0) { + ChatChannel.playPcmPlayers(); + ++Client.packetWriter.pendingWrites; + if (Client.packetWriter.pendingWrites >= 50 || var0) { + Client.packetWriter.pendingWrites = 0; + if (!Client.field680 && Client.packetWriter.getSocket() != null) { + PacketBufferNode var1 = SoundSystem.getPacketBufferNode(ClientPacket.field2245, Client.packetWriter.isaacCipher); + Client.packetWriter.addNode(var1); + + try { + Client.packetWriter.flush(); + } catch (IOException var3) { + Client.field680 = true; + } } - try { - PcmPlayer var3 = PcmPlayer.pcmPlayerProvider.player(); - var3.samples = new int[256 * (PcmPlayer.PcmPlayer_stereo ? 2 : 1)]; - var3.field1391 = var2; - var3.init(); - var3.capacity = (var2 & -1024) + 1024; - if (var3.capacity > 16384) { - var3.capacity = 16384; - } + } + } - var3.open(var3.capacity); - if (MenuAction.PcmPlayer_count > 0 && RunException.soundSystem == null) { - RunException.soundSystem = new SoundSystem(); - PcmPlayer.soundSystemExecutor = Executors.newScheduledThreadPool(1); - PcmPlayer.soundSystemExecutor.scheduleAtFixedRate(RunException.soundSystem, 0L, 10L, TimeUnit.MILLISECONDS); - } + @ObfuscatedName("is") + @ObfuscatedSignature( + signature = "(IIIIB)V", + garbageValue = "-93" + ) + @Export("addSceneMenuOptions") + static final void addSceneMenuOptions(int var0, int var1, int var2, int var3) { + if (Client.isItemSelected == 0 && !Client.isSpellSelected) { + GameObject.insertMenuItemNoShift("Walk here", "", 23, 0, var0 - var2, var1 - var3); + } - if (RunException.soundSystem != null) { - if (RunException.soundSystem.players[var1] != null) { - throw new IllegalArgumentException(); + long var4 = -1L; + long var6 = -1L; + + int var8; + for (var8 = 0; var8 < WorldMapLabel.method479(); ++var8) { + long var9 = GrandExchangeEvents.method109(var8); + if (var6 != var9) { + var6 = var9; + long var13 = ViewportMouse.ViewportMouse_entityTags[var8]; + int var24 = (int)(var13 >>> 0 & 127L); + var24 = var24; + long var15 = ViewportMouse.ViewportMouse_entityTags[var8]; + int var14 = (int)(var15 >>> 7 & 127L); + var14 = var14; + int var26 = Username.ViewportMouse_unpackX(var8); + int var16 = ScriptEvent.method1272(var8); + if (var26 == 2 && WorldMapArea.scene.getObjectFlags(Player.Scene_plane, var24, var14, var9) >= 0) { + ObjectDefinition var17 = WorldMapDecorationType.getObjectDefinition(var16); + if (var17.transforms != null) { + var17 = var17.transform(); } - RunException.soundSystem.players[var1] = var3; + if (var17 == null) { + continue; + } + + if (Client.isItemSelected == 1) { + GameObject.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + AbstractArchive.colorStartTag(65535) + var17.name, 1, var16, var24, var14); + } else if (Client.isSpellSelected) { + if ((class81.selectedSpellFlags & 4) == 4) { + GameObject.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + AbstractArchive.colorStartTag(65535) + var17.name, 2, var16, var24, var14); + } + } else { + String[] var27 = var17.actions; + if (var27 != null) { + for (int var28 = 4; var28 >= 0; --var28) { + if (var27[var28] != null) { + short var20 = 0; + if (var28 == 0) { + var20 = 3; + } + + if (var28 == 1) { + var20 = 4; + } + + if (var28 == 2) { + var20 = 5; + } + + if (var28 == 3) { + var20 = 6; + } + + if (var28 == 4) { + var20 = 1001; + } + + GameObject.insertMenuItemNoShift(var27[var28], AbstractArchive.colorStartTag(65535) + var17.name, var20, var16, var24, var14); + } + } + } + + GameObject.insertMenuItemNoShift("Examine", AbstractArchive.colorStartTag(65535) + var17.name, 1002, var17.id, var24, var14); + } } - return var3; - } catch (Throwable var4) { - return new PcmPlayer(); + int var18; + NPC var19; + Player var21; + int[] var34; + int var36; + if (var26 == 1) { + NPC var31 = Client.npcs[var16]; + if (var31 == null) { + continue; + } + + if (var31.definition.size == 1 && (var31.x & 127) == 64 && (var31.y & 127) == 64) { + for (var18 = 0; var18 < Client.npcCount; ++var18) { + var19 = Client.npcs[Client.npcIndices[var18]]; + if (var19 != null && var31 != var19 && var19.definition.size == 1 && var19.x == var31.x && var31.y == var19.y) { + TaskHandler.addNpcToMenu(var19.definition, Client.npcIndices[var18], var24, var14); + } + } + + var18 = Players.Players_count; + var34 = Players.Players_indices; + + for (var36 = 0; var36 < var18; ++var36) { + var21 = Client.players[var34[var36]]; + if (var21 != null && var21.x == var31.x && var21.y == var31.y) { + class40.addPlayerToMenu(var21, var34[var36], var24, var14); + } + } + } + + TaskHandler.addNpcToMenu(var31.definition, var16, var24, var14); + } + + if (var26 == 0) { + Player var32 = Client.players[var16]; + if (var32 == null) { + continue; + } + + if ((var32.x & 127) == 64 && (var32.y & 127) == 64) { + for (var18 = 0; var18 < Client.npcCount; ++var18) { + var19 = Client.npcs[Client.npcIndices[var18]]; + if (var19 != null && var19.definition.size == 1 && var19.x == var32.x && var19.y == var32.y) { + TaskHandler.addNpcToMenu(var19.definition, Client.npcIndices[var18], var24, var14); + } + } + + var18 = Players.Players_count; + var34 = Players.Players_indices; + + for (var36 = 0; var36 < var18; ++var36) { + var21 = Client.players[var34[var36]]; + if (var21 != null && var21 != var32 && var21.x == var32.x && var32.y == var21.y) { + class40.addPlayerToMenu(var21, var34[var36], var24, var14); + } + } + } + + if (var16 != Client.combatTargetPlayerIndex) { + class40.addPlayerToMenu(var32, var16, var24, var14); + } else { + var4 = var9; + } + } + + if (var26 == 3) { + NodeDeque var33 = Client.groundItems[Player.Scene_plane][var24][var14]; + if (var33 != null) { + for (TileItem var37 = (TileItem)var33.first(); var37 != null; var37 = (TileItem)var33.next()) { + ItemDefinition var35 = class222.ItemDefinition_get(var37.id); + if (Client.isItemSelected == 1) { + GameObject.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + AbstractArchive.colorStartTag(16748608) + var35.name, 16, var37.id, var24, var14); + } else if (Client.isSpellSelected) { + if ((class81.selectedSpellFlags & 1) == 1) { + GameObject.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + AbstractArchive.colorStartTag(16748608) + var35.name, 17, var37.id, var24, var14); + } + } else { + String[] var29 = var35.groundActions; + + for (int var30 = 4; var30 >= 0; --var30) { + if (var29 != null && var29[var30] != null) { + byte var22 = 0; + if (var30 == 0) { + var22 = 18; + } + + if (var30 == 1) { + var22 = 19; + } + + if (var30 == 2) { + var22 = 20; + } + + if (var30 == 3) { + var22 = 21; + } + + if (var30 == 4) { + var22 = 22; + } + + GameObject.insertMenuItemNoShift(var29[var30], AbstractArchive.colorStartTag(16748608) + var35.name, var22, var37.id, var24, var14); + } else if (var30 == 2) { + GameObject.insertMenuItemNoShift("Take", AbstractArchive.colorStartTag(16748608) + var35.name, 20, var37.id, var24, var14); + } + } + + GameObject.insertMenuItemNoShift("Examine", AbstractArchive.colorStartTag(16748608) + var35.name, 1004, var37.id, var24, var14); + } + } + } + } } - } else { - throw new IllegalArgumentException(); } + + if (var4 != -1L) { + var8 = (int)(var4 >>> 0 & 127L); + int var10 = (int)(var4 >>> 7 & 127L); + Player var12 = Client.players[Client.combatTargetPlayerIndex]; + class40.addPlayerToMenu(var12, Client.combatTargetPlayerIndex, var8, var10); + } + } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java index ecb9867560..f9da6f17da 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java @@ -1,62 +1,32 @@ -import java.io.File; import java.util.Comparator; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bb") +@ObfuscatedName("bm") @Implements("GrandExchangeOfferOwnWorldComparator") public class GrandExchangeOfferOwnWorldComparator implements Comparator { - @ObfuscatedName("qs") - @ObfuscatedGetter( - intValue = 683599059 - ) - static int field627; - @ObfuscatedName("n") + @ObfuscatedName("gs") + @Export("regions") + static int[] regions; + @ObfuscatedName("gb") @ObfuscatedSignature( - signature = "Lhp;" + signature = "[Llx;" ) - @Export("KitDefinition_modelsArchive") - public static AbstractArchive KitDefinition_modelsArchive; - @ObfuscatedName("r") - @Export("cacheDir") - public static File cacheDir; - @ObfuscatedName("dg") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive12") - static Archive archive12; - @ObfuscatedName("fg") - @ObfuscatedSignature( - signature = "Lkn;" - ) - @Export("fontPlain11") - static Font fontPlain11; - @ObfuscatedName("hq") - @ObfuscatedGetter( - intValue = 1137329779 - ) - @Export("cameraX") - static int cameraX; - @ObfuscatedName("ji") - @ObfuscatedSignature( - signature = "Lho;" - ) - static Widget field628; - @ObfuscatedName("z") + @Export("mapMarkerSprites") + static Sprite[] mapMarkerSprites; + @ObfuscatedName("a") @Export("filterWorlds") boolean filterWorlds; GrandExchangeOfferOwnWorldComparator() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lm;Lm;I)I", - garbageValue = "-1661947065" + signature = "(Lo;Lo;B)I", + garbageValue = "68" ) @Export("compare_bridged") int compare_bridged(GrandExchangeEvent var1, GrandExchangeEvent var2) { @@ -85,42 +55,905 @@ public class GrandExchangeOfferOwnWorldComparator implements Comparator { return super.equals(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IB)Liz;", - garbageValue = "123" + signature = "(II)Lid;", + garbageValue = "-1586537881" ) - @Export("getObjectDefinition") - public static ObjectDefinition getObjectDefinition(int var0) { - ObjectDefinition var1 = (ObjectDefinition)ObjectDefinition.ObjectDefinition_cached.get((long)var0); + @Export("StructDefinition_getStructDefinition") + public static StructDefinition StructDefinition_getStructDefinition(int var0) { + StructDefinition var1 = (StructDefinition)StructDefinition.StructDefinition_cached.get((long)var0); if (var1 != null) { return var1; } else { - byte[] var2 = ObjectDefinition.ObjectDefinition_archive.takeFile(6, var0); - var1 = new ObjectDefinition(); - var1.id = var0; + byte[] var2 = StructDefinition.StructDefinition_archive.takeFile(34, var0); + var1 = new StructDefinition(); if (var2 != null) { var1.decode(new Buffer(var2)); } var1.postDecode(); - if (var1.isSolid) { - var1.interactType = 0; - var1.boolean1 = false; - } - - ObjectDefinition.ObjectDefinition_cached.put(var1, (long)var0); + StructDefinition.StructDefinition_cached.put(var1, (long)var0); return var1; } } - @ObfuscatedName("u") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(IS)Lbe;", - garbageValue = "-12583" + signature = "(B)Z", + garbageValue = "26" ) - @Export("Messages_getMessage") - static Message Messages_getMessage(int var0) { - return (Message)Messages.Messages_hashTable.get((long)var0); + static final boolean method1376() { + return ViewportMouse.ViewportMouse_isInViewport; + } + + @ObfuscatedName("io") + @ObfuscatedSignature( + signature = "(IIIILjava/lang/String;Ljava/lang/String;III)V", + garbageValue = "1191285249" + ) + @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; + } + + PacketBufferNode var8; + if (var2 == 1) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2249, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShortLE(Occluder.selectedItemId); + var8.packetBuffer.method5643(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeInt(MidiPcmStream.selectedItemWidget); + var8.packetBuffer.method5643(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5644(MouseRecorder.selectedItemSlot); + Client.packetWriter.addNode(var8); + } else if (var2 == 2) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2223, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShortLE(HealthBar.baseY * 64 + var1); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeShortLE(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShort(Client.selectedSpellChildIndex); + var8.packetBuffer.writeInt(Clock.selectedSpellWidget); + Client.packetWriter.addNode(var8); + } else if (var2 == 3) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2270, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShortLE(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeShortLE(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5643(var3); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var8); + } else if (var2 == 4) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2278, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5644(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.method5634(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.method5644(HealthBar.baseY * 64 + var1); + Client.packetWriter.addNode(var8); + } else if (var2 == 5) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2192, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShortLE(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeShortLE(HealthBar.baseY * 64 + var1); + var8.packetBuffer.writeShortLE(var3); + Client.packetWriter.addNode(var8); + } else if (var2 == 6) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2240, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5643(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.method5643(var3); + var8.packetBuffer.method5643(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var8); + } else { + PacketBufferNode var9; + NPC var13; + if (var2 == 7) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2233, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShortLE(Occluder.selectedItemId); + var9.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(MouseRecorder.selectedItemSlot); + var9.packetBuffer.writeIntME(MidiPcmStream.selectedItemWidget); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 8) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2217, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5643(var3); + var9.packetBuffer.method5644(Client.selectedSpellChildIndex); + var9.packetBuffer.method5655(Clock.selectedSpellWidget); + var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 9) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2181, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5643(var3); + var9.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 10) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2272, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 11) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2282, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.method5643(var3); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 12) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2268, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShort(var3); + var9.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 13) { + var13 = Client.npcs[var3]; + if (var13 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2188, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.method5644(var3); + Client.packetWriter.addNode(var9); + } + } else { + Player var15; + if (var2 == 14) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2206, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5644(var3); + var9.packetBuffer.method5644(MouseRecorder.selectedItemSlot); + var9.packetBuffer.writeInt(MidiPcmStream.selectedItemWidget); + var9.packetBuffer.method5643(Occluder.selectedItemId); + var9.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 15) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2180, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5653(Clock.selectedSpellWidget); + var9.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShortLE(Client.selectedSpellChildIndex); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 16) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2184, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5643(var3); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.method5644(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.method5655(MidiPcmStream.selectedItemWidget); + var8.packetBuffer.writeShort(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5643(MouseRecorder.selectedItemSlot); + var8.packetBuffer.method5643(Occluder.selectedItemId); + Client.packetWriter.addNode(var8); + } else if (var2 == 17) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2254, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShortLE(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5643(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.method5634(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeIntME(Clock.selectedSpellWidget); + var8.packetBuffer.writeShort(Client.selectedSpellChildIndex); + Client.packetWriter.addNode(var8); + } else if (var2 == 18) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2224, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShortLE(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.method5644(var3); + var8.packetBuffer.writeShortLE(HealthBar.baseY * 64 + var1); + Client.packetWriter.addNode(var8); + } else if (var2 == 19) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2269, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5644(var3); + var8.packetBuffer.method5644(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeShort(HealthBar.baseY * 64 + var1); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var8); + } else if (var2 == 20) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2244, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShort(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5643(UserComparator8.baseX * 64 + var0); + Client.packetWriter.addNode(var8); + } else if (var2 == 21) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2208, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.method5644(var3); + var8.packetBuffer.method5644(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.method5644(HealthBar.baseY * 64 + var1); + Client.packetWriter.addNode(var8); + } else if (var2 == 22) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2200, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5644(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.method5643(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5643(var3); + Client.packetWriter.addNode(var8); + } else if (var2 == 23) { + if (Client.isMenuOpen) { + WorldMapArea.scene.setViewportWalking(); + } else { + WorldMapArea.scene.menuOpen(Player.Scene_plane, var0, var1, true); + } + } else { + PacketBufferNode var11; + Widget var16; + if (var2 == 24) { + var16 = PacketBufferNode.getWidget(var1); + boolean var12 = true; + if (var16.contentType > 0) { + var12 = WorldMapIcon_0.method237(var16); + } + + if (var12) { + var11 = SoundSystem.getPacketBufferNode(ClientPacket.field2252, Client.packetWriter.isaacCipher); + var11.packetBuffer.writeInt(var1); + Client.packetWriter.addNode(var11); + } + } else { + if (var2 == 25) { + var16 = ArchiveLoader.getWidgetChild(var1, var0); + if (var16 != null) { + InterfaceParent.Widget_runOnTargetLeave(); + class51.selectSpell(var1, var0, UserComparator5.method3551(class195.getWidgetClickMask(var16)), var16.itemId); + Client.isItemSelected = 0; + Client.selectedSpellActionName = SoundCache.method2666(var16); + if (Client.selectedSpellActionName == null) { + Client.selectedSpellActionName = "null"; + } + + if (var16.isIf3) { + Client.selectedSpellName = var16.dataText + AbstractArchive.colorStartTag(16777215); + } else { + Client.selectedSpellName = AbstractArchive.colorStartTag(65280) + var16.spellName + AbstractArchive.colorStartTag(16777215); + } + } + + return; + } + + if (var2 == 26) { + Skills.method4271(); + } else { + int var10; + Widget var14; + if (var2 == 28) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2252, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeInt(var1); + Client.packetWriter.addNode(var8); + var14 = PacketBufferNode.getWidget(var1); + if (var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { + var10 = var14.cs1Instructions[0][1]; + Varps.Varps_main[var10] = 1 - Varps.Varps_main[var10]; + WorldMapDecoration.method389(var10); + } + } else if (var2 == 29) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2252, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeInt(var1); + Client.packetWriter.addNode(var8); + var14 = PacketBufferNode.getWidget(var1); + if (var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { + var10 = var14.cs1Instructions[0][1]; + if (Varps.Varps_main[var10] != var14.cs1ComparisonValues[0]) { + Varps.Varps_main[var10] = var14.cs1ComparisonValues[0]; + WorldMapDecoration.method389(var10); + } + } + } else if (var2 == 30) { + if (Client.meslayerContinueWidget == null) { + Tiles.resumePauseWidget(var1, var0); + Client.meslayerContinueWidget = ArchiveLoader.getWidgetChild(var1, var0); + GrandExchangeOfferAgeComparator.invalidateWidget(Client.meslayerContinueWidget); + } + } else if (var2 == 31) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2242, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5644(var3); + var8.packetBuffer.writeShort(var0); + var8.packetBuffer.method5643(MouseRecorder.selectedItemSlot); + var8.packetBuffer.writeIntME(MidiPcmStream.selectedItemWidget); + var8.packetBuffer.writeShortLE(Occluder.selectedItemId); + var8.packetBuffer.writeInt(var1); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 32) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2241, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5653(Clock.selectedSpellWidget); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeInt(var1); + var8.packetBuffer.method5643(var0); + var8.packetBuffer.method5643(Client.selectedSpellChildIndex); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 33) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2260, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.writeShortLE(var0); + var8.packetBuffer.method5644(var3); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 34) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2237, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeInt(var1); + var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.method5644(var0); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 35) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2190, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.method5655(var1); + var8.packetBuffer.method5644(var0); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 36) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2253, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.method5643(var3); + var8.packetBuffer.writeShort(var0); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 37) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2219, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.method5643(var3); + var8.packetBuffer.method5644(var0); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else { + if (var2 == 38) { + InterfaceParent.Widget_runOnTargetLeave(); + var16 = PacketBufferNode.getWidget(var1); + Client.isItemSelected = 1; + MouseRecorder.selectedItemSlot = var0; + MidiPcmStream.selectedItemWidget = var1; + Occluder.selectedItemId = var3; + GrandExchangeOfferAgeComparator.invalidateWidget(var16); + Client.selectedItemName = AbstractArchive.colorStartTag(16748608) + class222.ItemDefinition_get(var3).name + AbstractArchive.colorStartTag(16777215); + if (Client.selectedItemName == null) { + Client.selectedItemName = "null"; + } + + return; + } + + if (var2 == 39) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2196, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShort(var0); + var8.packetBuffer.method5655(var1); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 40) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2258, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.writeShort(var0); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 41) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2194, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var0); + var8.packetBuffer.method5655(var1); + var8.packetBuffer.writeShortLE(var3); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 42) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2211, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5655(var1); + var8.packetBuffer.writeShort(var0); + var8.packetBuffer.writeShortLE(var3); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 43) { + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2215, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.method5644(var0); + Client.packetWriter.addNode(var8); + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + } else if (var2 == 44) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2193, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 45) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2234, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.method5643(var3); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 46) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2225, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5634(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.writeShortLE(var3); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 47) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2229, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.method5634(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 48) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2231, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5636(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.method5644(var3); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 49) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2236, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var9.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 50) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2251, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5643(var3); + var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else if (var2 == 51) { + var15 = Client.players[var3]; + if (var15 != null) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2235, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + Client.packetWriter.addNode(var9); + } + } else { + label795: { + if (var2 != 57) { + if (var2 == 58) { + var16 = ArchiveLoader.getWidgetChild(var1, var0); + if (var16 != null) { + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2274, Client.packetWriter.isaacCipher); + var9.packetBuffer.writeShortLE(Client.selectedSpellChildIndex); + var9.packetBuffer.writeShortLE(var0); + var9.packetBuffer.method5655(var1); + var9.packetBuffer.writeShortLE(Client.field788); + var9.packetBuffer.writeInt(Clock.selectedSpellWidget); + var9.packetBuffer.method5643(var16.itemId); + Client.packetWriter.addNode(var9); + } + break label795; + } + + if (var2 == 1001) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + Client.destinationX = var0; + Client.destinationY = var1; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2214, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5635(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); + var8.packetBuffer.writeShortLE(HealthBar.baseY * 64 + var1); + var8.packetBuffer.method5643(UserComparator8.baseX * 64 + var0); + var8.packetBuffer.writeShortLE(var3); + Client.packetWriter.addNode(var8); + break label795; + } + + if (var2 == 1002) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2222, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5643(var3); + Client.packetWriter.addNode(var8); + break label795; + } + + if (var2 == 1003) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + var13 = Client.npcs[var3]; + if (var13 != null) { + NPCDefinition var17 = var13.definition; + if (var17.transforms != null) { + var17 = var17.transform(); + } + + if (var17 != null) { + var11 = SoundSystem.getPacketBufferNode(ClientPacket.field2262, Client.packetWriter.isaacCipher); + var11.packetBuffer.writeShort(var17.id); + Client.packetWriter.addNode(var11); + } + } + break label795; + } + + if (var2 == 1004) { + Client.mouseCrossX = var6; + Client.mouseCrossY = var7; + Client.mouseCrossColor = 2; + Client.mouseCrossState = 0; + var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2198, Client.packetWriter.isaacCipher); + var8.packetBuffer.method5643(var3); + Client.packetWriter.addNode(var8); + break label795; + } + + if (var2 == 1005) { + var16 = PacketBufferNode.getWidget(var1); + if (var16 != null && var16.itemQuantities[var0] >= 100000) { + class30.addGameMessage(27, "", var16.itemQuantities[var0] + " x " + class222.ItemDefinition_get(var3).name); + } else { + var9 = SoundSystem.getPacketBufferNode(ClientPacket.field2198, Client.packetWriter.isaacCipher); + var9.packetBuffer.method5643(var3); + Client.packetWriter.addNode(var9); + } + + Client.field753 = 0; + Login.field1165 = PacketBufferNode.getWidget(var1); + Client.field665 = var0; + break label795; + } + + if (var2 != 1007) { + if (var2 == 1011 || var2 == 1008 || var2 == 1010 || var2 == 1009 || var2 == 1012) { + Login.worldMap.menuAction(var2, var3, new Coord(var0), new Coord(var1)); + } + break label795; + } + } + + var16 = ArchiveLoader.getWidgetChild(var1, var0); + if (var16 != null) { + class287.widgetDefaultMenuAction(var3, var1, var0, var16.itemId, var5); + } + } + } + } + } + } + } + } + } + + if (Client.isItemSelected != 0) { + Client.isItemSelected = 0; + GrandExchangeOfferAgeComparator.invalidateWidget(PacketBufferNode.getWidget(MidiPcmStream.selectedItemWidget)); + } + + if (Client.isSpellSelected) { + InterfaceParent.Widget_runOnTargetLeave(); + } + + if (Login.field1165 != null && Client.field753 == 0) { + GrandExchangeOfferAgeComparator.invalidateWidget(Login.field1165); + } + + } + + @ObfuscatedName("jn") + @ObfuscatedSignature( + signature = "(Lhi;IIIIIII)V", + garbageValue = "-1682660629" + ) + static final void method1389(Widget var0, int var1, int var2, int var3, int var4, int var5, int var6) { + if (Client.field698) { + Client.alternativeScrollbarWidth = 32; + } else { + Client.alternativeScrollbarWidth = 0; + } + + Client.field698 = false; + int var7; + if (MouseHandler.MouseHandler_currentButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_currentButton == 4) { + if (var5 >= var1 && var5 < var1 + 16 && var6 >= var2 && var6 < var2 + 16) { + var0.scrollY -= 4; + GrandExchangeOfferAgeComparator.invalidateWidget(var0); + } else if (var5 >= var1 && var5 < var1 + 16 && var6 >= var3 + var2 - 16 && var6 < var3 + var2) { + var0.scrollY += 4; + GrandExchangeOfferAgeComparator.invalidateWidget(var0); + } else if (var5 >= var1 - Client.alternativeScrollbarWidth && var5 < Client.alternativeScrollbarWidth + var1 + 16 && var6 >= var2 + 16 && var6 < var3 + var2 - 16) { + var7 = var3 * (var3 - 32) / var4; + if (var7 < 8) { + var7 = 8; + } + + int var8 = var6 - var2 - 16 - var7 / 2; + int var9 = var3 - 32 - var7; + var0.scrollY = var8 * (var4 - var3) / var9; + GrandExchangeOfferAgeComparator.invalidateWidget(var0); + Client.field698 = true; + } + } + + if (Client.mouseWheelRotation != 0) { + var7 = var0.width; + if (var5 >= var1 - var7 && var6 >= var2 && var5 < var1 + 16 && var6 <= var3 + var2) { + var0.scrollY += Client.mouseWheelRotation * 45; + GrandExchangeOfferAgeComparator.invalidateWidget(var0); + } + } + + } + + @ObfuscatedName("kz") + @ObfuscatedSignature( + signature = "(Lbq;ZI)V", + garbageValue = "2014179335" + ) + @Export("closeInterface") + static final void closeInterface(InterfaceParent var0, boolean var1) { + int var2 = var0.group; + int var3 = (int)var0.key; + var0.remove(); + if (var1) { + PlayerAppearance.method4191(var2); + } + + class197.method3844(var2); + Widget var4 = PacketBufferNode.getWidget(var3); + if (var4 != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(var4); + } + + for (int var5 = 0; var5 < Client.menuOptionsCount; ++var5) { + if (WorldMapIcon_1.method351(Client.menuOpcodes[var5])) { + if (var5 < Client.menuOptionsCount - 1) { + for (int var6 = var5; var6 < Client.menuOptionsCount - 1; ++var6) { + Client.menuActions[var6] = Client.menuActions[var6 + 1]; + Client.menuTargets[var6] = Client.menuTargets[var6 + 1]; + Client.menuOpcodes[var6] = Client.menuOpcodes[var6 + 1]; + Client.menuIdentifiers[var6] = Client.menuIdentifiers[var6 + 1]; + Client.menuArguments1[var6] = Client.menuArguments1[var6 + 1]; + Client.menuArguments2[var6] = Client.menuArguments2[var6 + 1]; + Client.menuShiftClick[var6] = Client.menuShiftClick[var6 + 1]; + } + } + + --var5; + --Client.menuOptionsCount; + } + } + + class30.method603(); + if (Client.rootInterface != -1) { + AttackOption.runIntfCloseListeners(Client.rootInterface, 1); + } + } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java b/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java index d72e0548e2..aeb1546946 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java @@ -3,21 +3,22 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("y") +@ObfuscatedName("i") @Implements("GrandExchangeOfferTotalQuantityComparator") final class GrandExchangeOfferTotalQuantityComparator implements Comparator { - @ObfuscatedName("bk") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "[Llp;" + signature = "[Lie;" ) - @Export("worldSelectArrows") - static IndexedSprite[] worldSelectArrows; + @Export("WorldMapElement_cached") + public static WorldMapElement[] WorldMapElement_cached; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lm;Lm;I)I", - garbageValue = "-1270482233" + signature = "(Lo;Lo;I)I", + garbageValue = "-2091641489" ) @Export("compare_bridged") int compare_bridged(GrandExchangeEvent var1, GrandExchangeEvent var2) { @@ -34,369 +35,187 @@ final class GrandExchangeOfferTotalQuantityComparator implements Comparator { @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "1729511296" + signature = "(ILcj;ZI)I", + garbageValue = "-1959734110" ) - public static boolean method93(int var0) { - return (var0 >> 20 & 1) != 0; - } - - @ObfuscatedName("ez") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1447475674" - ) - static int method100() { - if (Client.archiveLoaders != null && Client.archiveLoadersDone < Client.archiveLoaders.size()) { - int var0 = 0; - - for (int var1 = 0; var1 <= Client.archiveLoadersDone; ++var1) { - var0 += ((ArchiveLoader)Client.archiveLoaders.get(var1)).loadedCount; - } - - return var0 * 10000 / Client.field908; + static int method134(int var0, Script var1, boolean var2) { + int var3 = -1; + Widget var4; + if (var0 >= 2000) { + var0 -= 1000; + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var4 = PacketBufferNode.getWidget(var3); } else { - return 10000; - } - } - - @ObfuscatedName("ec") - @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "99" - ) - static void method91(int var0, int var1) { - int[] var2 = new int[9]; - - for (int var3 = 0; var3 < var2.length; ++var3) { - int var4 = var3 * 32 + 15 + 128; - int var5 = var4 * 3 + 600; - int var7 = Rasterizer3D.Rasterizer3D_sine[var4]; - int var9 = var1 - 334; - if (var9 < 0) { - var9 = 0; - } else if (var9 > 100) { - var9 = 100; - } - - int var10 = (Client.zoomWidth - Client.zoomHeight) * var9 / 100 + Client.zoomHeight; - int var8 = var10 * var5 / 256; - var2[var3] = var7 * var8 >> 16; + var4 = var2 ? class96.field1301 : ReflectionCheck.field1310; } - Scene.Scene_buildVisiblityMap(var2, 500, 800, var0 * 334 / var1, 334); - } - - @ObfuscatedName("gq") - @ObfuscatedSignature( - signature = "(Lgw;I)V", - garbageValue = "865930097" - ) - static final void method105(class185 var0) { - PacketBuffer var1 = Client.packetWriter.packetBuffer; - int var4; - int var5; - int var6; - int var7; - int var8; - int var9; - int var10; - int var12; - int var13; - int var14; - if (class185.field2298 == var0) { - byte var2 = var1.readByte(); - byte var3 = var1.readByte(); - var4 = var1.readUnsignedByte(); - var5 = var4 >> 2; - var6 = var4 & 3; - var7 = Client.field697[var5]; - var8 = var1.method5471(); - var9 = (var8 >> 4 & 7) + class40.field326; - var10 = (var8 & 7) + WorldMapSection2.field195; - byte var11 = var1.method5474(); - var12 = var1.method5480(); - var13 = var1.method5479(); - var14 = var1.readUnsignedShort(); - int var15 = var1.method5480(); - byte var16 = var1.method5473(); - Player var17; - if (var15 == Client.localPlayerIndex) { - var17 = class223.localPlayer; - } else { - var17 = Client.players[var15]; + if (var0 == ScriptOpcodes.CC_SETPOSITION) { + Interpreter.Interpreter_intStackSize -= 4; + var4.rawX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4.rawY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var4.xAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + var4.yAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + GrandExchangeOfferAgeComparator.invalidateWidget(var4); + WorldMapID.client.alignWidget(var4); + if (var3 != -1 && var4.type == 0) { + class43.revalidateWidgetScroll(Widget.Widget_interfaceComponents[var3 >> 16], var4, false); } - if (var17 != null) { - ObjectDefinition var18 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var14); - int var19; - int var20; - if (var6 != 1 && var6 != 3) { - var19 = var18.sizeX; - var20 = var18.sizeY; - } else { - var19 = var18.sizeY; - var20 = var18.sizeX; - } - - int var21 = var9 + (var19 >> 1); - int var22 = var9 + (var19 + 1 >> 1); - int var23 = var10 + (var20 >> 1); - int var24 = var10 + (var20 + 1 >> 1); - int[][] var25 = Tiles.Tiles_heights[WorldMapRectangle.plane]; - int var26 = var25[var21][var23] + var25[var22][var23] + var25[var21][var24] + var25[var22][var24] >> 2; - int var27 = (var9 << 7) + (var19 << 6); - int var28 = (var10 << 7) + (var20 << 6); - Model var29 = var18.getModel(var5, var6, var25, var27, var26, var28); - if (var29 != null) { - WorldMapSection1.updatePendingSpawn(WorldMapRectangle.plane, var9, var10, var7, -1, 0, 0, var12 + 1, var13 + 1); - var17.animationCycleStart = var12 + Client.cycle; - var17.animationCycleEnd = var13 + Client.cycle; - var17.model0 = var29; - var17.field606 = var9 * 128 + var19 * 64; - var17.field608 = var10 * 128 + var20 * 64; - var17.tileHeight2 = var26; - byte var30; - if (var2 > var11) { - var30 = var2; - var2 = var11; - var11 = var30; - } - - if (var3 > var16) { - var30 = var3; - var3 = var16; - var16 = var30; - } - - var17.field622 = var2 + var9; - var17.field612 = var11 + var9; - var17.field611 = var10 + var3; - var17.field613 = var10 + var16; - } - } - } - - int var37; - int var38; - int var40; - if (class185.field2302 == var0) { - var37 = var1.method5480(); - var38 = var1.method5471(); - var4 = (var38 >> 4 & 7) + class40.field326; - var5 = (var38 & 7) + WorldMapSection2.field195; - var6 = var1.readUnsignedByte(); - var7 = var6 >> 2; - var8 = var6 & 3; - var9 = Client.field697[var7]; - if (var4 >= 0 && var5 >= 0 && var4 < 103 && var5 < 103) { - if (var9 == 0) { - BoundaryObject var31 = PacketWriter.scene.method3068(WorldMapRectangle.plane, var4, var5); - if (var31 != null) { - var40 = class81.Entity_unpackID(var31.tag); - if (var7 == 2) { - var31.entity1 = new DynamicObject(var40, 2, var8 + 4, WorldMapRectangle.plane, var4, var5, var37, false, var31.entity1); - var31.entity2 = new DynamicObject(var40, 2, var8 + 1 & 3, WorldMapRectangle.plane, var4, var5, var37, false, var31.entity2); - } else { - var31.entity1 = new DynamicObject(var40, var7, var8, WorldMapRectangle.plane, var4, var5, var37, false, var31.entity1); - } - } - } - - if (var9 == 1) { - WallDecoration var42 = PacketWriter.scene.method3069(WorldMapRectangle.plane, var4, var5); - if (var42 != null) { - var40 = class81.Entity_unpackID(var42.tag); - if (var7 != 4 && var7 != 5) { - if (var7 == 6) { - var42.entity1 = new DynamicObject(var40, 4, var8 + 4, WorldMapRectangle.plane, var4, var5, var37, false, var42.entity1); - } else if (var7 == 7) { - var42.entity1 = new DynamicObject(var40, 4, (var8 + 2 & 3) + 4, WorldMapRectangle.plane, var4, var5, var37, false, var42.entity1); - } else if (var7 == 8) { - var42.entity1 = new DynamicObject(var40, 4, var8 + 4, WorldMapRectangle.plane, var4, var5, var37, false, var42.entity1); - var42.entity2 = new DynamicObject(var40, 4, (var8 + 2 & 3) + 4, WorldMapRectangle.plane, var4, var5, var37, false, var42.entity2); - } - } else { - var42.entity1 = new DynamicObject(var40, 4, var8, WorldMapRectangle.plane, var4, var5, var37, false, var42.entity1); - } - } - } - - if (var9 == 2) { - GameObject var43 = PacketWriter.scene.method3070(WorldMapRectangle.plane, var4, var5); - if (var7 == 11) { - var7 = 10; - } - - if (var43 != null) { - var43.entity = new DynamicObject(class81.Entity_unpackID(var43.tag), var7, var8, WorldMapRectangle.plane, var4, var5, var37, false, var43.entity); - } - } - - if (var9 == 3) { - FloorDecoration var44 = PacketWriter.scene.getFloorDecoration(WorldMapRectangle.plane, var4, var5); - if (var44 != null) { - var44.entity = new DynamicObject(class81.Entity_unpackID(var44.tag), 22, var8, WorldMapRectangle.plane, var4, var5, var37, false, var44.entity); - } - } + return 1; + } else if (var0 == ScriptOpcodes.CC_SETSIZE) { + Interpreter.Interpreter_intStackSize -= 4; + var4.rawWidth = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4.rawHeight = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var4.widthAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + var4.heightAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + GrandExchangeOfferAgeComparator.invalidateWidget(var4); + WorldMapID.client.alignWidget(var4); + if (var3 != -1 && var4.type == 0) { + class43.revalidateWidgetScroll(Widget.Widget_interfaceComponents[var3 >> 16], var4, false); } + return 1; + } else if (var0 == ScriptOpcodes.CC_SETHIDE) { + boolean var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (var5 != var4.isHidden) { + var4.isHidden = var5; + GrandExchangeOfferAgeComparator.invalidateWidget(var4); + } + + return 1; + } else if (var0 == ScriptOpcodes.CC_SETNOCLICKTHROUGH) { + var4.noClickThrough = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETNOSCROLLTHROUGH) { + var4.noScrollThrough = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; } else { - TileItem var33; - if (class185.field2304 == var0) { - var37 = var1.method5470(); - var38 = (var37 >> 4 & 7) + class40.field326; - var4 = (var37 & 7) + WorldMapSection2.field195; - var5 = var1.method5647(); - if (var38 >= 0 && var4 >= 0 && var38 < 104 && var4 < 104) { - NodeDeque var32 = Client.groundItems[WorldMapRectangle.plane][var38][var4]; - if (var32 != null) { - for (var33 = (TileItem)var32.last(); var33 != null; var33 = (TileItem)var32.previous()) { - if ((var5 & 32767) == var33.id) { - var33.remove(); - break; - } - } + return 2; + } + } - if (var32.last() == null) { - Client.groundItems[WorldMapRectangle.plane][var38][var4] = null; - } + @ObfuscatedName("fr") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1403292124" + ) + static void method130() { + Client.mouseLastLastPressedTimeMillis = 1L; + class3.mouseRecorder.index = 0; + class30.hasFocus = true; + Client.hadFocus = true; + Client.field663 = -1L; + class80.method2198(); + Client.packetWriter.clearBuffer(); + Client.packetWriter.packetBuffer.offset = 0; + Client.packetWriter.serverPacket = null; + Client.packetWriter.field1290 = null; + Client.packetWriter.field1286 = null; + Client.packetWriter.field1292 = null; + Client.packetWriter.serverPacketLength = 0; + Client.packetWriter.field1291 = 0; + Client.rebootTimer = 0; + Client.logoutTimer = 0; + Client.hintArrowType = 0; + Client.menuOptionsCount = 0; + Client.isMenuOpen = false; + MouseHandler.MouseHandler_idleCycles = 0; + Messages.Messages_channels.clear(); + Messages.Messages_hashTable.clear(); + Messages.Messages_queue.clear(); + Messages.Messages_count = 0; + Client.isItemSelected = 0; + Client.isSpellSelected = false; + Client.soundEffectCount = 0; + Client.camAngleY = 0; + Client.oculusOrbState = 0; + GrandExchangeOfferWorldComparator.field30 = null; + Client.minimapState = 0; + Client.field856 = -1; + Client.destinationX = 0; + Client.destinationY = 0; + Client.playerAttackOption = AttackOption.AttackOption_hidden; + Client.npcAttackOption = AttackOption.AttackOption_hidden; + Client.npcCount = 0; + Players.Players_count = 0; - WorldMapCacheName.updateItemPile(var38, var4); - } - } + int var0; + for (var0 = 0; var0 < 2048; ++var0) { + Players.field1229[var0] = null; + Players.field1228[var0] = 1; + } - } else if (class185.field2296 == var0) { - var37 = var1.method5471(); - var38 = var37 >> 2; - var4 = var37 & 3; - var5 = Client.field697[var38]; - var6 = var1.method5470(); - var7 = (var6 >> 4 & 7) + class40.field326; - var8 = (var6 & 7) + WorldMapSection2.field195; - if (var7 >= 0 && var8 >= 0 && var7 < 104 && var8 < 104) { - WorldMapSection1.updatePendingSpawn(WorldMapRectangle.plane, var7, var8, var5, -1, var38, var4, 0, -1); - } + for (var0 = 0; var0 < 2048; ++var0) { + Client.players[var0] = null; + } - } else if (class185.field2297 == var0) { - var37 = var1.method5480(); - var38 = var1.method5479(); - var4 = var1.method5470(); - var5 = (var4 >> 4 & 7) + class40.field326; - var6 = (var4 & 7) + WorldMapSection2.field195; - if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { - var33 = new TileItem(); - var33.id = var38; - var33.quantity = var37; - if (Client.groundItems[WorldMapRectangle.plane][var5][var6] == null) { - Client.groundItems[WorldMapRectangle.plane][var5][var6] = new NodeDeque(); - } + for (var0 = 0; var0 < 32768; ++var0) { + Client.npcs[var0] = null; + } - Client.groundItems[WorldMapRectangle.plane][var5][var6].addFirst(var33); - WorldMapCacheName.updateItemPile(var5, var6); - } - - } else { - if (class185.field2300 == var0) { - var37 = var1.method5511(); - var38 = (var37 >> 4 & 7) + class40.field326; - var4 = (var37 & 7) + WorldMapSection2.field195; - var5 = var1.method5511(); - var6 = var5 >> 4 & 15; - var7 = var5 & 7; - var8 = var1.readUnsignedShort(); - var9 = var1.method5511(); - if (var38 >= 0 && var4 >= 0 && var38 < 104 && var4 < 104) { - var10 = var6 + 1; - if (class223.localPlayer.pathX[0] >= var38 - var10 && class223.localPlayer.pathX[0] <= var10 + var38 && class223.localPlayer.pathY[0] >= var4 - var10 && class223.localPlayer.pathY[0] <= var10 + var4 && Client.field868 != 0 && var7 > 0 && Client.soundEffectCount < 50) { - Client.soundEffectIds[Client.soundEffectCount] = var8; - Client.queuedSoundEffectLoops[Client.soundEffectCount] = var7; - Client.queuedSoundEffectDelays[Client.soundEffectCount] = var9; - Client.soundEffects[Client.soundEffectCount] = null; - Client.soundLocations[Client.soundEffectCount] = var6 + (var4 << 8) + (var38 << 16); - ++Client.soundEffectCount; - } - } - } - - if (class185.field2299 == var0) { - var37 = var1.readUnsignedByte(); - var38 = var37 >> 2; - var4 = var37 & 3; - var5 = Client.field697[var38]; - var6 = var1.method5470(); - var7 = (var6 >> 4 & 7) + class40.field326; - var8 = (var6 & 7) + WorldMapSection2.field195; - var9 = var1.readUnsignedShort(); - if (var7 >= 0 && var8 >= 0 && var7 < 104 && var8 < 104) { - WorldMapSection1.updatePendingSpawn(WorldMapRectangle.plane, var7, var8, var5, var9, var38, var4, 0, -1); - } - - } else if (class185.field2295 == var0) { - var37 = var1.method5647(); - var38 = var1.method5511(); - var4 = (var38 >> 4 & 7) + class40.field326; - var5 = (var38 & 7) + WorldMapSection2.field195; - var6 = var1.method5479(); - var7 = var1.method5647(); - byte var39 = var1.method5475(); - var9 = var1.method5511() * 4; - var10 = var1.readUnsignedByte(); - var40 = var1.method5470(); - byte var41 = var1.method5473(); - var13 = var1.method5486(); - var14 = var1.method5511() * 4; - var12 = var41 + var4; - var8 = var39 + var5; - if (var4 >= 0 && var5 >= 0 && var4 < 104 && var5 < 104 && var12 >= 0 && var8 >= 0 && var12 < 104 && var8 < 104 && var37 != 65535) { - var4 = var4 * 128 + 64; - var5 = var5 * 128 + 64; - var12 = var12 * 128 + 64; - var8 = var8 * 128 + 64; - Projectile var34 = new Projectile(var37, WorldMapRectangle.plane, var4, var5, MusicPatchPcmStream.getTileHeight(var4, var5, WorldMapRectangle.plane) - var14, var6 + Client.cycle, var7 + Client.cycle, var40, var10, var13, var9); - var34.setDestination(var12, var8, MusicPatchPcmStream.getTileHeight(var12, var8, WorldMapRectangle.plane) - var9, var6 + Client.cycle); - Client.projectiles.addFirst(var34); - } - - } else if (class185.field2303 != var0) { - if (class185.field2301 == var0) { - var37 = var1.method5647(); - var38 = var1.method5470(); - var4 = var1.method5470(); - var5 = (var4 >> 4 & 7) + class40.field326; - var6 = (var4 & 7) + WorldMapSection2.field195; - var7 = var1.method5479(); - if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { - var5 = var5 * 128 + 64; - var6 = var6 * 128 + 64; - GraphicsObject var45 = new GraphicsObject(var7, WorldMapRectangle.plane, var5, var6, MusicPatchPcmStream.getTileHeight(var5, var6, WorldMapRectangle.plane) - var38, var37, Client.cycle); - Client.graphicsObjects.addFirst(var45); - } - - } - } else { - var37 = var1.method5479(); - var38 = var1.method5480(); - var4 = var1.method5471(); - var5 = (var4 >> 4 & 7) + class40.field326; - var6 = (var4 & 7) + WorldMapSection2.field195; - var7 = var1.method5480(); - if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { - NodeDeque var35 = Client.groundItems[WorldMapRectangle.plane][var5][var6]; - if (var35 != null) { - for (TileItem var36 = (TileItem)var35.last(); var36 != null; var36 = (TileItem)var35.previous()) { - if ((var37 & 32767) == var36.id && var7 == var36.quantity) { - var36.quantity = var38; - break; - } - } - - WorldMapCacheName.updateItemPile(var5, var6); - } - } + Client.combatTargetPlayerIndex = -1; + Client.projectiles.clear(); + Client.graphicsObjects.clear(); + for (var0 = 0; var0 < 4; ++var0) { + for (int var1 = 0; var1 < 104; ++var1) { + for (int var2 = 0; var2 < 104; ++var2) { + Client.groundItems[var0][var1][var2] = null; } } } + + Client.pendingSpawns = new NodeDeque(); + PacketWriter.friendSystem.clear(); + + for (var0 = 0; var0 < VarpDefinition.VarpDefinition_fileCount; ++var0) { + VarpDefinition var3 = Varcs.method2352(var0); + if (var3 != null) { + Varps.Varps_temp[var0] = 0; + Varps.Varps_main[var0] = 0; + } + } + + class1.varcs.clearTransient(); + Client.followerIndex = -1; + if (Client.rootInterface != -1) { + PlayerAppearance.method4191(Client.rootInterface); + } + + for (InterfaceParent var4 = (InterfaceParent)Client.interfaceParents.first(); var4 != null; var4 = (InterfaceParent)Client.interfaceParents.next()) { + GrandExchangeOfferOwnWorldComparator.closeInterface(var4, true); + } + + Client.rootInterface = -1; + Client.interfaceParents = new NodeHashTable(8); + Client.meslayerContinueWidget = null; + Client.menuOptionsCount = 0; + Client.isMenuOpen = false; + Client.playerAppearance.update((int[])null, new int[]{0, 0, 0, 0, 0}, false, -1); + + for (var0 = 0; var0 < 8; ++var0) { + Client.playerMenuActions[var0] = null; + Client.playerOptionsPriorities[var0] = false; + } + + ItemContainer.itemContainers = new NodeHashTable(32); + Client.isLoading = true; + + for (var0 = 0; var0 < 100; ++var0) { + Client.field842[var0] = true; + } + + PacketBufferNode var5 = SoundSystem.getPacketBufferNode(ClientPacket.field2257, Client.packetWriter.isaacCipher); + var5.packetBuffer.writeByte(WallDecoration.getWindowedMode()); + var5.packetBuffer.writeShort(class286.canvasWidth); + var5.packetBuffer.writeShort(FloorUnderlayDefinition.canvasHeight); + Client.packetWriter.addNode(var5); + class4.clanChat = null; + + for (var0 = 0; var0 < 8; ++var0) { + Client.grandExchangeOffers[var0] = new GrandExchangeOffer(); + } + + WorldMapData_1.grandExchangeEvents = null; } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java index 18f65503f9..93fd448737 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java @@ -5,120 +5,333 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("c") +@ObfuscatedName("m") @Implements("GrandExchangeOfferUnitPriceComparator") final class GrandExchangeOfferUnitPriceComparator implements Comparator { - @ObfuscatedName("s") - @ObfuscatedGetter( - intValue = -1987201491 - ) - @Export("loginBoxCenter") - static int loginBoxCenter; - - @ObfuscatedName("z") + @ObfuscatedName("dy") @ObfuscatedSignature( - signature = "(Lm;Lm;I)I", - garbageValue = "1379036847" + signature = "Lij;" + ) + @Export("archive8") + static Archive archive8; + @ObfuscatedName("ex") + @ObfuscatedGetter( + intValue = -1695293753 + ) + @Export("port3") + static int port3; + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lo;Lo;I)I", + garbageValue = "-1452765932" ) @Export("compare_bridged") int compare_bridged(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.grandExchangeOffer.unitPrice < var2.grandExchangeOffer.unitPrice ? -1 : (var2.grandExchangeOffer.unitPrice == var1.grandExchangeOffer.unitPrice ? 0 : 1); } - public int compare(Object var1, Object var2) { - return this.compare_bridged((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); - } - public boolean equals(Object var1) { return super.equals(var1); } - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(II)Lix;", - garbageValue = "-1839745147" - ) - @Export("SequenceDefinition_get") - public static SequenceDefinition SequenceDefinition_get(int var0) { - SequenceDefinition var1 = (SequenceDefinition)SequenceDefinition.SequenceDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = SequenceDefinition.SequenceDefinition_archive.takeFile(12, var0); - var1 = new SequenceDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); - } - - var1.postDecode(); - SequenceDefinition.SequenceDefinition_cached.put(var1, (long)var0); - return var1; - } + public int compare(Object var1, Object var2) { + return this.compare_bridged((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @ObfuscatedName("n") + @ObfuscatedName("hy") @ObfuscatedSignature( - signature = "(Ljava/lang/Object;ZI)[B", - garbageValue = "264970062" + signature = "(IIIIIIIB)V", + garbageValue = "19" ) - @Export("serialize") - public static byte[] serialize(Object var0, boolean var1) { - if (var0 == null) { - return null; - } else if (var0 instanceof byte[]) { - byte[] var6 = (byte[])((byte[])var0); - if (var1) { - int var4 = var6.length; - byte[] var5 = new byte[var4]; - System.arraycopy(var6, 0, var5, 0, var4); - return var5; - } else { - return var6; + @Export("addPendingSpawnToScene") + static final void addPendingSpawnToScene(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { + if (var2 >= 1 && var3 >= 1 && var2 <= 102 && var3 <= 102) { + if (Client.isLowDetail && var0 != Player.Scene_plane) { + return; + } + + long var7 = 0L; + boolean var9 = true; + boolean var10 = false; + boolean var11 = false; + if (var1 == 0) { + var7 = WorldMapArea.scene.getBoundaryObjectTag(var0, var2, var3); + } + + if (var1 == 1) { + var7 = WorldMapArea.scene.getWallDecorationTag(var0, var2, var3); + } + + if (var1 == 2) { + var7 = WorldMapArea.scene.getGameObjectTag(var0, var2, var3); + } + + if (var1 == 3) { + var7 = WorldMapArea.scene.getFloorDecorationTag(var0, var2, var3); + } + + int var12; + if (0L != var7) { + var12 = WorldMapArea.scene.getObjectFlags(var0, var2, var3, var7); + int var39 = UserComparator8.Entity_unpackID(var7); + int var40 = var12 & 31; + int var41 = var12 >> 6 & 3; + ObjectDefinition var13; + if (var1 == 0) { + WorldMapArea.scene.removeBoundaryObject(var0, var2, var3); + var13 = WorldMapDecorationType.getObjectDefinition(var39); + if (var13.interactType != 0) { + Client.collisionMaps[var0].method3690(var2, var3, var40, var41, var13.boolean1); + } + } + + if (var1 == 1) { + WorldMapArea.scene.removeWallDecoration(var0, var2, var3); + } + + if (var1 == 2) { + WorldMapArea.scene.removeGameObject(var0, var2, var3); + var13 = WorldMapDecorationType.getObjectDefinition(var39); + if (var2 + var13.sizeX > 103 || var3 + var13.sizeX > 103 || var2 + var13.sizeY > 103 || var3 + var13.sizeY > 103) { + return; + } + + if (var13.interactType != 0) { + Client.collisionMaps[var0].setFlagOffNonSquare(var2, var3, var13.sizeX, var13.sizeY, var41, var13.boolean1); + } + } + + if (var1 == 3) { + WorldMapArea.scene.removeFloorDecoration(var0, var2, var3); + var13 = WorldMapDecorationType.getObjectDefinition(var39); + if (var13.interactType == 1) { + Client.collisionMaps[var0].method3693(var2, var3); + } + } + } + + if (var4 >= 0) { + var12 = var0; + if (var0 < 3 && (Tiles.Tiles_renderFlags[1][var2][var3] & 2) == 2) { + var12 = var0 + 1; + } + + Scene var42 = WorldMapArea.scene; + CollisionMap var14 = Client.collisionMaps[var0]; + ObjectDefinition var15 = WorldMapDecorationType.getObjectDefinition(var4); + int var16; + int var17; + if (var5 != 1 && var5 != 3) { + var16 = var15.sizeX; + var17 = var15.sizeY; + } else { + var16 = var15.sizeY; + var17 = var15.sizeX; + } + + int var18; + int var19; + if (var16 + var2 <= 104) { + var18 = (var16 >> 1) + var2; + var19 = var2 + (var16 + 1 >> 1); + } else { + var18 = var2; + var19 = var2 + 1; + } + + int var20; + int var21; + if (var3 + var17 <= 104) { + var20 = var3 + (var17 >> 1); + var21 = var3 + (var17 + 1 >> 1); + } else { + var20 = var3; + var21 = var3 + 1; + } + + int[][] var22 = Tiles.Tiles_heights[var12]; + int var23 = var22[var18][var21] + var22[var18][var20] + var22[var19][var20] + var22[var19][var21] >> 2; + int var24 = (var2 << 7) + (var16 << 6); + int var25 = (var3 << 7) + (var17 << 6); + long var26 = class160.calculateTag(var2, var3, 2, var15.int1 == 0, var4); + int var28 = (var5 << 6) + var6; + if (var15.int3 == 1) { + var28 += 256; + } + + Object var29; + if (var6 == 22) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(22, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 22, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newFloorDecoration(var0, var2, var3, var23, (Entity)var29, var26, var28); + if (var15.interactType == 1) { + var14.setBlockedByFloorDec(var2, var3); + } + } else if (var6 != 10 && var6 != 11) { + if (var6 >= 12) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(var6, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, var6, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.method3213(var0, var2, var3, var23, 1, 1, (Entity)var29, 0, var26, var28); + if (var15.interactType != 0) { + var14.addGameObject(var2, var3, var16, var17, var15.boolean1); + } + } else if (var6 == 0) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(0, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 0, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newBoundaryObject(var0, var2, var3, var23, (Entity)var29, (Entity)null, Tiles.field489[var5], 0, var26, var28); + if (var15.interactType != 0) { + var14.method3685(var2, var3, var6, var5, var15.boolean1); + } + } else if (var6 == 1) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(1, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 1, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newBoundaryObject(var0, var2, var3, var23, (Entity)var29, (Entity)null, Tiles.field490[var5], 0, var26, var28); + if (var15.interactType != 0) { + var14.method3685(var2, var3, var6, var5, var15.boolean1); + } + } else { + int var35; + if (var6 == 2) { + var35 = var5 + 1 & 3; + Object var30; + Object var31; + if (var15.animationId == -1 && var15.transforms == null) { + var30 = var15.getModel(2, var5 + 4, var22, var24, var23, var25); + var31 = var15.getModel(2, var35, var22, var24, var23, var25); + } else { + var30 = new DynamicObject(var4, 2, var5 + 4, var12, var2, var3, var15.animationId, true, (Entity)null); + var31 = new DynamicObject(var4, 2, var35, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newBoundaryObject(var0, var2, var3, var23, (Entity)var30, (Entity)var31, Tiles.field489[var5], Tiles.field489[var35], var26, var28); + if (var15.interactType != 0) { + var14.method3685(var2, var3, var6, var5, var15.boolean1); + } + } else if (var6 == 3) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(3, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 3, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newBoundaryObject(var0, var2, var3, var23, (Entity)var29, (Entity)null, Tiles.field490[var5], 0, var26, var28); + if (var15.interactType != 0) { + var14.method3685(var2, var3, var6, var5, var15.boolean1); + } + } else if (var6 == 9) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(var6, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, var6, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.method3213(var0, var2, var3, var23, 1, 1, (Entity)var29, 0, var26, var28); + if (var15.interactType != 0) { + var14.addGameObject(var2, var3, var16, var17, var15.boolean1); + } + } else if (var6 == 4) { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(4, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 4, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newWallDecoration(var0, var2, var3, var23, (Entity)var29, (Entity)null, Tiles.field489[var5], 0, 0, 0, var26, var28); + } else { + Object var32; + long var36; + if (var6 == 5) { + var35 = 16; + var36 = var42.getBoundaryObjectTag(var0, var2, var3); + if (var36 != 0L) { + var35 = WorldMapDecorationType.getObjectDefinition(UserComparator8.Entity_unpackID(var36)).int2; + } + + if (var15.animationId == -1 && var15.transforms == null) { + var32 = var15.getModel(4, var5, var22, var24, var23, var25); + } else { + var32 = new DynamicObject(var4, 4, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newWallDecoration(var0, var2, var3, var23, (Entity)var32, (Entity)null, Tiles.field489[var5], 0, var35 * Tiles.field491[var5], var35 * Tiles.field498[var5], var26, var28); + } else if (var6 == 6) { + var35 = 8; + var36 = var42.getBoundaryObjectTag(var0, var2, var3); + if (var36 != 0L) { + var35 = WorldMapDecorationType.getObjectDefinition(UserComparator8.Entity_unpackID(var36)).int2 / 2; + } + + if (var15.animationId == -1 && var15.transforms == null) { + var32 = var15.getModel(4, var5 + 4, var22, var24, var23, var25); + } else { + var32 = new DynamicObject(var4, 4, var5 + 4, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newWallDecoration(var0, var2, var3, var23, (Entity)var32, (Entity)null, 256, var5, var35 * Tiles.field493[var5], var35 * Tiles.field494[var5], var26, var28); + } else if (var6 == 7) { + int var38 = var5 + 2 & 3; + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(4, var38 + 4, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 4, var38 + 4, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newWallDecoration(var0, var2, var3, var23, (Entity)var29, (Entity)null, 256, var38, 0, 0, var26, var28); + } else if (var6 == 8) { + var35 = 8; + var36 = var42.getBoundaryObjectTag(var0, var2, var3); + if (0L != var36) { + var35 = WorldMapDecorationType.getObjectDefinition(UserComparator8.Entity_unpackID(var36)).int2 / 2; + } + + int var34 = var5 + 2 & 3; + Object var33; + if (var15.animationId == -1 && var15.transforms == null) { + var32 = var15.getModel(4, var5 + 4, var22, var24, var23, var25); + var33 = var15.getModel(4, var34 + 4, var22, var24, var23, var25); + } else { + var32 = new DynamicObject(var4, 4, var5 + 4, var12, var2, var3, var15.animationId, true, (Entity)null); + var33 = new DynamicObject(var4, 4, var34 + 4, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + var42.newWallDecoration(var0, var2, var3, var23, (Entity)var32, (Entity)var33, 256, var5, var35 * Tiles.field493[var5], var35 * Tiles.field494[var5], var26, var28); + } + } + } + } else { + if (var15.animationId == -1 && var15.transforms == null) { + var29 = var15.getModel(10, var5, var22, var24, var23, var25); + } else { + var29 = new DynamicObject(var4, 10, var5, var12, var2, var3, var15.animationId, true, (Entity)null); + } + + if (var29 != null) { + var42.method3213(var0, var2, var3, var23, var16, var17, (Entity)var29, var6 == 11 ? 256 : 0, var26, var28); + } + + if (var15.interactType != 0) { + var14.addGameObject(var2, var3, var16, var17, var15.boolean1); + } + } } - } else if (var0 instanceof AbstractByteArrayCopier) { - AbstractByteArrayCopier var2 = (AbstractByteArrayCopier)var0; - return var2.get(); - } else { - throw new IllegalArgumentException(); } - } - @ObfuscatedName("eg") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "35" - ) - static final void method139() { - Scene.Scene_isLowDetail = false; - Client.isLowDetail = false; - } - - @ObfuscatedName("gl") - @ObfuscatedSignature( - signature = "(Lbi;B)Z", - garbageValue = "64" - ) - static boolean method134(Player var0) { - if (Client.drawPlayerNames == 0) { - return false; - } else if (class223.localPlayer != var0) { - boolean var1 = (Client.drawPlayerNames & 4) != 0; - boolean var2 = var1; - boolean var3; - if (!var1) { - var3 = (Client.drawPlayerNames & 1) != 0; - var2 = var3 && var0.isFriend(); - } - - var3 = var2; - if (!var2) { - boolean var4 = (Client.drawPlayerNames & 2) != 0; - var3 = var4 && var0.isClanMember(); - } - - return var3; - } else { - return class16.method195(); - } } } diff --git a/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java b/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java index 0ec11b3777..df544be647 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferWorldComparator.java @@ -4,20 +4,25 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("p") +@ObfuscatedName("l") @Implements("GrandExchangeOfferWorldComparator") final class GrandExchangeOfferWorldComparator implements Comparator { - @ObfuscatedName("qd") + @ObfuscatedName("su") @ObfuscatedSignature( - signature = "Ldv;" + signature = "Lif;" ) - @Export("pcmPlayer1") - static PcmPlayer pcmPlayer1; - - @ObfuscatedName("z") + public static class237 field30; + @ObfuscatedName("gq") @ObfuscatedSignature( - signature = "(Lm;Lm;I)I", - garbageValue = "-1166584542" + signature = "[Llw;" + ) + @Export("mapSceneSprites") + static IndexedSprite[] mapSceneSprites; + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lo;Lo;I)I", + garbageValue = "-1039066060" ) @Export("compare_bridged") int compare_bridged(GrandExchangeEvent var1, GrandExchangeEvent var2) { @@ -32,206 +37,62 @@ final class GrandExchangeOfferWorldComparator implements Comparator { return super.equals(var1); } - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(III)Lho;", - garbageValue = "-217608323" + signature = "(I)[Lgs;", + garbageValue = "-126362707" ) - @Export("getWidgetChild") - public static Widget getWidgetChild(int var0, int var1) { - Widget var2 = Canvas.getWidget(var0); - if (var1 == -1) { - return var2; - } else { - return var2 != null && var2.children != null && var1 < var2.children.length ? var2.children[var1] : null; - } + static LoginPacket[] method105() { + return new LoginPacket[]{LoginPacket.field2287, LoginPacket.field2284, LoginPacket.field2286, LoginPacket.field2283, LoginPacket.field2285}; } - @ObfuscatedName("p") + @ObfuscatedName("hc") @ObfuscatedSignature( - signature = "(Lkl;IIIIIII)V", - garbageValue = "-109432634" + signature = "(IIIIIIIIIB)V", + garbageValue = "-70" ) - @Export("loadTerrain") - static final void loadTerrain(Buffer var0, int var1, int var2, int var3, int var4, int var5, int var6) { - int var7; - if (var2 >= 0 && var2 < 104 && var3 >= 0 && var3 < 104) { - Tiles.Tiles_renderFlags[var1][var2][var3] = 0; + @Export("updatePendingSpawn") + static final void updatePendingSpawn(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { + PendingSpawn var9 = null; - while (true) { - var7 = var0.readUnsignedByte(); - if (var7 == 0) { - if (var1 == 0) { - Tiles.Tiles_heights[0][var2][var3] = -WorldMapDecoration.method347(var2 + 932731 + var4, var5 + var3 + 556238) * 8; - } else { - Tiles.Tiles_heights[var1][var2][var3] = Tiles.Tiles_heights[var1 - 1][var2][var3] - 240; - } - break; - } - - if (var7 == 1) { - int var8 = var0.readUnsignedByte(); - if (var8 == 1) { - var8 = 0; - } - - if (var1 == 0) { - Tiles.Tiles_heights[0][var2][var3] = -var8 * 8; - } else { - Tiles.Tiles_heights[var1][var2][var3] = Tiles.Tiles_heights[var1 - 1][var2][var3] - var8 * 8; - } - break; - } - - if (var7 <= 49) { - Tiles.field483[var1][var2][var3] = var0.readByte(); - DevicePcmPlayerProvider.field393[var1][var2][var3] = (byte)((var7 - 2) / 4); - class287.field3634[var1][var2][var3] = (byte)(var7 - 2 + var6 & 3); - } else if (var7 <= 81) { - Tiles.Tiles_renderFlags[var1][var2][var3] = (byte)(var7 - 49); - } else { - Tiles.field501[var1][var2][var3] = (byte)(var7 - 81); - } - } - } else { - while (true) { - var7 = var0.readUnsignedByte(); - if (var7 == 0) { - break; - } - - if (var7 == 1) { - var0.readUnsignedByte(); - break; - } - - if (var7 <= 49) { - var0.readUnsignedByte(); - } + for (PendingSpawn var10 = (PendingSpawn)Client.pendingSpawns.last(); var10 != null; var10 = (PendingSpawn)Client.pendingSpawns.previous()) { + if (var0 == var10.plane && var10.x == var1 && var2 == var10.y && var3 == var10.type) { + var9 = var10; + break; } } + if (var9 == null) { + var9 = new PendingSpawn(); + var9.plane = var0; + var9.type = var3; + var9.x = var1; + var9.y = var2; + FaceNormal.method3396(var9); + Client.pendingSpawns.addFirst(var9); + } + + var9.id = var4; + var9.field917 = var5; + var9.orientation = var6; + var9.delay = var7; + var9.hitpoints = var8; } - @ObfuscatedName("b") + @ObfuscatedName("ld") @ObfuscatedSignature( - signature = "(IIIIIZI)Llf;", - garbageValue = "-366639753" + signature = "(Lkc;II)V", + garbageValue = "-1416348373" ) - @Export("getItemSprite") - public static final Sprite getItemSprite(int var0, int var1, int var2, int var3, int var4, boolean var5) { - if (var1 == -1) { - var4 = 0; - } else if (var4 == 2 && var1 != 1) { - var4 = 1; - } - - long var6 = ((long)var3 << 42) + ((long)var4 << 40) + ((long)var2 << 38) + (long)var0 + ((long)var1 << 16); - Sprite var8; - if (!var5) { - var8 = (Sprite)ItemDefinition.ItemDefinition_cachedSprites.get(var6); - if (var8 != null) { - return var8; + static void method103(Buffer var0, int var1) { + ClanMate.method5151(var0.array, var1); + if (JagexCache.JagexCache_randomDat != null) { + try { + JagexCache.JagexCache_randomDat.seek(0L); + JagexCache.JagexCache_randomDat.write(var0.array, var1, 24); + } catch (Exception var3) { } } - ItemDefinition var9 = Occluder.ItemDefinition_get(var0); - if (var1 > 1 && var9.countobj != null) { - int var10 = -1; - - for (int var11 = 0; var11 < 10; ++var11) { - if (var1 >= var9.countco[var11] && var9.countco[var11] != 0) { - var10 = var9.countobj[var11]; - } - } - - if (var10 != -1) { - var9 = Occluder.ItemDefinition_get(var10); - } - } - - Model var19 = var9.getModel(1); - if (var19 == null) { - return null; - } else { - Sprite var20 = null; - if (var9.noteTemplate != -1) { - var20 = getItemSprite(var9.note, 10, 1, 0, 0, true); - if (var20 == null) { - return null; - } - } else if (var9.notedId != -1) { - var20 = getItemSprite(var9.unnotedId, var1, var2, var3, 0, false); - if (var20 == null) { - return null; - } - } else if (var9.placeholderTemplate != -1) { - var20 = getItemSprite(var9.placeholder, var1, 0, 0, 0, false); - if (var20 == null) { - return null; - } - } - - int[] var12 = Rasterizer2D.Rasterizer2D_pixels; - int var13 = Rasterizer2D.Rasterizer2D_width; - int var14 = Rasterizer2D.Rasterizer2D_height; - int[] var15 = new int[4]; - Rasterizer2D.Rasterizer2D_getClipArray(var15); - var8 = new Sprite(36, 32); - Rasterizer2D.Rasterizer2D_replace(var8.pixels, 36, 32); - Rasterizer2D.Rasterizer2D_clear(); - Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); - Rasterizer3D.method2992(16, 16); - Rasterizer3D.field1754 = false; - if (var9.placeholderTemplate != -1) { - var20.drawTransBgAt(0, 0); - } - - int var16 = var9.zoom2d; - if (var5) { - var16 = (int)(1.5D * (double)var16); - } else if (var2 == 2) { - var16 = (int)(1.04D * (double)var16); - } - - int var17 = var16 * Rasterizer3D.Rasterizer3D_sine[var9.xan2d] >> 16; - int var18 = var16 * Rasterizer3D.Rasterizer3D_cosine[var9.xan2d] >> 16; - var19.calculateBoundsCylinder(); - var19.method2870(0, var9.yan2d, var9.zan2d, var9.xan2d, var9.offsetX2d, var19.height / 2 + var17 + var9.offsetY2d, var18 + var9.offsetY2d); - if (var9.notedId != -1) { - var20.drawTransBgAt(0, 0); - } - - if (var2 >= 1) { - var8.outline(1); - } - - if (var2 >= 2) { - var8.outline(16777215); - } - - if (var3 != 0) { - var8.shadow(var3); - } - - Rasterizer2D.Rasterizer2D_replace(var8.pixels, 36, 32); - if (var9.noteTemplate != -1) { - var20.drawTransBgAt(0, 0); - } - - if (var4 == 1 || var4 == 2 && var9.isStackable == 1) { - FaceNormal.ItemDefinition_fontPlain11.draw(class43.method839(var1), 0, 9, 16776960, 1); - } - - if (!var5) { - ItemDefinition.ItemDefinition_cachedSprites.put(var8, var6); - } - - Rasterizer2D.Rasterizer2D_replace(var12, var13, var14); - Rasterizer2D.Rasterizer2D_setClipArray(var15); - Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); - Rasterizer3D.field1754 = true; - return var8; - } } } diff --git a/runescape-client/src/main/java/GraphicsDefaults.java b/runescape-client/src/main/java/GraphicsDefaults.java index 284542ab3d..c9d543cf6b 100644 --- a/runescape-client/src/main/java/GraphicsDefaults.java +++ b/runescape-client/src/main/java/GraphicsDefaults.java @@ -3,97 +3,92 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("kw") +@ObfuscatedName("kb") @Implements("GraphicsDefaults") public class GraphicsDefaults { - @ObfuscatedName("fz") - @ObfuscatedSignature( - signature = "Lkn;" - ) - @Export("fontPlain12") - static Font fontPlain12; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1913101075 + intValue = 355639221 ) @Export("compass") public int compass; + @ObfuscatedName("t") + @ObfuscatedGetter( + intValue = 1345037469 + ) + public int field3787; @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -245940859 - ) - public int field3797; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = 2030709025 + intValue = 1267920099 ) @Export("mapScenes") public int mapScenes; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 936076039 + intValue = -1711317783 ) @Export("headIconsPk") public int headIconsPk; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1090087377 + intValue = 1346521291 ) - public int field3800; - @ObfuscatedName("p") + public int field3790; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1274199689 + intValue = 850710053 ) - public int field3796; - @ObfuscatedName("q") - @ObfuscatedGetter( - intValue = 423516137 - ) - public int field3802; - @ObfuscatedName("m") - @ObfuscatedGetter( - intValue = 1649613365 - ) - public int field3803; - @ObfuscatedName("y") - @ObfuscatedGetter( - intValue = -1828299055 - ) - public int field3804; - @ObfuscatedName("i") - @ObfuscatedGetter( - intValue = 495147529 - ) - public int field3807; + public int field3786; @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1539500843 + intValue = 258806615 ) - public int field3806; + public int field3791; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = -1735079565 + ) + public int field3793; + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = 579452143 + ) + public int field3794; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = 942987761 + ) + public int field3795; + @ObfuscatedName("m") + @ObfuscatedGetter( + intValue = -2075865955 + ) + public int field3796; public GraphicsDefaults() { this.compass = -1; - this.field3797 = -1; + this.field3787 = -1; this.mapScenes = -1; this.headIconsPk = -1; - this.field3800 = -1; + this.field3790 = -1; + this.field3786 = -1; + this.field3791 = -1; + this.field3793 = -1; + this.field3794 = -1; + this.field3795 = -1; this.field3796 = -1; - this.field3802 = -1; - this.field3803 = -1; - this.field3804 = -1; - this.field3807 = -1; - this.field3806 = -1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;I)V", - garbageValue = "1722575536" + signature = "(Lhq;I)V", + garbageValue = "-1902520988" ) @Export("decode") public void decode(AbstractArchive var1) { - byte[] var2 = var1.takeFileFlat(DefaultsGroup.field3794.group); + byte[] var2 = var1.takeFileFlat(DefaultsGroup.field3785.group); Buffer var3 = new Buffer(var2); while (true) { @@ -107,18 +102,32 @@ public class GraphicsDefaults { var3.readMedium(); break; case 2: - this.compass = var3.method5453(); - this.field3797 = var3.method5453(); - this.mapScenes = var3.method5453(); - this.headIconsPk = var3.method5453(); - this.field3800 = var3.method5453(); - this.field3796 = var3.method5453(); - this.field3802 = var3.method5453(); - this.field3803 = var3.method5453(); - this.field3804 = var3.method5453(); - this.field3807 = var3.method5453(); - this.field3806 = var3.method5453(); + this.compass = var3.method5638(); + this.field3787 = var3.method5638(); + this.mapScenes = var3.method5638(); + this.headIconsPk = var3.method5638(); + this.field3790 = var3.method5638(); + this.field3786 = var3.method5638(); + this.field3791 = var3.method5638(); + this.field3793 = var3.method5638(); + this.field3794 = var3.method5638(); + this.field3795 = var3.method5638(); + this.field3796 = var3.method5638(); } } } + + @ObfuscatedName("au") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "1720763557" + ) + static int method6006(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.LOGOUT) { + Client.logoutTimer = 250; + return 1; + } else { + return 2; + } + } } diff --git a/runescape-client/src/main/java/GraphicsObject.java b/runescape-client/src/main/java/GraphicsObject.java index b9b3f9f460..48cde0eb67 100644 --- a/runescape-client/src/main/java/GraphicsObject.java +++ b/runescape-client/src/main/java/GraphicsObject.java @@ -1,4 +1,3 @@ -import java.security.SecureRandom; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; @@ -8,64 +7,61 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("bp") @Implements("GraphicsObject") public final class GraphicsObject extends Entity { - @ObfuscatedName("ec") - @Export("secureRandom") - static SecureRandom secureRandom; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -725302413 - ) - @Export("height") - int height; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = 781452541 + intValue = 1802533403 ) @Export("id") int id; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 34616617 + intValue = 41870533 ) @Export("cycleStart") int cycleStart; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1951259679 + intValue = 2097627587 ) @Export("plane") int plane; - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1240960337 + intValue = 1396277017 ) @Export("x") int x; - @ObfuscatedName("p") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1722241771 + intValue = 176169087 ) @Export("y") int y; - @ObfuscatedName("q") + @ObfuscatedName("l") + @ObfuscatedGetter( + intValue = -1076898081 + ) + @Export("height") + int height; + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lix;" + signature = "Liv;" ) @Export("sequenceDefinition") SequenceDefinition sequenceDefinition; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 926579167 + intValue = 977223341 ) @Export("frame") int frame; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1223841967 + intValue = -706128457 ) @Export("frameCycle") int frameCycle; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("isFinished") boolean isFinished; @@ -79,20 +75,20 @@ public final class GraphicsObject extends Entity { this.y = var4; this.height = var5; this.cycleStart = var7 + var6; - int var8 = InterfaceParent.SpotAnimationDefinition_get(this.id).sequence; + int var8 = MenuAction.SpotAnimationDefinition_get(this.id).sequence; if (var8 != -1) { this.isFinished = false; - this.sequenceDefinition = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var8); + this.sequenceDefinition = PlayerType.SequenceDefinition_get(var8); } else { this.isFinished = true; } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(IB)V", - garbageValue = "-72" + garbageValue = "1" ) @Export("advance") final void advance(int var1) { @@ -111,14 +107,14 @@ public final class GraphicsObject extends Entity { } } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected final Model getModel() { - SpotAnimationDefinition var1 = InterfaceParent.SpotAnimationDefinition_get(this.id); + SpotAnimationDefinition var1 = MenuAction.SpotAnimationDefinition_get(this.id); Model var2; if (!this.isFinished) { var2 = var1.getModel(this.frame); @@ -128,4 +124,54 @@ public final class GraphicsObject extends Entity { return var2 == null ? null : var2; } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(II)I", + garbageValue = "-1912506698" + ) + public static int method2158(int var0) { + var0 = (var0 & 1431655765) + (var0 >>> 1 & 1431655765); + var0 = (var0 >>> 2 & 858993459) + (var0 & 858993459); + var0 = var0 + (var0 >>> 4) & 252645135; + var0 += var0 >>> 8; + var0 += var0 >>> 16; + return var0 & 255; + } + + @ObfuscatedName("n") + static boolean method2155(long var0) { + boolean var2 = var0 != 0L; + if (var2) { + boolean var3 = (int)(var0 >>> 16 & 1L) == 1; + var2 = !var3; + } + + return var2; + } + + @ObfuscatedName("hi") + @ObfuscatedSignature( + signature = "(IIII)I", + garbageValue = "-1853163943" + ) + @Export("getTileHeight") + static final int getTileHeight(int var0, int var1, int var2) { + int var3 = var0 >> 7; + int var4 = var1 >> 7; + if (var3 >= 0 && var4 >= 0 && var3 <= 103 && var4 <= 103) { + int var5 = var2; + if (var2 < 3 && (Tiles.Tiles_renderFlags[1][var3][var4] & 2) == 2) { + var5 = var2 + 1; + } + + int var6 = var0 & 127; + int var7 = var1 & 127; + int var8 = (128 - var6) * Tiles.Tiles_heights[var5][var3][var4] + var6 * Tiles.Tiles_heights[var5][var3 + 1][var4] >> 7; + int var9 = var6 * Tiles.Tiles_heights[var5][var3 + 1][var4 + 1] + Tiles.Tiles_heights[var5][var3][var4 + 1] * (128 - var6) >> 7; + return var8 * (128 - var7) + var7 * var9 >> 7; + } else { + return 0; + } + } } diff --git a/runescape-client/src/main/java/HealthBar.java b/runescape-client/src/main/java/HealthBar.java index 011d9edae6..ee33b80ee4 100644 --- a/runescape-client/src/main/java/HealthBar.java +++ b/runescape-client/src/main/java/HealthBar.java @@ -1,42 +1,46 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cz") +@ObfuscatedName("cx") @Implements("HealthBar") public class HealthBar extends Node { - @ObfuscatedName("bu") - @ObfuscatedSignature( - signature = "Llp;" - ) - @Export("worldSelectRightSprite") - static IndexedSprite worldSelectRightSprite; @ObfuscatedName("v") + @Export("SpriteBuffer_yOffsets") + public static int[] SpriteBuffer_yOffsets; + @ObfuscatedName("fj") + @ObfuscatedGetter( + intValue = 1157381415 + ) + @Export("baseY") + static int baseY; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lip;" + signature = "Lil;" ) @Export("definition") HealthBarDefinition definition; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Ljs;" + signature = "Ljm;" ) @Export("updates") IterableNodeDeque updates; @ObfuscatedSignature( - signature = "(Lip;)V" + signature = "(Lil;)V" ) HealthBar(HealthBarDefinition var1) { this.updates = new IterableNodeDeque(); this.definition = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIIIB)V", - garbageValue = "1" + signature = "(IIIII)V", + garbageValue = "703172784" ) @Export("put") void put(int var1, int var2, int var3, int var4) { @@ -69,10 +73,10 @@ public class HealthBar extends Node { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IB)Lbq;", - garbageValue = "109" + signature = "(II)Lbo;", + garbageValue = "1147155972" ) @Export("get") HealthBarUpdate get(int var1) { @@ -94,91 +98,33 @@ public class HealthBar extends Node { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-783831173" + signature = "(B)Z", + garbageValue = "-47" ) @Export("isEmpty") boolean isEmpty() { - return this.updates.method4775(); + return this.updates.method5004(); } - @ObfuscatedName("n") + @ObfuscatedName("ap") @ObfuscatedSignature( - signature = "(Llb;III)I", - garbageValue = "-1932083268" + signature = "(I)V", + garbageValue = "2136910933" ) - static int method2034(IterableNodeHashTable var0, int var1, int var2) { - if (var0 == null) { - return var2; - } else { - IntegerNode var3 = (IntegerNode)var0.get((long)var1); - return var3 == null ? var2 : var3.integer; - } - } + protected static final void method2161() { + GameShell.clock.mark(); - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(IZI)Ljava/lang/String;", - garbageValue = "878473077" - ) - @Export("intToString") - public static String intToString(int var0, boolean var1) { - if (var1 && var0 >= 0) { - int var3 = var0; - String var2; - if (var1 && var0 >= 0) { - int var4 = 2; - - for (int var5 = var0 / 10; var5 != 0; ++var4) { - var5 /= 10; - } - - char[] var6 = new char[var4]; - var6[0] = '+'; - - for (int var7 = var4 - 1; var7 > 0; --var7) { - int var8 = var3; - var3 /= 10; - int var9 = var8 - var3 * 10; - if (var9 >= 10) { - var6[var7] = (char)(var9 + 87); - } else { - var6[var7] = (char)(var9 + 48); - } - } - - var2 = new String(var6); - } else { - var2 = Integer.toString(var0, 10); - } - - return var2; - } else { - return Integer.toString(var0); - } - } - - @ObfuscatedName("fr") - @ObfuscatedSignature( - signature = "(Lby;I)V", - garbageValue = "1394806934" - ) - static final void method2032(Actor var0) { - if (var0.field976 == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var0.sequence).frameLengths[var0.sequenceFrame]) { - int var1 = var0.field976 - var0.field948; - int var2 = Client.cycle - var0.field948; - int var3 = var0.size * -527978816 + var0.field971 * 128; - int var4 = var0.size * -527978816 + var0.field973 * 128; - int var5 = var0.field972 * 128 + var0.size * -527978816; - int var6 = var0.size * -527978816 + var0.field974 * 128; - var0.x = (var2 * var5 + var3 * (var1 - var2)) / var1; - var0.y = (var6 * var2 + var4 * (var1 - var2)) / var1; + int var0; + for (var0 = 0; var0 < 32; ++var0) { + GameShell.graphicsTickTimes[var0] = 0L; } - var0.field949 = 0; - var0.orientation = var0.field977; - var0.rotation = var0.orientation; + for (var0 = 0; var0 < 32; ++var0) { + GameShell.clientTickTimes[var0] = 0L; + } + + ArchiveLoader.gameCyclesToDo = 0; } } diff --git a/runescape-client/src/main/java/HealthBarDefinition.java b/runescape-client/src/main/java/HealthBarDefinition.java index fcf4b88721..a7786293bd 100644 --- a/runescape-client/src/main/java/HealthBarDefinition.java +++ b/runescape-client/src/main/java/HealthBarDefinition.java @@ -4,89 +4,89 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ip") +@ObfuscatedName("il") @Implements("HealthBarDefinition") public class HealthBarDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("HealthBarDefinition_archive") public static AbstractArchive HealthBarDefinition_archive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("HitSplatDefinition_spritesArchive") - static AbstractArchive HitSplatDefinition_spritesArchive; - @ObfuscatedName("v") + public static AbstractArchive HitSplatDefinition_spritesArchive; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("HealthBarDefinition_cached") public static EvictingDualNodeHashTable HealthBarDefinition_cached; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("HealthBarDefinition_cachedSprites") public static EvictingDualNodeHashTable HealthBarDefinition_cachedSprites; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -2020710967 + intValue = 1067342333 ) - public int field3258; - @ObfuscatedName("m") + public int field3265; + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 2073172143 + intValue = 2032079417 ) @Export("int1") public int int1; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 1672807375 + intValue = -1420994465 ) @Export("int2") public int int2; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -1245763213 + intValue = -601170319 ) @Export("int3") public int int3; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1160994935 + intValue = 1370340653 ) @Export("int4") public int int4; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -2056406209 + intValue = -197026089 ) @Export("int5") public int int5; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -1546985657 + intValue = -376766097 ) @Export("frontSpriteID") int frontSpriteID; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = -1484247529 + intValue = 1409027365 ) @Export("backSpriteID") int backSpriteID; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = 2061624127 + intValue = 1180776485 ) @Export("width") public int width; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 1482399655 + intValue = -975829671 ) @Export("widthPadding") public int widthPadding; @@ -108,10 +108,10 @@ public class HealthBarDefinition extends DualNode { this.widthPadding = 0; } - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-1504288957" + signature = "(Lkc;I)V", + garbageValue = "-276948452" ) @Export("decode") public void decode(Buffer var1) { @@ -125,10 +125,10 @@ public class HealthBarDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;IB)V", - garbageValue = "2" + signature = "(Lkc;II)V", + garbageValue = "431816555" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -145,9 +145,9 @@ public class HealthBarDefinition extends DualNode { } else if (var2 == 6) { var1.readUnsignedByte(); } else if (var2 == 7) { - this.frontSpriteID = var1.method5453(); + this.frontSpriteID = var1.method5638(); } else if (var2 == 8) { - this.backSpriteID = var1.method5453(); + this.backSpriteID = var1.method5638(); } else if (var2 == 11) { this.int3 = var1.readUnsignedShort(); } else if (var2 == 14) { @@ -158,10 +158,10 @@ public class HealthBarDefinition extends DualNode { } - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)Llf;", - garbageValue = "445043084" + signature = "(I)Llx;", + garbageValue = "-907904185" ) @Export("getFrontSprite") public Sprite getFrontSprite() { @@ -172,7 +172,7 @@ public class HealthBarDefinition extends DualNode { if (var1 != null) { return var1; } else { - var1 = NPCDefinition.SpriteBuffer_getSprite(HitSplatDefinition_spritesArchive, this.frontSpriteID, 0); + var1 = MenuAction.SpriteBuffer_getSprite(HitSplatDefinition_spritesArchive, this.frontSpriteID, 0); if (var1 != null) { HealthBarDefinition_cachedSprites.put(var1, (long)this.frontSpriteID); } @@ -182,10 +182,10 @@ public class HealthBarDefinition extends DualNode { } } - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(B)Llf;", - garbageValue = "-62" + signature = "(I)Llx;", + garbageValue = "1192801770" ) @Export("getBackSprite") public Sprite getBackSprite() { @@ -196,7 +196,7 @@ public class HealthBarDefinition extends DualNode { if (var1 != null) { return var1; } else { - var1 = NPCDefinition.SpriteBuffer_getSprite(HitSplatDefinition_spritesArchive, this.backSpriteID, 0); + var1 = MenuAction.SpriteBuffer_getSprite(HitSplatDefinition_spritesArchive, this.backSpriteID, 0); if (var1 != null) { HealthBarDefinition_cachedSprites.put(var1, (long)this.backSpriteID); } @@ -205,4 +205,71 @@ public class HealthBarDefinition extends DualNode { } } } + + @ObfuscatedName("ka") + @ObfuscatedSignature( + signature = "([Lhi;IB)V", + garbageValue = "-5" + ) + @Export("drawModelComponents") + static final void drawModelComponents(Widget[] var0, int var1) { + for (int var2 = 0; var2 < var0.length; ++var2) { + Widget var3 = var0[var2]; + if (var3 != null && var3.parentId == var1 && (!var3.isIf3 || !WorldMapManager.isComponentHidden(var3))) { + if (var3.type == 0) { + if (!var3.isIf3 && WorldMapManager.isComponentHidden(var3) && var3 != ChatChannel.mousedOverWidgetIf1) { + continue; + } + + drawModelComponents(var0, var3.id); + if (var3.children != null) { + drawModelComponents(var3.children, var3.id); + } + + InterfaceParent var4 = (InterfaceParent)Client.interfaceParents.get((long)var3.id); + if (var4 != null) { + AbstractWorldMapData.method326(var4.group); + } + } + + if (var3.type == 6) { + int var5; + if (var3.sequenceId != -1 || var3.sequenceId2 != -1) { + boolean var7 = SecureRandomCallable.runCs1(var3); + if (var7) { + var5 = var3.sequenceId2; + } else { + var5 = var3.sequenceId; + } + + if (var5 != -1) { + SequenceDefinition var6 = PlayerType.SequenceDefinition_get(var5); + + for (var3.modelFrameCycle += Client.field693; var3.modelFrameCycle > var6.frameLengths[var3.modelFrame]; GrandExchangeOfferAgeComparator.invalidateWidget(var3)) { + var3.modelFrameCycle -= var6.frameLengths[var3.modelFrame]; + ++var3.modelFrame; + if (var3.modelFrame >= var6.frameIds.length) { + var3.modelFrame -= var6.frameCount; + if (var3.modelFrame < 0 || var3.modelFrame >= var6.frameIds.length) { + var3.modelFrame = 0; + } + } + } + } + } + + if (var3.field2604 != 0 && !var3.isIf3) { + int var8 = var3.field2604 >> 16; + var5 = var3.field2604 << 16 >> 16; + var8 *= Client.field693; + var5 *= Client.field693; + var3.modelAngleX = var8 + var3.modelAngleX & 2047; + var3.modelAngleY = var5 + var3.modelAngleY & 2047; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + } + } + } + } + + } } diff --git a/runescape-client/src/main/java/HealthBarUpdate.java b/runescape-client/src/main/java/HealthBarUpdate.java index 4808e17910..18372427af 100644 --- a/runescape-client/src/main/java/HealthBarUpdate.java +++ b/runescape-client/src/main/java/HealthBarUpdate.java @@ -4,32 +4,30 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bq") +@ObfuscatedName("bo") @Implements("HealthBarUpdate") public class HealthBarUpdate extends Node { - @ObfuscatedName("f") - public static String field993; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 2051178983 + intValue = 2144411335 ) @Export("cycle") int cycle; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -670451385 + intValue = 1016663119 ) @Export("health") int health; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -326291957 + intValue = 487242031 ) @Export("health2") int health2; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -809927427 + intValue = 1175650203 ) @Export("cycleOffset") int cycleOffset; @@ -41,10 +39,10 @@ public class HealthBarUpdate extends Node { this.cycleOffset = var4; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(IIIII)V", - garbageValue = "1094969728" + garbageValue = "-287168900" ) @Export("set") void set(int var1, int var2, int var3, int var4) { @@ -54,110 +52,31 @@ public class HealthBarUpdate extends Node { this.cycleOffset = var4; } - @ObfuscatedName("v") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(III)Lbe;", - garbageValue = "776889337" + signature = "(III)I", + garbageValue = "212785133" ) - @Export("Messages_getByChannelAndID") - static Message Messages_getByChannelAndID(int var0, int var1) { - ChatChannel var2 = (ChatChannel)Messages.Messages_channels.get(var0); - return var2.getMessage(var1); - } - - @ObfuscatedName("ff") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "146894465" - ) - static final void method1769() { - for (int var0 = 0; var0 < Client.soundEffectCount; ++var0) { - int var10002 = Client.queuedSoundEffectDelays[var0]--; - if (Client.queuedSoundEffectDelays[var0] >= -10) { - SoundEffect var9 = Client.soundEffects[var0]; - if (var9 == null) { - Object var10000 = null; - var9 = SoundEffect.readSoundEffect(GrandExchangeOfferAgeComparator.archive4, Client.soundEffectIds[var0], 0); - if (var9 == null) { - continue; - } - - int[] var13 = Client.queuedSoundEffectDelays; - var13[var0] += var9.calculateDelay(); - Client.soundEffects[var0] = var9; - } - - if (Client.queuedSoundEffectDelays[var0] < 0) { - int var2; - if (Client.soundLocations[var0] != 0) { - int var3 = (Client.soundLocations[var0] & 255) * 128; - int var4 = Client.soundLocations[var0] >> 16 & 255; - int var5 = var4 * 128 + 64 - class223.localPlayer.x; - if (var5 < 0) { - var5 = -var5; - } - - int var6 = Client.soundLocations[var0] >> 8 & 255; - int var7 = var6 * 128 + 64 - class223.localPlayer.y; - if (var7 < 0) { - var7 = -var7; - } - - int var8 = var5 + var7 - 128; - if (var8 > var3) { - Client.queuedSoundEffectDelays[var0] = -100; - continue; - } - - if (var8 < 0) { - var8 = 0; - } - - var2 = (var3 - var8) * Client.field868 / var3; - } else { - var2 = Client.soundEffectVolume; - } - - if (var2 > 0) { - RawSound var10 = var9.toRawSound().resample(Interpreter.decimator); - RawPcmStream var11 = RawPcmStream.createRawPcmStream(var10, 100, var2); - var11.setNumLoops(Client.queuedSoundEffectLoops[var0] - 1); - WorldMapLabelSize.pcmStreamMixer.addSubStream(var11); - } - - Client.queuedSoundEffectDelays[var0] = -100; - } - } else { - --Client.soundEffectCount; - - for (int var1 = var0; var1 < Client.soundEffectCount; ++var1) { - Client.soundEffectIds[var1] = Client.soundEffectIds[var1 + 1]; - Client.soundEffects[var1] = Client.soundEffects[var1 + 1]; - Client.queuedSoundEffectLoops[var1] = Client.queuedSoundEffectLoops[var1 + 1]; - Client.queuedSoundEffectDelays[var1] = Client.queuedSoundEffectDelays[var1 + 1]; - Client.soundLocations[var1] = Client.soundLocations[var1 + 1]; - } - - --var0; + static final int method1880(int var0, int var1) { + if (var0 == -2) { + return 12345678; + } else if (var0 == -1) { + if (var1 < 2) { + var1 = 2; + } else if (var1 > 126) { + var1 = 126; } + + return var1; + } else { + var1 = (var0 & 127) * var1 / 128; + if (var1 < 2) { + var1 = 2; + } else if (var1 > 126) { + var1 = 126; + } + + return (var0 & 65408) + var1; } - - if (Client.field759) { - boolean var12; - if (class197.field2386 != 0) { - var12 = true; - } else { - var12 = class49.midiPcmStream.isReady(); - } - - if (!var12) { - if (Client.field761 != 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, Client.field761, false); - } - - Client.field759 = false; - } - } - } } diff --git a/runescape-client/src/main/java/HitSplatDefinition.java b/runescape-client/src/main/java/HitSplatDefinition.java index 3bbef39440..cb426b1874 100644 --- a/runescape-client/src/main/java/HitSplatDefinition.java +++ b/runescape-client/src/main/java/HitSplatDefinition.java @@ -4,121 +4,114 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("iv") +@ObfuscatedName("ii") @Implements("HitSplatDefinition") public class HitSplatDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("HitSplatDefinition_archive") - public static AbstractArchive HitSplatDefinition_archive; - @ObfuscatedName("v") + static AbstractArchive HitSplatDefinition_archive; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) - @Export("HitSplatDefinition_fontsArchive") - static AbstractArchive HitSplatDefinition_fontsArchive; - @ObfuscatedName("u") + static AbstractArchive field3316; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("HitSplatDefinition_cached") public static EvictingDualNodeHashTable HitSplatDefinition_cached; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("HitSplatDefinition_cachedSprites") - static EvictingDualNodeHashTable HitSplatDefinition_cachedSprites; - @ObfuscatedName("p") + public static EvictingDualNodeHashTable HitSplatDefinition_cachedSprites; + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("HitSplatDefinition_cachedFonts") - static EvictingDualNodeHashTable HitSplatDefinition_cachedFonts; - @ObfuscatedName("es") + public static EvictingDualNodeHashTable HitSplatDefinition_cachedFonts; + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 290330035 - ) - @Export("port1") - static int port1; - @ObfuscatedName("b") - @ObfuscatedGetter( - intValue = -135266261 + intValue = 941598511 ) @Export("fontId") int fontId; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -296610035 + intValue = -697129173 ) @Export("textColor") public int textColor; - @ObfuscatedName("a") - @ObfuscatedGetter( - intValue = 31719475 - ) - public int field3318; - @ObfuscatedName("e") - @ObfuscatedGetter( - intValue = -1509097345 - ) - int field3319; - @ObfuscatedName("w") - @ObfuscatedGetter( - intValue = -591877115 - ) - int field3332; - @ObfuscatedName("t") - @ObfuscatedGetter( - intValue = -2011301745 - ) - int field3321; - @ObfuscatedName("g") - @ObfuscatedGetter( - intValue = 1974829897 - ) - int field3322; - @ObfuscatedName("x") - @ObfuscatedGetter( - intValue = -87931297 - ) - public int field3323; - @ObfuscatedName("h") - @ObfuscatedGetter( - intValue = -577071813 - ) - public int field3311; - @ObfuscatedName("s") - @ObfuscatedGetter( - intValue = -1569661547 - ) - public int field3325; - @ObfuscatedName("f") - String field3316; - @ObfuscatedName("j") - @ObfuscatedGetter( - intValue = 1618086973 - ) - public int field3327; - @ObfuscatedName("d") - @ObfuscatedGetter( - intValue = 1970000523 - ) - public int field3334; - @ObfuscatedName("l") - @Export("transforms") - public int[] transforms; @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 354517383 + intValue = 2098099547 + ) + public int field3314; + @ObfuscatedName("x") + @ObfuscatedGetter( + intValue = 1587744329 + ) + int field3321; + @ObfuscatedName("j") + @ObfuscatedGetter( + intValue = -559813503 + ) + int field3320; + @ObfuscatedName("r") + @ObfuscatedGetter( + intValue = 1664346501 + ) + int field3323; + @ObfuscatedName("e") + @ObfuscatedGetter( + intValue = -798419301 + ) + int field3325; + @ObfuscatedName("s") + @ObfuscatedGetter( + intValue = 1377626099 + ) + public int field3329; + @ObfuscatedName("b") + @ObfuscatedGetter( + intValue = -1078350425 + ) + public int field3315; + @ObfuscatedName("z") + @ObfuscatedGetter( + intValue = -328060003 + ) + public int field3327; + @ObfuscatedName("f") + String field3328; + @ObfuscatedName("g") + @ObfuscatedGetter( + intValue = 1213073095 + ) + public int field3313; + @ObfuscatedName("w") + @ObfuscatedGetter( + intValue = 1353538745 + ) + public int field3330; + @ObfuscatedName("u") + @Export("transforms") + public int[] transforms; + @ObfuscatedName("y") + @ObfuscatedGetter( + intValue = 1124290535 ) @Export("transformVarbit") int transformVarbit; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @ObfuscatedGetter( - intValue = -168749029 + intValue = 1541441781 ) @Export("transformVarp") int transformVarp; @@ -129,31 +122,31 @@ public class HitSplatDefinition extends DualNode { HitSplatDefinition_cachedFonts = new EvictingDualNodeHashTable(20); } - public HitSplatDefinition() { + HitSplatDefinition() { this.fontId = -1; this.textColor = 16777215; - this.field3318 = 70; - this.field3319 = -1; - this.field3332 = -1; + this.field3314 = 70; this.field3321 = -1; - this.field3322 = -1; - this.field3323 = 0; - this.field3311 = 0; + this.field3320 = -1; + this.field3323 = -1; this.field3325 = -1; - this.field3316 = ""; + this.field3329 = 0; + this.field3315 = 0; this.field3327 = -1; - this.field3334 = 0; + this.field3328 = ""; + this.field3313 = -1; + this.field3330 = 0; this.transformVarbit = -1; this.transformVarp = -1; } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-110" + signature = "(Lkc;I)V", + garbageValue = "1697924004" ) @Export("decode") - public void decode(Buffer var1) { + void decode(Buffer var1) { while (true) { int var2 = var1.readUnsignedByte(); if (var2 == 0) { @@ -164,41 +157,41 @@ public class HitSplatDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "1800631473" + signature = "(Lkc;II)V", + garbageValue = "149354669" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { if (var2 == 1) { - this.fontId = var1.method5453(); + this.fontId = var1.method5638(); } else if (var2 == 2) { this.textColor = var1.readMedium(); } else if (var2 == 3) { - this.field3319 = var1.method5453(); + this.field3321 = var1.method5638(); } else if (var2 == 4) { - this.field3321 = var1.method5453(); + this.field3323 = var1.method5638(); } else if (var2 == 5) { - this.field3332 = var1.method5453(); + this.field3320 = var1.method5638(); } else if (var2 == 6) { - this.field3322 = var1.method5453(); + this.field3325 = var1.method5638(); } else if (var2 == 7) { - this.field3323 = var1.readShort(); + this.field3329 = var1.readShort(); } else if (var2 == 8) { - this.field3316 = var1.readStringCp1252NullCircumfixed(); + this.field3328 = var1.readStringCp1252NullCircumfixed(); } else if (var2 == 9) { - this.field3318 = var1.readUnsignedShort(); + this.field3314 = var1.readUnsignedShort(); } else if (var2 == 10) { - this.field3311 = var1.readShort(); + this.field3315 = var1.readShort(); } else if (var2 == 11) { - this.field3325 = 0; + this.field3327 = 0; } else if (var2 == 12) { - this.field3327 = var1.readUnsignedByte(); + this.field3313 = var1.readUnsignedByte(); } else if (var2 == 13) { - this.field3334 = var1.readShort(); + this.field3330 = var1.readShort(); } else if (var2 == 14) { - this.field3325 = var1.readUnsignedShort(); + this.field3327 = var1.readUnsignedShort(); } else if (var2 == 17 || var2 == 18) { this.transformVarbit = var1.readUnsignedShort(); if (this.transformVarbit == 65535) { @@ -233,16 +226,16 @@ public class HitSplatDefinition extends DualNode { } - @ObfuscatedName("u") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(I)Liv;", - garbageValue = "723685" + signature = "(B)Lii;", + garbageValue = "-47" ) @Export("transform") public final HitSplatDefinition transform() { int var1 = -1; if (this.transformVarbit != -1) { - var1 = WorldMapSprite.getVarbit(this.transformVarbit); + var1 = UserComparator9.getVarbit(this.transformVarbit); } else if (this.transformVarp != -1) { var1 = Varps.Varps_main[this.transformVarp]; } @@ -254,36 +247,17 @@ public class HitSplatDefinition extends DualNode { var2 = this.transforms[this.transforms.length - 1]; } - if (var2 != -1) { - HitSplatDefinition var4 = (HitSplatDefinition)HitSplatDefinition_cached.get((long)var2); - HitSplatDefinition var3; - if (var4 != null) { - var3 = var4; - } else { - byte[] var5 = HitSplatDefinition_archive.takeFile(32, var2); - var4 = new HitSplatDefinition(); - if (var5 != null) { - var4.decode(new Buffer(var5)); - } - - HitSplatDefinition_cached.put(var4, (long)var2); - var3 = var4; - } - - return var3; - } else { - return null; - } + return var2 != -1 ? NetFileRequest.method4298(var2) : null; } - @ObfuscatedName("r") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IB)Ljava/lang/String;", - garbageValue = "13" + signature = "(II)Ljava/lang/String;", + garbageValue = "-121756337" ) @Export("getString") public String getString(int var1) { - String var2 = this.field3316; + String var2 = this.field3328; while (true) { int var3 = var2.indexOf("%1"); @@ -291,62 +265,16 @@ public class HitSplatDefinition extends DualNode { return var2; } - var2 = var2.substring(0, var3) + HealthBar.intToString(var1, false) + var2.substring(var3 + 2); + var2 = var2.substring(0, var3) + WorldMapData_0.intToString(var1, false) + var2.substring(var3 + 2); } } - @ObfuscatedName("p") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(I)Llf;", - garbageValue = "106816510" + signature = "(I)Llx;", + garbageValue = "1012145117" ) - public Sprite method4520() { - if (this.field3319 < 0) { - return null; - } else { - Sprite var1 = (Sprite)HitSplatDefinition_cachedSprites.get((long)this.field3319); - if (var1 != null) { - return var1; - } else { - var1 = NPCDefinition.SpriteBuffer_getSprite(GrandExchangeOfferNameComparator.field66, this.field3319, 0); - if (var1 != null) { - HitSplatDefinition_cachedSprites.put(var1, (long)this.field3319); - } - - return var1; - } - } - } - - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(I)Llf;", - garbageValue = "-123360505" - ) - public Sprite method4517() { - if (this.field3332 < 0) { - return null; - } else { - Sprite var1 = (Sprite)HitSplatDefinition_cachedSprites.get((long)this.field3332); - if (var1 != null) { - return var1; - } else { - var1 = NPCDefinition.SpriteBuffer_getSprite(GrandExchangeOfferNameComparator.field66, this.field3332, 0); - if (var1 != null) { - HitSplatDefinition_cachedSprites.put(var1, (long)this.field3332); - } - - return var1; - } - } - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(B)Llf;", - garbageValue = "88" - ) - public Sprite method4518() { + public Sprite method4719() { if (this.field3321 < 0) { return null; } else { @@ -354,7 +282,7 @@ public class HitSplatDefinition extends DualNode { if (var1 != null) { return var1; } else { - var1 = NPCDefinition.SpriteBuffer_getSprite(GrandExchangeOfferNameComparator.field66, this.field3321, 0); + var1 = MenuAction.SpriteBuffer_getSprite(field3316, this.field3321, 0); if (var1 != null) { HitSplatDefinition_cachedSprites.put(var1, (long)this.field3321); } @@ -364,22 +292,22 @@ public class HitSplatDefinition extends DualNode { } } - @ObfuscatedName("y") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(I)Llf;", - garbageValue = "750571201" + signature = "(B)Llx;", + garbageValue = "-59" ) - public Sprite method4542() { - if (this.field3322 < 0) { + public Sprite method4709() { + if (this.field3320 < 0) { return null; } else { - Sprite var1 = (Sprite)HitSplatDefinition_cachedSprites.get((long)this.field3322); + Sprite var1 = (Sprite)HitSplatDefinition_cachedSprites.get((long)this.field3320); if (var1 != null) { return var1; } else { - var1 = NPCDefinition.SpriteBuffer_getSprite(GrandExchangeOfferNameComparator.field66, this.field3322, 0); + var1 = MenuAction.SpriteBuffer_getSprite(field3316, this.field3320, 0); if (var1 != null) { - HitSplatDefinition_cachedSprites.put(var1, (long)this.field3322); + HitSplatDefinition_cachedSprites.put(var1, (long)this.field3320); } return var1; @@ -389,8 +317,54 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Lkn;", - garbageValue = "-1418238828" + signature = "(I)Llx;", + garbageValue = "477012988" + ) + public Sprite method4710() { + if (this.field3323 < 0) { + return null; + } else { + Sprite var1 = (Sprite)HitSplatDefinition_cachedSprites.get((long)this.field3323); + if (var1 != null) { + return var1; + } else { + var1 = MenuAction.SpriteBuffer_getSprite(field3316, this.field3323, 0); + if (var1 != null) { + HitSplatDefinition_cachedSprites.put(var1, (long)this.field3323); + } + + return var1; + } + } + } + + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "(I)Llx;", + garbageValue = "-1187157829" + ) + public Sprite method4731() { + if (this.field3325 < 0) { + return null; + } else { + Sprite var1 = (Sprite)HitSplatDefinition_cachedSprites.get((long)this.field3325); + if (var1 != null) { + return var1; + } else { + var1 = MenuAction.SpriteBuffer_getSprite(field3316, this.field3325, 0); + if (var1 != null) { + HitSplatDefinition_cachedSprites.put(var1, (long)this.field3325); + } + + return var1; + } + } + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(B)Lks;", + garbageValue = "0" ) @Export("getFont") public Font getFont() { @@ -401,7 +375,7 @@ public class HitSplatDefinition extends DualNode { if (var1 != null) { return var1; } else { - var1 = ClanMate.method4976(GrandExchangeOfferNameComparator.field66, HitSplatDefinition_fontsArchive, this.fontId, 0); + var1 = class269.method5114(field3316, class2.HitSplatDefinition_fontsArchive, this.fontId, 0); if (var1 != null) { HitSplatDefinition_cachedFonts.put(var1, (long)this.fontId); } @@ -410,4 +384,170 @@ public class HitSplatDefinition extends DualNode { } } } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "10408118" + ) + @Export("savePreferences") + static void savePreferences() { + AccessFile var0 = null; + + try { + var0 = CollisionMap.getPreferencesFile("", MouseHandler.field458.name, true); + Buffer var1 = ScriptEvent.clientPreferences.toBuffer(); + var0.write(var1.array, 0, var1.offset); + } catch (Exception var3) { + } + + try { + if (var0 != null) { + var0.closeSync(true); + } + } catch (Exception var2) { + } + + } + + @ObfuscatedName("gw") + @ObfuscatedSignature( + signature = "(Lbz;IB)V", + garbageValue = "-26" + ) + @Export("calculateActorPosition") + static final void calculateActorPosition(Actor var0, int var1) { + int var2; + if (var0.field925 > Client.cycle) { + WorldMapDecoration.method386(var0); + } else if (var0.field971 >= Client.cycle) { + if (var0.field971 == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > PlayerType.SequenceDefinition_get(var0.sequence).frameLengths[var0.sequenceFrame]) { + var2 = var0.field971 - var0.field925; + int var3 = Client.cycle - var0.field925; + int var4 = var0.field966 * 128 + var0.field927 * 64; + int var5 = var0.field979 * 128 + var0.field927 * 64; + int var6 = var0.field967 * 128 + var0.field927 * 64; + int var7 = var0.field969 * 128 + var0.field927 * 64; + var0.x = (var6 * var3 + var4 * (var2 - var3)) / var2; + var0.y = (var3 * var7 + var5 * (var2 - var3)) / var2; + } + + var0.field982 = 0; + var0.orientation = var0.field972; + var0.rotation = var0.orientation; + } else { + ModelData0.method3377(var0); + } + + if (var0.x < 128 || var0.y < 128 || var0.x >= 13184 || var0.y >= 13184) { + var0.sequence = -1; + var0.spotAnimation = -1; + var0.field925 = 0; + var0.field971 = 0; + var0.x = var0.pathX[0] * 128 + var0.field927 * 64; + var0.y = var0.pathY[0] * 128 + var0.field927 * 64; + var0.method1862(); + } + + if (class215.localPlayer == var0 && (var0.x < 1536 || var0.y < 1536 || var0.x >= 11776 || var0.y >= 11776)) { + var0.sequence = -1; + var0.spotAnimation = -1; + var0.field925 = 0; + var0.field971 = 0; + var0.x = var0.pathX[0] * 128 + var0.field927 * 64; + var0.y = var0.pathY[0] * 128 + var0.field927 * 64; + var0.method1862(); + } + + Actor.method1873(var0); + var0.isWalking = false; + SequenceDefinition var8; + if (var0.movementSequence != -1) { + var8 = PlayerType.SequenceDefinition_get(var0.movementSequence); + if (var8 != null && var8.frameIds != null) { + ++var0.movementFrameCycle; + if (var0.movementFrame < var8.frameIds.length && var0.movementFrameCycle > var8.frameLengths[var0.movementFrame]) { + var0.movementFrameCycle = 1; + ++var0.movementFrame; + Tile.addSequenceSoundEffect(var8, var0.movementFrame, var0.x, var0.y); + } + + if (var0.movementFrame >= var8.frameIds.length) { + var0.movementFrameCycle = 0; + var0.movementFrame = 0; + Tile.addSequenceSoundEffect(var8, var0.movementFrame, var0.x, var0.y); + } + } else { + var0.movementSequence = -1; + } + } + + if (var0.spotAnimation != -1 && Client.cycle >= var0.field973) { + if (var0.spotAnimationFrame < 0) { + var0.spotAnimationFrame = 0; + } + + var2 = MenuAction.SpotAnimationDefinition_get(var0.spotAnimation).sequence; + if (var2 != -1) { + SequenceDefinition var9 = PlayerType.SequenceDefinition_get(var2); + if (var9 != null && var9.frameIds != null) { + ++var0.spotAnimationFrameCycle; + if (var0.spotAnimationFrame < var9.frameIds.length && var0.spotAnimationFrameCycle > var9.frameLengths[var0.spotAnimationFrame]) { + var0.spotAnimationFrameCycle = 1; + ++var0.spotAnimationFrame; + Tile.addSequenceSoundEffect(var9, var0.spotAnimationFrame, var0.x, var0.y); + } + + if (var0.spotAnimationFrame >= var9.frameIds.length && (var0.spotAnimationFrame < 0 || var0.spotAnimationFrame >= var9.frameIds.length)) { + var0.spotAnimation = -1; + } + } else { + var0.spotAnimation = -1; + } + } else { + var0.spotAnimation = -1; + } + } + + if (var0.sequence != -1 && var0.sequenceDelay <= 1) { + var8 = PlayerType.SequenceDefinition_get(var0.sequence); + if (var8.field3504 == 1 && var0.field983 > 0 && var0.field925 <= Client.cycle && var0.field971 < Client.cycle) { + var0.sequenceDelay = 1; + return; + } + } + + if (var0.sequence != -1 && var0.sequenceDelay == 0) { + var8 = PlayerType.SequenceDefinition_get(var0.sequence); + if (var8 != null && var8.frameIds != null) { + ++var0.sequenceFrameCycle; + if (var0.sequenceFrame < var8.frameIds.length && var0.sequenceFrameCycle > var8.frameLengths[var0.sequenceFrame]) { + var0.sequenceFrameCycle = 1; + ++var0.sequenceFrame; + Tile.addSequenceSoundEffect(var8, var0.sequenceFrame, var0.x, var0.y); + } + + if (var0.sequenceFrame >= var8.frameIds.length) { + var0.sequenceFrame -= var8.frameCount; + ++var0.field960; + if (var0.field960 >= var8.field3518) { + var0.sequence = -1; + } else if (var0.sequenceFrame >= 0 && var0.sequenceFrame < var8.frameIds.length) { + Tile.addSequenceSoundEffect(var8, var0.sequenceFrame, var0.x, var0.y); + } else { + var0.sequence = -1; + } + } + + var0.isWalking = var8.field3514; + } else { + var0.sequence = -1; + } + } + + if (var0.sequenceDelay > 0) { + --var0.sequenceDelay; + } + + } } diff --git a/runescape-client/src/main/java/HorizontalAlignment.java b/runescape-client/src/main/java/HorizontalAlignment.java index 55e5ec8aae..428e5f4e46 100644 --- a/runescape-client/src/main/java/HorizontalAlignment.java +++ b/runescape-client/src/main/java/HorizontalAlignment.java @@ -7,34 +7,35 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("in") @Implements("HorizontalAlignment") public enum HorizontalAlignment implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lin;" ) - field3444(1, 0), - @ObfuscatedName("n") + field3449(0, 0), + @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lin;" ) @Export("HorizontalAlignment_centered") - HorizontalAlignment_centered(2, 1), - @ObfuscatedName("v") + HorizontalAlignment_centered(1, 1), + @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lin;" ) - field3442(0, 2); + field3447(2, 2); + @ObfuscatedName("i") + @Export("ByteArrayPool_arrays") + static byte[][][] ByteArrayPool_arrays; @ObfuscatedName("q") - public static short[] field3447; - @ObfuscatedName("u") @ObfuscatedGetter( - intValue = 87636045 + intValue = 1143014811 ) @Export("value") public final int value; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1916297519 + intValue = -510132141 ) @Export("id") final int id; @@ -44,10 +45,10 @@ public enum HorizontalAlignment implements Enumerated { this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { diff --git a/runescape-client/src/main/java/Huffman.java b/runescape-client/src/main/java/Huffman.java index 68ec50b54a..8fa9a194b6 100644 --- a/runescape-client/src/main/java/Huffman.java +++ b/runescape-client/src/main/java/Huffman.java @@ -1,18 +1,24 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ht") +@ObfuscatedName("hx") @Implements("Huffman") public class Huffman { - @ObfuscatedName("z") + @ObfuscatedName("as") + @ObfuscatedGetter( + intValue = 821038913 + ) + static int field2491; + @ObfuscatedName("a") @Export("masks") int[] masks; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("bits") byte[] bits; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("keys") int[] keys; @@ -41,7 +47,7 @@ public class Huffman { for (var10 = var6 - 1; var10 >= 1; --var10) { var11 = var3[var10]; - if (var8 != var11) { + if (var11 != var8) { break; } @@ -99,10 +105,10 @@ public class Huffman { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([BII[BII)I", - garbageValue = "2067037926" + signature = "([BII[BIB)I", + garbageValue = "14" ) @Export("compress") int compress(byte[] var1, int var2, int var3, byte[] var4, int var5) { @@ -120,7 +126,7 @@ public class Huffman { int var11 = var7 >> 3; int var12 = var7 & 7; var6 &= -var12 >> 31; - int var13 = (var12 + var10 - 1 >> 3) + var11; + int var13 = (var10 + var12 - 1 >> 3) + var11; var12 += 24; var4[var11] = (byte)(var6 |= var9 >>> var12); if (var11 < var13) { @@ -150,10 +156,10 @@ public class Huffman { return (var7 + 7 >> 3) - var5; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "([BI[BIII)I", - garbageValue = "98933619" + signature = "([BI[BIIB)I", + garbageValue = "-1" ) @Export("decompress") int decompress(byte[] var1, int var2, byte[] var3, int var4, int var5) { @@ -293,4 +299,26 @@ public class Huffman { return var7 + 1 - var2; } } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "([I[II)V", + garbageValue = "1107408934" + ) + public static void method4104(int[] var0, int[] var1) { + if (var0 != null && var1 != null) { + ByteArrayPool.ByteArrayPool_alternativeSizes = var0; + class222.ByteArrayPool_altSizeArrayCounts = new int[var0.length]; + HorizontalAlignment.ByteArrayPool_arrays = new byte[var0.length][][]; + + for (int var2 = 0; var2 < ByteArrayPool.ByteArrayPool_alternativeSizes.length; ++var2) { + HorizontalAlignment.ByteArrayPool_arrays[var2] = new byte[var1[var2]][]; + } + + } else { + ByteArrayPool.ByteArrayPool_alternativeSizes = null; + class222.ByteArrayPool_altSizeArrayCounts = null; + HorizontalAlignment.ByteArrayPool_arrays = null; + } + } } diff --git a/runescape-client/src/main/java/IgnoreList.java b/runescape-client/src/main/java/IgnoreList.java index 5f2c14d882..3642668efe 100644 --- a/runescape-client/src/main/java/IgnoreList.java +++ b/runescape-client/src/main/java/IgnoreList.java @@ -4,54 +4,54 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jw") +@ObfuscatedName("je") @Implements("IgnoreList") public class IgnoreList extends UserList { - @ObfuscatedName("hg") + @ObfuscatedName("hr") @ObfuscatedGetter( - intValue = 1294899127 + intValue = 1673577413 ) - @Export("cameraPitch") - static int cameraPitch; - @ObfuscatedName("v") + @Export("oculusOrbFocalPointX") + static int oculusOrbFocalPointX; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) @Export("loginType") final LoginType loginType; @ObfuscatedSignature( - signature = "(Lli;)V" + signature = "(Lln;)V" ) public IgnoreList(LoginType var1) { super(400); this.loginType = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)Ljh;", - garbageValue = "2" + signature = "(I)Ljg;", + garbageValue = "-706396611" ) @Export("newInstance") User newInstance() { return new Ignored(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)[Ljh;", - garbageValue = "951526901" + signature = "(II)[Ljg;", + garbageValue = "1510983955" ) @Export("newTypedArray") User[] newTypedArray(int var1) { return new Ignored[var1]; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;IB)V", - garbageValue = "30" + signature = "(Lkc;IB)V", + garbageValue = "24" ) @Export("read") public void read(Buffer var1, int var2) { @@ -94,4 +94,635 @@ public class IgnoreList extends UserList { return; } } + + @ObfuscatedName("ja") + @ObfuscatedSignature( + signature = "([Lhi;IIIIIIIII)V", + garbageValue = "-564117353" + ) + @Export("drawInterface") + static final void drawInterface(Widget[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); + Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); + + for (int var9 = 0; var9 < var0.length; ++var9) { + Widget var10 = var0[var9]; + if (var10 != null && (var10.parentId == var1 || var1 == -1412584499 && var10 == Client.clickedWidget)) { + int var11; + if (var8 == -1) { + Client.rootWidgetXs[Client.rootWidgetCount] = var10.x + var6; + Client.rootWidgetYs[Client.rootWidgetCount] = var7 + var10.y; + Client.rootWidgetWidths[Client.rootWidgetCount] = var10.width; + Client.rootWidgetHeights[Client.rootWidgetCount] = var10.height; + var11 = ++Client.rootWidgetCount - 1; + } else { + var11 = var8; + } + + var10.rootIndex = var11; + var10.cycle = Client.cycle; + if (!var10.isIf3 || !WorldMapManager.isComponentHidden(var10)) { + if (var10.contentType > 0) { + ArchiveDiskAction.method4297(var10); + } + + int var12 = var10.x + var6; + int var13 = var7 + var10.y; + int var14 = var10.transparencyTop; + int var15; + int var16; + if (var10 == Client.clickedWidget) { + if (var1 != -1412584499 && !var10.isScrollBar) { + VarcInt.field3218 = var0; + TriBool.field3600 = var6; + GrandExchangeEvent.field46 = var7; + continue; + } + + if (Client.isDraggingWidget && Client.field809) { + var15 = MouseHandler.MouseHandler_x; + var16 = MouseHandler.MouseHandler_y; + var15 -= Client.widgetClickX; + var16 -= Client.widgetClickY; + if (var15 < Client.field748) { + var15 = Client.field748; + } + + if (var15 + var10.width > Client.field748 + Client.clickedWidgetParent.width) { + var15 = Client.field748 + Client.clickedWidgetParent.width - var10.width; + } + + if (var16 < Client.field751) { + var16 = Client.field751; + } + + if (var16 + var10.height > Client.field751 + Client.clickedWidgetParent.height) { + var16 = Client.field751 + Client.clickedWidgetParent.height - var10.height; + } + + var12 = var15; + var13 = var16; + } + + if (!var10.isScrollBar) { + var14 = 128; + } + } + + int var17; + int var18; + int var19; + int var20; + int var21; + int var22; + if (var10.type == 2) { + var15 = var2; + var16 = var3; + var17 = var4; + var18 = var5; + } else if (var10.type == 9) { + var19 = var12; + var20 = var13; + var21 = var12 + var10.width; + var22 = var13 + var10.height; + if (var21 < var12) { + var19 = var21; + var21 = var12; + } + + if (var22 < var13) { + var20 = var22; + var22 = var13; + } + + ++var21; + ++var22; + var15 = var19 > var2 ? var19 : var2; + var16 = var20 > var3 ? var20 : var3; + var17 = var21 < var4 ? var21 : var4; + var18 = var22 < var5 ? var22 : var5; + } else { + var19 = var12 + var10.width; + var20 = var13 + var10.height; + var15 = var12 > var2 ? var12 : var2; + var16 = var13 > var3 ? var13 : var3; + var17 = var19 < var4 ? var19 : var4; + var18 = var20 < var5 ? var20 : var5; + } + + if (!var10.isIf3 || var15 < var17 && var16 < var18) { + if (var10.contentType != 0) { + if (var10.contentType == 1336) { + if (Client.displayFps) { + var13 += 15; + ArchiveDiskActionHandler.fontPlain12.drawRightAligned("Fps:" + GameShell.fps, var12 + var10.width, var13, 16776960, -1); + var13 += 15; + Runtime var41 = Runtime.getRuntime(); + var20 = (int)((var41.totalMemory() - var41.freeMemory()) / 1024L); + var21 = 16776960; + if (var20 > 327680 && !Client.isLowDetail) { + var21 = 16711680; + } + + ArchiveDiskActionHandler.fontPlain12.drawRightAligned("Mem:" + var20 + "k", var12 + var10.width, var13, var21, -1); + var13 += 15; + } + continue; + } + + if (var10.contentType == 1337) { + Client.viewportX = var12; + Client.viewportY = var13; + WallDecoration.drawEntities(var12, var13, var10.width, var10.height); + Client.field842[var10.rootIndex] = true; + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); + continue; + } + + if (var10.contentType == 1338) { + class4.drawMinimap(var10, var12, var13, var11); + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); + continue; + } + + if (var10.contentType == 1339) { + PlayerType.drawCompass(var10, var12, var13, var11); + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); + continue; + } + + if (var10.contentType == 1400) { + Login.worldMap.draw(var12, var13, var10.width, var10.height, Client.cycle); + } + + if (var10.contentType == 1401) { + Login.worldMap.drawOverview(var12, var13, var10.width, var10.height); + } + + if (var10.contentType == 1402) { + Login.loginScreenRunesAnimation.draw(var12, Client.cycle); + } + } + + if (var10.type == 0) { + if (!var10.isIf3 && WorldMapManager.isComponentHidden(var10) && var10 != ChatChannel.mousedOverWidgetIf1) { + continue; + } + + if (!var10.isIf3) { + if (var10.scrollY > var10.scrollHeight - var10.height) { + var10.scrollY = var10.scrollHeight - var10.height; + } + + if (var10.scrollY < 0) { + var10.scrollY = 0; + } + } + + drawInterface(var0, var10.id, var15, var16, var17, var18, var12 - var10.scrollX, var13 - var10.scrollY, var11); + if (var10.children != null) { + drawInterface(var10.children, var10.id, var15, var16, var17, var18, var12 - var10.scrollX, var13 - var10.scrollY, var11); + } + + InterfaceParent var30 = (InterfaceParent)Client.interfaceParents.get((long)var10.id); + if (var30 != null) { + ScriptEvent.drawWidgets(var30.group, var15, var16, var17, var18, var12, var13, var11); + } + + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); + Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); + } + + if (Client.isResizable || Client.field631[var11] || Client.gameDrawingMode > 1) { + if (var10.type == 0 && !var10.isIf3 && var10.scrollHeight > var10.height) { + ArchiveLoader.drawScrollBar(var12 + var10.width, var13, var10.scrollY, var10.height, var10.scrollHeight); + } + + if (var10.type != 1) { + int var23; + int var24; + int var25; + int var26; + if (var10.type == 2) { + var19 = 0; + + for (var20 = 0; var20 < var10.rawHeight; ++var20) { + for (var21 = 0; var21 < var10.rawWidth; ++var21) { + var22 = var12 + var21 * (var10.paddingX + 32); + var23 = var13 + var20 * (var10.paddingY + 32); + if (var19 < 20) { + var22 += var10.inventoryXOffsets[var19]; + var23 += var10.inventoryYOffsets[var19]; + } + + if (var10.itemIds[var19] <= 0) { + if (var10.inventorySprites != null && var19 < 20) { + Sprite var43 = var10.getInventorySprite(var19); + if (var43 != null) { + var43.drawTransBgAt(var22, var23); + } else if (Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } + } else { + boolean var37 = false; + boolean var38 = false; + var26 = var10.itemIds[var19] - 1; + if (var22 + 32 > var2 && var22 < var4 && var23 + 32 > var3 && var23 < var5 || var10 == GrandExchangeOffer.dragInventoryWidget && var19 == Client.dragItemSlotSource) { + Sprite var27; + if (Client.isItemSelected == 1 && var19 == MouseRecorder.selectedItemSlot && var10.id == MidiPcmStream.selectedItemWidget) { + var27 = ScriptEvent.getItemSprite(var26, var10.itemQuantities[var19], 2, 0, 2, false); + } else { + var27 = ScriptEvent.getItemSprite(var26, var10.itemQuantities[var19], 1, 3153952, 2, false); + } + + if (var27 != null) { + if (var10 == GrandExchangeOffer.dragInventoryWidget && var19 == Client.dragItemSlotSource) { + var24 = MouseHandler.MouseHandler_x - Client.field729; + var25 = MouseHandler.MouseHandler_y - Client.field741; + if (var24 < 5 && var24 > -5) { + var24 = 0; + } + + if (var25 < 5 && var25 > -5) { + var25 = 0; + } + + if (Client.itemDragDuration < 5) { + var24 = 0; + var25 = 0; + } + + var27.drawTransAt(var24 + var22, var25 + var23, 128); + if (var1 != -1) { + Widget var28 = var0[var1 & 65535]; + int var29; + if (var25 + var23 < Rasterizer2D.Rasterizer2D_yClipStart && var28.scrollY > 0) { + var29 = (Rasterizer2D.Rasterizer2D_yClipStart - var23 - var25) * Client.field693 / 3; + if (var29 > Client.field693 * 10) { + var29 = Client.field693 * 10; + } + + if (var29 > var28.scrollY) { + var29 = var28.scrollY; + } + + var28.scrollY -= var29; + Client.field741 += var29; + GrandExchangeOfferAgeComparator.invalidateWidget(var28); + } + + if (var25 + var23 + 32 > Rasterizer2D.Rasterizer2D_yClipEnd && var28.scrollY < var28.scrollHeight - var28.height) { + var29 = (var23 + var25 + 32 - Rasterizer2D.Rasterizer2D_yClipEnd) * Client.field693 / 3; + if (var29 > Client.field693 * 10) { + var29 = Client.field693 * 10; + } + + if (var29 > var28.scrollHeight - var28.height - var28.scrollY) { + var29 = var28.scrollHeight - var28.height - var28.scrollY; + } + + var28.scrollY += var29; + Client.field741 -= var29; + GrandExchangeOfferAgeComparator.invalidateWidget(var28); + } + } + } else if (var10 == Login.field1165 && var19 == Client.field665) { + var27.drawTransAt(var22, var23, 128); + } else { + var27.drawTransBgAt(var22, var23); + } + } else { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } + } + + ++var19; + } + } + } else if (var10.type == 3) { + if (SecureRandomCallable.runCs1(var10)) { + var19 = var10.color2; + if (var10 == ChatChannel.mousedOverWidgetIf1 && var10.mouseOverColor2 != 0) { + var19 = var10.mouseOverColor2; + } + } else { + var19 = var10.color; + if (var10 == ChatChannel.mousedOverWidgetIf1 && var10.mouseOverColor != 0) { + var19 = var10.mouseOverColor; + } + } + + if (var10.fill) { + switch(var10.fillMode.value) { + case 1: + Rasterizer2D.Rasterizer2D_fillRectangleGradient(var12, var13, var10.width, var10.height, var10.color, var10.color2); + break; + case 2: + Rasterizer2D.Rasterizer2D_fillRectangleGradientAlpha(var12, var13, var10.width, var10.height, var10.color, var10.color2, 255 - (var10.transparencyTop & 255), 255 - (var10.transparencyBot & 255)); + break; + default: + if (var14 == 0) { + Rasterizer2D.Rasterizer2D_fillRectangle(var12, var13, var10.width, var10.height, var19); + } else { + Rasterizer2D.Rasterizer2D_fillRectangleAlpha(var12, var13, var10.width, var10.height, var19, 256 - (var14 & 255)); + } + } + } else if (var14 == 0) { + Rasterizer2D.Rasterizer2D_drawRectangle(var12, var13, var10.width, var10.height, var19); + } else { + Rasterizer2D.Rasterizer2D_drawRectangleAlpha(var12, var13, var10.width, var10.height, var19, 256 - (var14 & 255)); + } + } else { + Font var39; + if (var10.type == 4) { + var39 = var10.getFont(); + if (var39 == null) { + if (Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } else { + String var45 = var10.text; + if (SecureRandomCallable.runCs1(var10)) { + var20 = var10.color2; + if (var10 == ChatChannel.mousedOverWidgetIf1 && var10.mouseOverColor2 != 0) { + var20 = var10.mouseOverColor2; + } + + if (var10.text2.length() > 0) { + var45 = var10.text2; + } + } else { + var20 = var10.color; + if (var10 == ChatChannel.mousedOverWidgetIf1 && var10.mouseOverColor != 0) { + var20 = var10.mouseOverColor; + } + } + + if (var10.isIf3 && var10.itemId != -1) { + ItemDefinition var46 = class222.ItemDefinition_get(var10.itemId); + var45 = var46.name; + if (var45 == null) { + var45 = "null"; + } + + if ((var46.isStackable == 1 || var10.itemQuantity != 1) && var10.itemQuantity != -1) { + var45 = AbstractArchive.colorStartTag(16748608) + var45 + "" + " " + 'x' + GrandExchangeOffer.formatItemStacks(var10.itemQuantity); + } + } + + if (var10 == Client.meslayerContinueWidget) { + var45 = "Please wait..."; + var20 = var10.color; + } + + if (!var10.isIf3) { + var45 = class335.method6661(var45, var10); + } + + var39.drawLines(var45, var12, var13, var10.width, var10.height, var20, var10.textShadowed ? 0 : -1, var10.textXAlignment, var10.textYAlignment, var10.textLineHeight); + } + } else if (var10.type == 5) { + Sprite var40; + if (!var10.isIf3) { + var40 = var10.getSprite(SecureRandomCallable.runCs1(var10)); + if (var40 != null) { + var40.drawTransBgAt(var12, var13); + } else if (Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } else { + if (var10.itemId != -1) { + var40 = ScriptEvent.getItemSprite(var10.itemId, var10.itemQuantity, var10.outline, var10.spriteShadow, var10.itemQuantityMode, false); + } else { + var40 = var10.getSprite(false); + } + + if (var40 == null) { + if (Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } else { + var20 = var40.width; + var21 = var40.height; + if (!var10.spriteTiling) { + var22 = var10.width * 4096 / var20; + if (var10.spriteAngle != 0) { + var40.method6266(var10.width / 2 + var12, var10.height / 2 + var13, var10.spriteAngle, var22); + } else if (var14 != 0) { + var40.drawTransScaledAt(var12, var13, var10.width, var10.height, 256 - (var14 & 255)); + } else if (var20 == var10.width && var21 == var10.height) { + var40.drawTransBgAt(var12, var13); + } else { + var40.drawScaledAt(var12, var13, var10.width, var10.height); + } + } else { + Rasterizer2D.Rasterizer2D_expandClip(var12, var13, var12 + var10.width, var13 + var10.height); + var22 = (var20 - 1 + var10.width) / var20; + var23 = (var21 - 1 + var10.height) / var21; + + for (var24 = 0; var24 < var22; ++var24) { + for (var25 = 0; var25 < var23; ++var25) { + if (var10.spriteAngle != 0) { + var40.method6266(var20 / 2 + var12 + var24 * var20, var21 / 2 + var13 + var21 * var25, var10.spriteAngle, 4096); + } else if (var14 != 0) { + var40.drawTransAt(var12 + var24 * var20, var13 + var21 * var25, 256 - (var14 & 255)); + } else { + var40.drawTransBgAt(var12 + var20 * var24, var13 + var25 * var21); + } + } + } + + Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); + } + } + } + } else { + ItemDefinition var34; + if (var10.type == 6) { + boolean var36 = SecureRandomCallable.runCs1(var10); + if (var36) { + var20 = var10.sequenceId2; + } else { + var20 = var10.sequenceId; + } + + Model var42 = null; + var22 = 0; + if (var10.itemId != -1) { + var34 = class222.ItemDefinition_get(var10.itemId); + if (var34 != null) { + var34 = var34.getCountObj(var10.itemQuantity); + var42 = var34.getModel(1); + if (var42 != null) { + var42.calculateBoundsCylinder(); + var22 = var42.height / 2; + } else { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } + } else if (var10.modelType == 5) { + if (var10.modelId == 0) { + var42 = Client.playerAppearance.getModel((SequenceDefinition)null, -1, (SequenceDefinition)null, -1); + } else { + var42 = class215.localPlayer.getModel(); + } + } else if (var20 == -1) { + var42 = var10.getModel((SequenceDefinition)null, -1, var36, class215.localPlayer.appearance); + if (var42 == null && Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } else { + SequenceDefinition var47 = PlayerType.SequenceDefinition_get(var20); + var42 = var10.getModel(var47, var10.modelFrame, var36, class215.localPlayer.appearance); + if (var42 == null && Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + } + + Rasterizer3D.method3131(var10.width / 2 + var12, var10.height / 2 + var13); + var23 = Rasterizer3D.Rasterizer3D_sine[var10.modelAngleX] * var10.modelZoom >> 16; + var24 = Rasterizer3D.Rasterizer3D_cosine[var10.modelAngleX] * var10.modelZoom >> 16; + if (var42 != null) { + if (!var10.isIf3) { + var42.method3044(0, var10.modelAngleY, 0, var10.modelAngleX, 0, var23, var24); + } else { + var42.calculateBoundsCylinder(); + if (var10.modelOrthog) { + var42.method3046(0, var10.modelAngleY, var10.modelAngleZ, var10.modelAngleX, var10.modelOffsetX, var23 + var22 + var10.modelOffsetY, var24 + var10.modelOffsetY, var10.modelZoom); + } else { + var42.method3044(0, var10.modelAngleY, var10.modelAngleZ, var10.modelAngleX, var10.modelOffsetX, var22 + var23 + var10.modelOffsetY, var24 + var10.modelOffsetY); + } + } + } + + Rasterizer3D.Rasterizer3D_method3(); + } else { + if (var10.type == 7) { + var39 = var10.getFont(); + if (var39 == null) { + if (Widget.field2546) { + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + } + continue; + } + + var20 = 0; + + for (var21 = 0; var21 < var10.rawHeight; ++var21) { + for (var22 = 0; var22 < var10.rawWidth; ++var22) { + if (var10.itemIds[var20] > 0) { + var34 = class222.ItemDefinition_get(var10.itemIds[var20] - 1); + String var31; + if (var34.isStackable != 1 && var10.itemQuantities[var20] == 1) { + var31 = AbstractArchive.colorStartTag(16748608) + var34.name + ""; + } else { + var31 = AbstractArchive.colorStartTag(16748608) + var34.name + "" + " " + 'x' + GrandExchangeOffer.formatItemStacks(var10.itemQuantities[var20]); + } + + var25 = var12 + var22 * (var10.paddingX + 115); + var26 = (var10.paddingY + 12) * var21 + var13; + if (var10.textXAlignment == 0) { + var39.draw(var31, var25, var26, var10.color, var10.textShadowed ? 0 : -1); + } else if (var10.textXAlignment == 1) { + var39.drawCentered(var31, var10.width / 2 + var25, var26, var10.color, var10.textShadowed ? 0 : -1); + } else { + var39.drawRightAligned(var31, var25 + var10.width - 1, var26, var10.color, var10.textShadowed ? 0 : -1); + } + } + + ++var20; + } + } + } + + if (var10.type == 8 && var10 == GrandExchangeEvents.field39 && Client.field782 == Client.field783) { + var19 = 0; + var20 = 0; + Font var32 = ArchiveDiskActionHandler.fontPlain12; + String var33 = var10.text; + + String var44; + for (var33 = class335.method6661(var33, var10); var33.length() > 0; var20 = var20 + var32.ascent + 1) { + var24 = var33.indexOf("
"); + if (var24 != -1) { + var44 = var33.substring(0, var24); + var33 = var33.substring(var24 + 4); + } else { + var44 = var33; + var33 = ""; + } + + var25 = var32.stringWidth(var44); + if (var25 > var19) { + var19 = var25; + } + } + + var19 += 6; + var20 += 7; + var24 = var12 + var10.width - 5 - var19; + var25 = var13 + var10.height + 5; + if (var24 < var12 + 5) { + var24 = var12 + 5; + } + + if (var19 + var24 > var4) { + var24 = var4 - var19; + } + + if (var20 + var25 > var5) { + var25 = var5 - var20; + } + + Rasterizer2D.Rasterizer2D_fillRectangle(var24, var25, var19, var20, 16777120); + Rasterizer2D.Rasterizer2D_drawRectangle(var24, var25, var19, var20, 0); + var33 = var10.text; + var26 = var25 + var32.ascent + 2; + + for (var33 = class335.method6661(var33, var10); var33.length() > 0; var26 = var26 + var32.ascent + 1) { + int var35 = var33.indexOf("
"); + if (var35 != -1) { + var44 = var33.substring(0, var35); + var33 = var33.substring(var35 + 4); + } else { + var44 = var33; + var33 = ""; + } + + var32.draw(var44, var24 + 3, var26, 0, -1); + } + } + + if (var10.type == 9) { + if (var10.field2641) { + var19 = var12; + var20 = var13 + var10.height; + var21 = var12 + var10.width; + var22 = var13; + } else { + var19 = var12; + var20 = var13; + var21 = var12 + var10.width; + var22 = var13 + var10.height; + } + + if (var10.lineWid == 1) { + Rasterizer2D.Rasterizer2D_drawLine(var19, var20, var21, var22, var10.color); + } else { + UrlRequester.method3431(var19, var20, var21, var22, var10.color, var10.lineWid); + } + } + } + } + } + } + } + } + } + } + } + + } } diff --git a/runescape-client/src/main/java/Ignored.java b/runescape-client/src/main/java/Ignored.java index a74a2fcaa4..e1d72409fc 100644 --- a/runescape-client/src/main/java/Ignored.java +++ b/runescape-client/src/main/java/Ignored.java @@ -4,12 +4,15 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jn") +@ObfuscatedName("ji") @Implements("Ignored") public class Ignored extends User { - @ObfuscatedName("z") + @ObfuscatedName("pw") + @Export("ClanChat_inClanChat") + static boolean ClanChat_inClanChat; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -2093810797 + intValue = 1062228261 ) @Export("id") int id; @@ -17,20 +20,20 @@ public class Ignored extends User { Ignored() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljn;I)I", - garbageValue = "1947810954" + signature = "(Lji;B)I", + garbageValue = "8" ) @Export("compareTo_ignored") int compareTo_ignored(Ignored var1) { return this.id - var1.id; } - @ObfuscatedName("l") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(Ljh;I)I", - garbageValue = "-531306911" + signature = "(Ljg;I)I", + garbageValue = "105019827" ) @Export("compareTo_user") public int compareTo_user(User var1) { @@ -40,4 +43,27 @@ public class Ignored extends User { public int compareTo(Object var1) { return this.compareTo_ignored((Ignored)var1); } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(BI)C", + garbageValue = "-1328701707" + ) + public static char method5284(byte var0) { + int var1 = var0 & 255; + if (var1 == 0) { + throw new IllegalArgumentException("" + Integer.toString(var1, 16)); + } else { + if (var1 >= 128 && var1 < 160) { + char var2 = class287.cp1252AsciiExtension[var1 - 128]; + if (var2 == 0) { + var2 = '?'; + } + + var1 = var2; + } + + return (char)var1; + } + } } diff --git a/runescape-client/src/main/java/IndexedSprite.java b/runescape-client/src/main/java/IndexedSprite.java index 468b71e7f4..04252de118 100644 --- a/runescape-client/src/main/java/IndexedSprite.java +++ b/runescape-client/src/main/java/IndexedSprite.java @@ -2,35 +2,35 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("lp") +@ObfuscatedName("lw") @Implements("IndexedSprite") public final class IndexedSprite extends Rasterizer2D { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("pixels") public byte[] pixels; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("palette") public int[] palette; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("subWidth") public int subWidth; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("subHeight") public int subHeight; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("xOffset") public int xOffset; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("yOffset") public int yOffset; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("width") public int width; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("height") public int height; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("normalize") public void normalize() { if (this.subWidth != this.width || this.subHeight != this.height) { @@ -51,7 +51,7 @@ public final class IndexedSprite extends Rasterizer2D { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("shiftColors") public void shiftColors(int var1, int var2, int var3) { for (int var4 = 0; var4 < this.palette.length; ++var4) { @@ -84,7 +84,7 @@ public final class IndexedSprite extends Rasterizer2D { } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("drawAt") public void drawAt(int var1, int var2) { var1 += this.xOffset; @@ -130,8 +130,8 @@ public final class IndexedSprite extends Rasterizer2D { } } - @ObfuscatedName("r") - public void method6042(int var1, int var2, int var3, int var4) { + @ObfuscatedName("v") + public void method6212(int var1, int var2, int var3, int var4) { int var5 = this.subWidth; int var6 = this.subHeight; int var7 = 0; @@ -192,7 +192,7 @@ public final class IndexedSprite extends Rasterizer2D { IndexedSprite_something(Rasterizer2D.Rasterizer2D_pixels, this.pixels, this.palette, var7, var8, var13, var14, var3, var4, var11, var12, var5); } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("IndexedSprite_two") static void IndexedSprite_two(int[] var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8) { int var9 = -(var5 >> 2); @@ -246,7 +246,7 @@ public final class IndexedSprite extends Rasterizer2D { } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("IndexedSprite_something") static void IndexedSprite_something(int[] var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11) { int var12 = var3; diff --git a/runescape-client/src/main/java/Instrument.java b/runescape-client/src/main/java/Instrument.java index 1669da8a16..06e7c263aa 100644 --- a/runescape-client/src/main/java/Instrument.java +++ b/runescape-client/src/main/java/Instrument.java @@ -4,112 +4,112 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dk") +@ObfuscatedName("da") @Implements("Instrument") public class Instrument { - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("Instrument_samples") static int[] Instrument_samples; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("Instrument_noise") static int[] Instrument_noise; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("Instrument_sine") static int[] Instrument_sine; @ObfuscatedName("f") @Export("Instrument_phases") static int[] Instrument_phases; - @ObfuscatedName("j") + @ObfuscatedName("g") @Export("Instrument_delays") static int[] Instrument_delays; - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("Instrument_volumeSteps") static int[] Instrument_volumeSteps; - @ObfuscatedName("l") + @ObfuscatedName("u") @Export("Instrument_pitchSteps") static int[] Instrument_pitchSteps; - @ObfuscatedName("k") + @ObfuscatedName("y") @Export("Instrument_pitchBaseSteps") static int[] Instrument_pitchBaseSteps; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("pitch") SoundEnvelope pitch; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("volume") SoundEnvelope volume; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("pitchModifier") SoundEnvelope pitchModifier; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("pitchModifierAmplitude") SoundEnvelope pitchModifierAmplitude; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("volumeMultiplier") SoundEnvelope volumeMultiplier; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("volumeMultiplierAmplitude") SoundEnvelope volumeMultiplierAmplitude; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("release") SoundEnvelope release; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("attack") SoundEnvelope attack; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("oscillatorVolume") int[] oscillatorVolume; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("oscillatorPitch") int[] oscillatorPitch; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("oscillatorDelays") int[] oscillatorDelays; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("delayTime") int delayTime; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("delayDecay") int delayDecay; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lds;" + signature = "Ldz;" ) @Export("filter") AudioFilter filter; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Ldm;" + signature = "Ldd;" ) @Export("filterEnvelope") SoundEnvelope filterEnvelope; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("duration") int duration; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("offset") int offset; @@ -146,7 +146,7 @@ public class Instrument { this.offset = 0; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("synthesize") final int[] synthesize(int var1, int var2) { class300.clearIntArray(Instrument_samples, 0, var1); @@ -353,7 +353,7 @@ public class Instrument { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("evaluateWave") final int evaluateWave(int var1, int var2, int var3) { if (var3 == 1) { @@ -367,9 +367,9 @@ public class Instrument { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) @Export("decode") final void decode(Buffer var1) { @@ -421,6 +421,6 @@ public class Instrument { this.offset = var1.readUnsignedShort(); this.filter = new AudioFilter(); this.filterEnvelope = new SoundEnvelope(); - this.filter.method2678(var1, this.filterEnvelope); + this.filter.method2852(var1, this.filterEnvelope); } } diff --git a/runescape-client/src/main/java/IntHashTable.java b/runescape-client/src/main/java/IntHashTable.java index fc02b2d761..0ad15f6f41 100644 --- a/runescape-client/src/main/java/IntHashTable.java +++ b/runescape-client/src/main/java/IntHashTable.java @@ -3,10 +3,10 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lk") +@ObfuscatedName("le") @Implements("IntHashTable") public class IntHashTable { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("array") int[] array; @@ -32,10 +32,10 @@ public class IntHashTable { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(II)I", - garbageValue = "1278580700" + garbageValue = "464057567" ) @Export("get") public int get(int var1) { diff --git a/runescape-client/src/main/java/IntegerNode.java b/runescape-client/src/main/java/IntegerNode.java index 8e98b216b7..a3e82dda4a 100644 --- a/runescape-client/src/main/java/IntegerNode.java +++ b/runescape-client/src/main/java/IntegerNode.java @@ -2,10 +2,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("fj") +@ObfuscatedName("fb") @Implements("IntegerNode") public class IntegerNode extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("integer") public int integer; diff --git a/runescape-client/src/main/java/InterfaceParent.java b/runescape-client/src/main/java/InterfaceParent.java index 5db3af8647..01ec8016e2 100644 --- a/runescape-client/src/main/java/InterfaceParent.java +++ b/runescape-client/src/main/java/InterfaceParent.java @@ -4,379 +4,156 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bk") +@ObfuscatedName("bq") @Implements("InterfaceParent") public class InterfaceParent extends Node { - @ObfuscatedName("z") + @ObfuscatedName("l") + @Export("PcmPlayer_stereo") + public static boolean PcmPlayer_stereo; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -2031871231 + intValue = 637338159 ) @Export("group") int group; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1707637965 + intValue = 1813492197 ) @Export("type") int type; - @ObfuscatedName("v") - boolean field552; + @ObfuscatedName("n") + boolean field545; InterfaceParent() { - this.field552 = false; + this.field545 = false; } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)Lik;", - garbageValue = "2088846570" + signature = "(IILfc;Lfm;I)Z", + garbageValue = "467802894" ) - @Export("SpotAnimationDefinition_get") - public static SpotAnimationDefinition SpotAnimationDefinition_get(int var0) { - SpotAnimationDefinition var1 = (SpotAnimationDefinition)SpotAnimationDefinition.SpotAnimationDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = class14.SpotAnimationDefinition_archive.takeFile(13, var0); - var1 = new SpotAnimationDefinition(); - var1.id = var0; - if (var2 != null) { - var1.decode(new Buffer(var2)); + static final boolean method1262(int var0, int var1, RouteStrategy var2, CollisionMap var3) { + int var4 = var0; + int var5 = var1; + byte var6 = 64; + byte var7 = 64; + int var8 = var0 - var6; + int var9 = var1 - var7; + class173.directions[var6][var7] = 99; + class173.distances[var6][var7] = 0; + byte var10 = 0; + int var11 = 0; + class173.bufferX[var10] = var0; + byte var10001 = var10; + int var18 = var10 + 1; + class173.bufferY[var10001] = var1; + int[][] var12 = var3.flags; + + while (var18 != var11) { + var4 = class173.bufferX[var11]; + var5 = class173.bufferY[var11]; + var11 = var11 + 1 & 4095; + int var16 = var4 - var8; + int var17 = var5 - var9; + int var13 = var4 - var3.xInset; + int var14 = var5 - var3.yInset; + if (var2.hasArrived(2, var4, var5, var3)) { + class173.field2070 = var4; + LoginScreenAnimation.field1029 = var5; + return true; } - SpotAnimationDefinition.SpotAnimationDefinition_cached.put(var1, (long)var0); - return var1; + int var15 = class173.distances[var16][var17] + 1; + if (var16 > 0 && class173.directions[var16 - 1][var17] == 0 && (var12[var13 - 1][var14] & 19136782) == 0 && (var12[var13 - 1][var14 + 1] & 19136824) == 0) { + class173.bufferX[var18] = var4 - 1; + class173.bufferY[var18] = var5; + var18 = var18 + 1 & 4095; + class173.directions[var16 - 1][var17] = 2; + class173.distances[var16 - 1][var17] = var15; + } + + if (var16 < 126 && class173.directions[var16 + 1][var17] == 0 && (var12[var13 + 2][var14] & 19136899) == 0 && (var12[var13 + 2][var14 + 1] & 19136992) == 0) { + class173.bufferX[var18] = var4 + 1; + class173.bufferY[var18] = var5; + var18 = var18 + 1 & 4095; + class173.directions[var16 + 1][var17] = 8; + class173.distances[var16 + 1][var17] = var15; + } + + if (var17 > 0 && class173.directions[var16][var17 - 1] == 0 && (var12[var13][var14 - 1] & 19136782) == 0 && (var12[var13 + 1][var14 - 1] & 19136899) == 0) { + class173.bufferX[var18] = var4; + class173.bufferY[var18] = var5 - 1; + var18 = var18 + 1 & 4095; + class173.directions[var16][var17 - 1] = 1; + class173.distances[var16][var17 - 1] = var15; + } + + if (var17 < 126 && class173.directions[var16][var17 + 1] == 0 && (var12[var13][var14 + 2] & 19136824) == 0 && (var12[var13 + 1][var14 + 2] & 19136992) == 0) { + class173.bufferX[var18] = var4; + class173.bufferY[var18] = var5 + 1; + var18 = var18 + 1 & 4095; + class173.directions[var16][var17 + 1] = 4; + class173.distances[var16][var17 + 1] = var15; + } + + if (var16 > 0 && var17 > 0 && class173.directions[var16 - 1][var17 - 1] == 0 && (var12[var13 - 1][var14] & 19136830) == 0 && (var12[var13 - 1][var14 - 1] & 19136782) == 0 && (var12[var13][var14 - 1] & 19136911) == 0) { + class173.bufferX[var18] = var4 - 1; + class173.bufferY[var18] = var5 - 1; + var18 = var18 + 1 & 4095; + class173.directions[var16 - 1][var17 - 1] = 3; + class173.distances[var16 - 1][var17 - 1] = var15; + } + + if (var16 < 126 && var17 > 0 && class173.directions[var16 + 1][var17 - 1] == 0 && (var12[var13 + 1][var14 - 1] & 19136911) == 0 && (var12[var13 + 2][var14 - 1] & 19136899) == 0 && (var12[var13 + 2][var14] & 19136995) == 0) { + class173.bufferX[var18] = var4 + 1; + class173.bufferY[var18] = var5 - 1; + var18 = var18 + 1 & 4095; + class173.directions[var16 + 1][var17 - 1] = 9; + class173.distances[var16 + 1][var17 - 1] = var15; + } + + if (var16 > 0 && var17 < 126 && class173.directions[var16 - 1][var17 + 1] == 0 && (var12[var13 - 1][var14 + 1] & 19136830) == 0 && (var12[var13 - 1][var14 + 2] & 19136824) == 0 && (var12[var13][var14 + 2] & 19137016) == 0) { + class173.bufferX[var18] = var4 - 1; + class173.bufferY[var18] = var5 + 1; + var18 = var18 + 1 & 4095; + class173.directions[var16 - 1][var17 + 1] = 6; + class173.distances[var16 - 1][var17 + 1] = var15; + } + + if (var16 < 126 && var17 < 126 && class173.directions[var16 + 1][var17 + 1] == 0 && (var12[var13 + 1][var14 + 2] & 19137016) == 0 && (var12[var13 + 2][var14 + 2] & 19136992) == 0 && (var12[var13 + 2][var14 + 1] & 19136995) == 0) { + class173.bufferX[var18] = var4 + 1; + class173.bufferY[var18] = var5 + 1; + var18 = var18 + 1 & 4095; + class173.directions[var16 + 1][var17 + 1] = 12; + class173.distances[var16 + 1][var17 + 1] = var15; + } } + + class173.field2070 = var4; + LoginScreenAnimation.field1029 = var5; + return false; } - @ObfuscatedName("z") + @ObfuscatedName("ib") @ObfuscatedSignature( - signature = "(Lgy;Llg;I)Lgn;", - garbageValue = "1885960341" + signature = "(B)V", + garbageValue = "91" ) - @Export("getPacketBufferNode") - public static PacketBufferNode getPacketBufferNode(ClientPacket var0, IsaacCipher var1) { - PacketBufferNode var2; - if (PacketBufferNode.PacketBufferNode_packetBufferNodeCount == 0) { - var2 = new PacketBufferNode(); - } else { - var2 = PacketBufferNode.PacketBufferNode_packetBufferNodes[--PacketBufferNode.PacketBufferNode_packetBufferNodeCount]; - } - - var2.clientPacket = var0; - var2.clientPacketLength = var0.length; - if (var2.clientPacketLength == -1) { - var2.packetBuffer = new PacketBuffer(260); - } else if (var2.clientPacketLength == -2) { - var2.packetBuffer = new PacketBuffer(10000); - } else if (var2.clientPacketLength <= 18) { - var2.packetBuffer = new PacketBuffer(20); - } else if (var2.clientPacketLength <= 98) { - var2.packetBuffer = new PacketBuffer(100); - } else { - var2.packetBuffer = new PacketBuffer(260); - } - - var2.packetBuffer.setIsaacCipher(var1); - var2.packetBuffer.writeByteIsaac(var2.clientPacket.id); - var2.index = 0; - return var2; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1288717828" - ) - static void method1197() { - if (Login.Login_username == null || Login.Login_username.length() <= 0) { - if (AbstractArchive.clientPreferences.rememberedUsername != null) { - Login.Login_username = AbstractArchive.clientPreferences.rememberedUsername; - Client.Login_isUsernameRemembered = true; - } else { - Client.Login_isUsernameRemembered = false; - } - - } - } - - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "4" - ) - public static void method1192(int var0) { - if (var0 != -1) { - if (ViewportMouse.Widget_loadedInterfaces[var0]) { - Widget.Widget_archive.clearFilesGroup(var0); - if (UserComparator5.Widget_interfaceComponents[var0] != null) { - boolean var1 = true; - - for (int var2 = 0; var2 < UserComparator5.Widget_interfaceComponents[var0].length; ++var2) { - if (UserComparator5.Widget_interfaceComponents[var0][var2] != null) { - if (UserComparator5.Widget_interfaceComponents[var0][var2].type != 2) { - UserComparator5.Widget_interfaceComponents[var0][var2] = null; - } else { - var1 = false; - } - } - } - - if (var1) { - UserComparator5.Widget_interfaceComponents[var0] = null; - } - - ViewportMouse.Widget_loadedInterfaces[var0] = false; - } - } - } - } - - @ObfuscatedName("d") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "746031427" - ) - public static void method1193() { - ItemDefinition.ItemDefinition_cached.clear(); - ItemDefinition.ItemDefinition_cachedModels.clear(); - ItemDefinition.ItemDefinition_cachedSprites.clear(); - } - - @ObfuscatedName("hk") - @ObfuscatedSignature( - signature = "(ZLkf;B)V", - garbageValue = "-96" - ) - @Export("updateNpcs") - static final void updateNpcs(boolean var0, PacketBuffer var1) { - Client.field640 = 0; - Client.field633 = 0; - Decimator.method2500(); - - int var2; - NPC var4; - int var5; - int var6; - int var7; - int var8; - int var9; - while (var1.bitsRemaining(Client.packetWriter.serverPacketLength) >= 27) { - var2 = var1.readBits(15); - if (var2 == 32767) { - break; - } - - boolean var3 = false; - if (Client.npcs[var2] == null) { - Client.npcs[var2] = new NPC(); - var3 = true; - } - - var4 = Client.npcs[var2]; - Client.npcIndices[++Client.npcCount - 1] = var2; - var4.npcCycle = Client.cycle; - if (var0) { - var5 = var1.readBits(8); - if (var5 > 127) { - var5 -= 256; - } - } else { - var5 = var1.readBits(5); - if (var5 > 15) { - var5 -= 32; - } - } - - if (var0) { - var6 = var1.readBits(8); - if (var6 > 127) { - var6 -= 256; - } - } else { - var6 = var1.readBits(5); - if (var6 > 15) { - var6 -= 32; - } - } - - var7 = Client.defaultRotations[var1.readBits(3)]; - if (var3) { - var4.orientation = var4.rotation = var7; - } - - var8 = var1.readBits(1); - if (var8 == 1) { - Client.field681[++Client.field633 - 1] = var2; - } - - var9 = var1.readBits(1); - var4.definition = PacketBufferNode.getNpcDefinition(var1.readBits(14)); - var4.size = var4.definition.size * 772175475; - var4.field982 = var4.definition.rotation; - if (var4.field982 == 0) { - var4.rotation = 0; - } - - var4.walkSequence = var4.definition.walkSequence; - var4.walkBackSequence = var4.definition.walkBackSequence; - var4.walkLeftSequence = var4.definition.walkLeftSequence; - var4.walkRightSequence = var4.definition.walkRightSequence; - var4.readySequence = var4.definition.readySequence; - var4.turnLeftSequence = var4.definition.turnLeftSequence; - var4.turnRightSequence = var4.definition.turnRightSequence; - var4.method2042(class223.localPlayer.pathX[0] + var5, class223.localPlayer.pathY[0] + var6, var9 == 1); - } - - var1.exportIndex(); - - int var14; - for (var2 = 0; var2 < Client.field633; ++var2) { - var14 = Client.field681[var2]; - var4 = Client.npcs[var14]; - var5 = var1.readUnsignedByte(); - if ((var5 & 16) != 0) { - var6 = var1.readUnsignedShort(); - if (var6 == 65535) { - var6 = -1; - } - - var7 = var1.method5511(); - if (var6 == var4.sequence && var6 != -1) { - var8 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var6).field3517; - if (var8 == 1) { - var4.sequenceFrame = 0; - var4.sequenceFrameCycle = 0; - var4.sequenceDelay = var7; - var4.field965 = 0; - } - - if (var8 == 2) { - var4.field965 = 0; - } - } else if (var6 == -1 || var4.sequence == -1 || GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var6).field3511 >= GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var4.sequence).field3511) { - var4.sequence = var6; - var4.sequenceFrame = 0; - var4.sequenceFrameCycle = 0; - var4.sequenceDelay = var7; - var4.field965 = 0; - var4.field988 = var4.pathLength; - } - } - - if ((var5 & 1) != 0) { - var6 = var1.method5471(); - int var10; - int var11; - int var12; - if (var6 > 0) { - for (var7 = 0; var7 < var6; ++var7) { - var9 = -1; - var10 = -1; - var11 = -1; - var8 = var1.readUShortSmart(); - if (var8 == 32767) { - var8 = var1.readUShortSmart(); - var10 = var1.readUShortSmart(); - var9 = var1.readUShortSmart(); - var11 = var1.readUShortSmart(); - } else if (var8 != 32766) { - var10 = var1.readUShortSmart(); - } else { - var8 = -1; - } - - var12 = var1.readUShortSmart(); - var4.addHitSplat(var8, var10, var9, var11, Client.cycle, var12); - } - } - - var7 = var1.method5511(); - if (var7 > 0) { - for (var8 = 0; var8 < var7; ++var8) { - var9 = var1.readUShortSmart(); - var10 = var1.readUShortSmart(); - if (var10 != 32767) { - var11 = var1.readUShortSmart(); - var12 = var1.method5471(); - int var13 = var10 > 0 ? var1.method5471() : var12; - var4.addHealthBar(var9, Client.cycle, var10, var11, var12, var13); - } else { - var4.removeHealthBar(var9); - } - } - } - } - - if ((var5 & 2) != 0) { - var4.targetIndex = var1.method5480(); - if (var4.targetIndex == 65535) { - var4.targetIndex = -1; - } - } - - if ((var5 & 32) != 0) { - var4.definition = PacketBufferNode.getNpcDefinition(var1.method5647()); - var4.size = var4.definition.size * 772175475; - var4.field982 = var4.definition.rotation; - var4.walkSequence = var4.definition.walkSequence; - var4.walkBackSequence = var4.definition.walkBackSequence; - var4.walkLeftSequence = var4.definition.walkLeftSequence; - var4.walkRightSequence = var4.definition.walkRightSequence; - var4.readySequence = var4.definition.readySequence; - var4.turnLeftSequence = var4.definition.turnLeftSequence; - var4.turnRightSequence = var4.definition.turnRightSequence; - } - - if ((var5 & 4) != 0) { - var6 = var1.method5480(); - var7 = var1.method5647(); - var8 = var4.x - (var6 - class223.baseX * 64 - class223.baseX * 64) * 64; - var9 = var4.y - (var7 - class286.baseY * 64 - class286.baseY * 64) * 64; - if (var8 != 0 || var9 != 0) { - var4.field957 = (int)(Math.atan2((double)var8, (double)var9) * 325.949D) & 2047; - } - } - - if ((var5 & 8) != 0) { - var4.spotAnimation = var1.method5647(); - var6 = var1.method5561(); - var4.heightOffset = var6 >> 16; - var4.field969 = (var6 & 65535) + Client.cycle; - var4.spotAnimationFrame = 0; - var4.spotAnimationFrameCycle = 0; - if (var4.field969 > Client.cycle) { - var4.spotAnimationFrame = -1; - } - - if (var4.spotAnimation == 65535) { - var4.spotAnimation = -1; - } - } - - if ((var5 & 64) != 0) { - var4.overheadText = var1.readStringCp1252NullTerminated(); - var4.overheadTextCyclesRemaining = 100; - } - } - - for (var2 = 0; var2 < Client.field640; ++var2) { - var14 = Client.field758[var2]; - if (Client.npcs[var14].npcCycle != Client.cycle) { - Client.npcs[var14].definition = null; - Client.npcs[var14] = null; - } - } - - if (var1.offset != Client.packetWriter.serverPacketLength) { - throw new RuntimeException(var1.offset + "," + Client.packetWriter.serverPacketLength); - } else { - for (var2 = 0; var2 < Client.npcCount; ++var2) { - if (Client.npcs[Client.npcIndices[var2]] == null) { - throw new RuntimeException(var2 + "," + Client.npcCount); - } + @Export("Widget_runOnTargetLeave") + static void Widget_runOnTargetLeave() { + if (Client.isSpellSelected) { + Widget var0 = ArchiveLoader.getWidgetChild(Clock.selectedSpellWidget, Client.selectedSpellChildIndex); + if (var0 != null && var0.onTargetLeave != null) { + ScriptEvent var1 = new ScriptEvent(); + var1.widget = var0; + var1.args = var0.onTargetLeave; + GrandExchangeOfferAgeComparator.runScriptEvent(var1); } + Client.isSpellSelected = false; + GrandExchangeOfferAgeComparator.invalidateWidget(var0); } } } diff --git a/runescape-client/src/main/java/Interpreter.java b/runescape-client/src/main/java/Interpreter.java index a97851d684..e45757a498 100644 --- a/runescape-client/src/main/java/Interpreter.java +++ b/runescape-client/src/main/java/Interpreter.java @@ -4,71 +4,75 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bw") +@ObfuscatedName("by") @Implements("Interpreter") public class Interpreter { @ObfuscatedName("qg") - @ObfuscatedSignature( - signature = "Ldr;" + @ObfuscatedGetter( + intValue = 596908915 ) - @Export("decimator") - static Decimator decimator; + static int field1068; + @ObfuscatedName("q") + @Export("Interpreter_stringLocals") + static String[] Interpreter_stringLocals; @ObfuscatedName("v") - @Export("Interpreter_intLocals") - static int[] Interpreter_intLocals; - @ObfuscatedName("r") @Export("Interpreter_arrayLengths") static int[] Interpreter_arrayLengths; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("Interpreter_arrays") static int[][] Interpreter_arrays; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("Interpreter_intStack") static int[] Interpreter_intStack; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 313560965 + intValue = -548793337 ) @Export("Interpreter_intStackSize") static int Interpreter_intStackSize; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("Interpreter_stringStack") static String[] Interpreter_stringStack; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -133806221 + intValue = -36200349 ) - @Export("Interpreter_stringStackSize") - static int Interpreter_stringStackSize; - @ObfuscatedName("c") + static int field1063; + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1889538287 + intValue = -1766816567 ) @Export("Interpreter_frameDepth") static int Interpreter_frameDepth; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "[Lbv;" + signature = "[Lbx;" ) @Export("Interpreter_frames") static ScriptFrame[] Interpreter_frames; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("Interpreter_calendar") static java.util.Calendar Interpreter_calendar; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("Interpreter_MONTHS") static final String[] Interpreter_MONTHS; - @ObfuscatedName("g") - static boolean field1074; - @ObfuscatedName("x") + @ObfuscatedName("e") static boolean field1075; - @ObfuscatedName("h") + @ObfuscatedName("s") + static boolean field1076; + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = -1964719699 + intValue = 1096350801 ) - static int field1089; - @ObfuscatedName("d") - static final double field1077; + static int field1080; + @ObfuscatedName("w") + static final double field1078; + @ObfuscatedName("bi") + @ObfuscatedSignature( + signature = "[Llw;" + ) + @Export("worldSelectStars") + static IndexedSprite[] worldSelectStars; static { Interpreter_arrayLengths = new int[5]; @@ -79,110 +83,9 @@ public class Interpreter { Interpreter_frames = new ScriptFrame[50]; Interpreter_calendar = java.util.Calendar.getInstance(); Interpreter_MONTHS = new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - field1074 = false; field1075 = false; - field1089 = 0; - field1077 = Math.log(2.0D); - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Lgt;I)I", - garbageValue = "-1997764542" - ) - @Export("compareStrings") - public static int compareStrings(CharSequence var0, CharSequence var1, Language var2) { - int var3 = var0.length(); - int var4 = var1.length(); - int var5 = 0; - int var6 = 0; - char var7 = 0; - char var8 = 0; - - while (var5 - var7 < var3 || var6 - var8 < var4) { - if (var5 - var7 >= var3) { - return -1; - } - - if (var6 - var8 >= var4) { - return 1; - } - - char var9; - if (var7 != 0) { - var9 = var7; - boolean var14 = false; - } else { - var9 = var0.charAt(var5++); - } - - char var10; - if (var8 != 0) { - var10 = var8; - boolean var15 = false; - } else { - var10 = var1.charAt(var6++); - } - - var7 = class14.method175(var9); - var8 = class14.method175(var10); - var9 = class13.standardizeChar(var9, var2); - var10 = class13.standardizeChar(var10, var2); - if (var10 != var9 && Character.toUpperCase(var9) != Character.toUpperCase(var10)) { - var9 = Character.toLowerCase(var9); - var10 = Character.toLowerCase(var10); - if (var10 != var9) { - return MusicPatchNode.lowercaseChar(var9, var2) - MusicPatchNode.lowercaseChar(var10, var2); - } - } - } - - int var16 = Math.min(var3, var4); - - char var12; - int var17; - for (var17 = 0; var17 < var16; ++var17) { - if (var2 == Language.Language_FR) { - var5 = var3 - 1 - var17; - var6 = var4 - 1 - var17; - } else { - var6 = var17; - var5 = var17; - } - - char var11 = var0.charAt(var5); - var12 = var1.charAt(var6); - if (var11 != var12 && Character.toUpperCase(var11) != Character.toUpperCase(var12)) { - var11 = Character.toLowerCase(var11); - var12 = Character.toLowerCase(var12); - if (var12 != var11) { - return MusicPatchNode.lowercaseChar(var11, var2) - MusicPatchNode.lowercaseChar(var12, var2); - } - } - } - - var17 = var3 - var4; - if (var17 != 0) { - return var17; - } else { - for (int var18 = 0; var18 < var16; ++var18) { - var12 = var0.charAt(var18); - char var13 = var1.charAt(var18); - if (var13 != var12) { - return MusicPatchNode.lowercaseChar(var12, var2) - MusicPatchNode.lowercaseChar(var13, var2); - } - } - - return 0; - } - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;IB)Z", - garbageValue = "106" - ) - static boolean method2025(String var0, int var1) { - return WorldMapID.method567(var0, var1, "openjs"); + field1076 = false; + field1080 = 0; + field1078 = Math.log(2.0D); } } diff --git a/runescape-client/src/main/java/InvDefinition.java b/runescape-client/src/main/java/InvDefinition.java index 79415563b7..643439eaf0 100644 --- a/runescape-client/src/main/java/InvDefinition.java +++ b/runescape-client/src/main/java/InvDefinition.java @@ -4,24 +4,18 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ig") +@ObfuscatedName("iq") @Implements("InvDefinition") public class InvDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" - ) - @Export("InvDefinition_archive") - static AbstractArchive InvDefinition_archive; - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("InvDefinition_cached") static EvictingDualNodeHashTable InvDefinition_cached; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1122330625 + intValue = -1300111967 ) @Export("size") public int size; @@ -34,10 +28,10 @@ public class InvDefinition extends DualNode { this.size = 0; } - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1971272201" + signature = "(Lkc;B)V", + garbageValue = "-57" ) @Export("decode") void decode(Buffer var1) { @@ -51,10 +45,10 @@ public class InvDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-57582576" + signature = "(Lkc;IB)V", + garbageValue = "-64" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -63,768 +57,4 @@ public class InvDefinition extends DualNode { } } - - @ObfuscatedName("hm") - @ObfuscatedSignature( - signature = "(IIIILjava/lang/String;Ljava/lang/String;III)V", - garbageValue = "1826014571" - ) - @Export("menuAction") - static final void menuAction(int param0, int param1, int opcode, int id, String option, String target, int var6, int var7) { - if (opcode >= 2000) { - opcode -= 2000; - } - - if (opcode == 1) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2230, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5476(class223.baseX * 64 + param0); - var8.packetBuffer.writeShort(class286.baseY * 64 + param1); - var8.packetBuffer.writeIntME(AbstractWorldMapData.selectedItemId); - var8.packetBuffer.method5630(class2.selectedItemWidget); - var8.packetBuffer.writeShort(DevicePcmPlayerProvider.selectedItemSlot); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var8); - } else if (opcode == 2) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2252, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(AttackOption.selectedSpellWidget); - var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeShort(class286.baseY * 64 + param1); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.writeShort(class223.baseX * 64 + param0); - var8.packetBuffer.writeIntME(Client.selectedSpellChildIndex); - Client.packetWriter.addNode(var8); - } else if (opcode == 3) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2235, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeShort(id); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - var8.packetBuffer.writeShortLE(class223.baseX * 64 + param0); - Client.packetWriter.addNode(var8); - } else if (opcode == 4) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2190, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.writeShort(class223.baseX * 64 + param0); - var8.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - Client.packetWriter.addNode(var8); - } else if (opcode == 5) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2226, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(id); - var8.packetBuffer.writeIntME(class223.baseX * 64 + param0); - var8.packetBuffer.writeShortLE(class286.baseY * 64 + param1); - var8.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var8); - } else if (opcode == 6) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2266, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(class223.baseX * 64 + param0); - var8.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeIntME(id); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - Client.packetWriter.addNode(var8); - } else if (opcode == 7) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2195, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeIntLE16(class2.selectedItemWidget); - var9.packetBuffer.writeShortLE(AbstractWorldMapData.selectedItemId); - var9.packetBuffer.writeIntME(id); - var9.packetBuffer.writeShortLE(DevicePcmPlayerProvider.selectedItemSlot); - var9.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 8) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2260, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5476(Client.selectedSpellChildIndex); - var9.packetBuffer.method5476(id); - var9.packetBuffer.writeIntLE16(AttackOption.selectedSpellWidget); - var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 9) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2273, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5476(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 10) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2280, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.writeIntME(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 11) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2219, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5476(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 12) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2263, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5476(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 13) { - NPC var13 = Client.npcs[id]; - if (var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2221, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5476(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 14) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2243, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShortLE(id); - var9.packetBuffer.method5630(class2.selectedItemWidget); - var9.packetBuffer.writeShort(AbstractWorldMapData.selectedItemId); - var9.packetBuffer.method5476(DevicePcmPlayerProvider.selectedItemSlot); - var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 15) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2239, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5476(id); - var9.packetBuffer.writeIntME(Client.selectedSpellChildIndex); - var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5489(AttackOption.selectedSpellWidget); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 16) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2197, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.writeInt(class2.selectedItemWidget); - var8.packetBuffer.writeIntME(DevicePcmPlayerProvider.selectedItemSlot); - var8.packetBuffer.writeShortLE(class286.baseY * 64 + param1); - var8.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeIntME(class223.baseX * 64 + param0); - var8.packetBuffer.writeIntME(AbstractWorldMapData.selectedItemId); - Client.packetWriter.addNode(var8); - } else if (opcode == 17) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2218, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - var8.packetBuffer.writeIntLE16(AttackOption.selectedSpellWidget); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.writeIntME(Client.selectedSpellChildIndex); - var8.packetBuffer.method5476(class223.baseX * 64 + param0); - var8.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var8); - } else if (opcode == 18) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2277, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.method5476(class286.baseY * 64 + param1); - var8.packetBuffer.writeIntME(class223.baseX * 64 + param0); - var8.packetBuffer.writeShortLE(id); - Client.packetWriter.addNode(var8); - } else if (opcode == 19) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2205, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeIntME(class223.baseX * 64 + param0); - var8.packetBuffer.writeIntME(id); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - Client.packetWriter.addNode(var8); - } else if (opcode == 20) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2240, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeShortLE(class223.baseX * 64 + param0); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - var8.packetBuffer.method5476(id); - Client.packetWriter.addNode(var8); - } else if (opcode == 21) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2265, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(class223.baseX * 64 + param0); - var8.packetBuffer.writeIntME(class286.baseY * 64 + param1); - var8.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var8.packetBuffer.writeShort(id); - Client.packetWriter.addNode(var8); - } else if (opcode == 22) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2192, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5476(class223.baseX * 64 + param0); - var8.packetBuffer.method5476(class286.baseY * 64 + param1); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var8); - } else if (opcode == 23) { - if (Client.isMenuOpen) { - PacketWriter.scene.setViewportWalking(); - } else { - PacketWriter.scene.menuOpen(WorldMapRectangle.plane, param0, param1, true); - } - } else if (opcode == 24) { - Widget var16 = Canvas.getWidget(param1); - boolean var11 = true; - if (var16.contentType > 0) { - var11 = class43.method840(var16); - } - - if (var11) { - PacketBufferNode var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2261, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(param1); - Client.packetWriter.addNode(var10); - } - } else if (opcode == 25) { - Widget var16 = GrandExchangeOfferWorldComparator.getWidgetChild(param1, param0); - if (var16 != null) { - class208.Widget_runOnTargetLeave(); - class32.selectSpell(param1, param0, class2.method30(class2.getWidgetClickMask(var16)), var16.itemId); - Client.isItemSelected = 0; - Client.selectedSpellActionName = VerticalAlignment.method4321(var16); - if (Client.selectedSpellActionName == null) { - Client.selectedSpellActionName = "null"; - } - - if (var16.isIf3) { - Client.selectedSpellName = var16.dataText + World.colorStartTag(16777215); - } else { - Client.selectedSpellName = World.colorStartTag(65280) + var16.spellName + World.colorStartTag(16777215); - } - } - - return; - } else if (opcode == 26) { - class51.method922(); - } else if (opcode == 28) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2261, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(param1); - Client.packetWriter.addNode(var8); - Widget var14 = Canvas.getWidget(param1); - if (var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { - int var12 = var14.cs1Instructions[0][1]; - Varps.Varps_main[var12] = 1 - Varps.Varps_main[var12]; - NetSocket.method3472(var12); - } - } else if (opcode == 29) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2261, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(param1); - Client.packetWriter.addNode(var8); - Widget var14 = Canvas.getWidget(param1); - if (var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { - int var12 = var14.cs1Instructions[0][1]; - if (Varps.Varps_main[var12] != var14.cs1ComparisonValues[0]) { - Varps.Varps_main[var12] = var14.cs1ComparisonValues[0]; - NetSocket.method3472(var12); - } - } - } else if (opcode == 30) { - if (Client.meslayerContinueWidget == null) { - Clock.resumePauseWidget(param1, param0); - Client.meslayerContinueWidget = GrandExchangeOfferWorldComparator.getWidgetChild(param1, param0); - WorldMapSectionType.invalidateWidget(Client.meslayerContinueWidget); - } - } else if (opcode == 31) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2269, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5630(param1); - var8.packetBuffer.writeShortLE(DevicePcmPlayerProvider.selectedItemSlot); - var8.packetBuffer.writeInt(class2.selectedItemWidget); - var8.packetBuffer.writeShort(AbstractWorldMapData.selectedItemId); - var8.packetBuffer.writeShort(param0); - var8.packetBuffer.writeShort(id); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 32) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2246, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(Client.selectedSpellChildIndex); - var8.packetBuffer.method5476(param0); - var8.packetBuffer.method5476(id); - var8.packetBuffer.method5630(param1); - var8.packetBuffer.method5489(AttackOption.selectedSpellWidget); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 33) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2211, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(param1); - var8.packetBuffer.method5476(param0); - var8.packetBuffer.method5476(id); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 34) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2255, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(param1); - var8.packetBuffer.method5476(param0); - var8.packetBuffer.writeIntME(id); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 35) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2189, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5476(id); - var8.packetBuffer.writeIntLE16(param1); - var8.packetBuffer.writeShort(param0); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 36) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2198, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(id); - var8.packetBuffer.method5476(param0); - var8.packetBuffer.method5630(param1); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 37) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2247, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntME(param0); - var8.packetBuffer.method5630(param1); - var8.packetBuffer.writeIntME(id); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 38) { - class208.Widget_runOnTargetLeave(); - Widget var16 = Canvas.getWidget(param1); - Client.isItemSelected = 1; - DevicePcmPlayerProvider.selectedItemSlot = param0; - class2.selectedItemWidget = param1; - AbstractWorldMapData.selectedItemId = id; - WorldMapSectionType.invalidateWidget(var16); - Client.selectedItemName = World.colorStartTag(16748608) + Occluder.ItemDefinition_get(id).name + World.colorStartTag(16777215); - if (Client.selectedItemName == null) { - Client.selectedItemName = "null"; - } - - return; - } else if (opcode == 39) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2217, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntME(param0); - var8.packetBuffer.writeShort(id); - var8.packetBuffer.method5489(param1); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 40) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2272, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5630(param1); - var8.packetBuffer.writeIntME(param0); - var8.packetBuffer.writeShortLE(id); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 41) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2250, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5476(param0); - var8.packetBuffer.method5489(param1); - var8.packetBuffer.method5476(id); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 42) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2259, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(id); - var8.packetBuffer.writeShort(param0); - var8.packetBuffer.method5630(param1); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 43) { - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2282, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(id); - var8.packetBuffer.method5489(param1); - var8.packetBuffer.writeShort(param0); - Client.packetWriter.addNode(var8); - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 44) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2231, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeIntME(id); - var9.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 45) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2227, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShortLE(id); - var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 46) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2206, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5461(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5476(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 47) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2271, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShortLE(id); - var9.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 48) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2242, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5468(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.method5476(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 49) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2214, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShort(id); - var9.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 50) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2274, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5476(id); - var9.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 51) { - Player var15 = Client.players[id]; - if (var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2262, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - var9.packetBuffer.writeIntME(id); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 57) { - Widget var16 = GrandExchangeOfferWorldComparator.getWidgetChild(param1, param0); - if (var16 != null) { - WorldMapSection1.widgetDefaultMenuAction(id, param1, param0, var16.itemId, target); - } - } else if (opcode == 58) { - Widget var16 = GrandExchangeOfferWorldComparator.getWidgetChild(param1, param0); - if (var16 != null) { - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2236, Client.packetWriter.isaacCipher); - var9.packetBuffer.method5630(param1); - var9.packetBuffer.writeShort(var16.itemId); - var9.packetBuffer.writeIntLE16(AttackOption.selectedSpellWidget); - var9.packetBuffer.writeShortLE(param0); - var9.packetBuffer.writeIntME(Client.selectedSpellChildIndex); - var9.packetBuffer.writeIntME(Client.field793); - Client.packetWriter.addNode(var9); - } - } else if (opcode == 1001) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - Client.destinationX = param0; - Client.destinationY = param1; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2234, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(class286.baseY * 64 + param1); - var8.packetBuffer.writeShort(class223.baseX * 64 + param0); - var8.packetBuffer.writeShort(id); - var8.packetBuffer.method5467(KeyHandler.KeyHandler_pressedKeys[82] ? 1 : 0); - Client.packetWriter.addNode(var8); - } else if (opcode == 1002) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2220, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5476(id); - Client.packetWriter.addNode(var8); - } else if (opcode == 1003) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - NPC var13 = Client.npcs[id]; - if (var13 != null) { - NPCDefinition var17 = var13.definition; - if (var17.transforms != null) { - var17 = var17.transform(); - } - - if (var17 != null) { - PacketBufferNode var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2248, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeIntME(var17.id); - Client.packetWriter.addNode(var10); - } - } - } else if (opcode == 1004) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; - Client.mouseCrossColor = 2; - Client.mouseCrossState = 0; - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2212, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(id); - Client.packetWriter.addNode(var8); - } else if (opcode == 1005) { - Widget var16 = Canvas.getWidget(param1); - if (var16 != null && var16.itemQuantities[param0] >= 100000) { - class210.addGameMessage(27, "", var16.itemQuantities[param0] + " x " + Occluder.ItemDefinition_get(id).name); - } else { - PacketBufferNode var9 = InterfaceParent.getPacketBufferNode(ClientPacket.field2212, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShort(id); - Client.packetWriter.addNode(var9); - } - - Client.field750 = 0; - GrandExchangeOfferOwnWorldComparator.field628 = Canvas.getWidget(param1); - Client.field743 = param0; - } else if (opcode == 1007) { - Widget var16 = GrandExchangeOfferWorldComparator.getWidgetChild(param1, param0); - if (var16 != null) { - WorldMapSection1.widgetDefaultMenuAction(id, param1, param0, var16.itemId, target); - } - } else if (opcode == 1011 || opcode == 1008 || opcode == 1009 || opcode == 1010 || opcode == 1012) { - Tiles.worldMap.menuAction(opcode, id, new Coord(param0), new Coord(param1)); - } - - if (Client.isItemSelected != 0) { - Client.isItemSelected = 0; - WorldMapSectionType.invalidateWidget(Canvas.getWidget(class2.selectedItemWidget)); - } - - if (Client.isSpellSelected) { - class208.Widget_runOnTargetLeave(); - } - - if (GrandExchangeOfferOwnWorldComparator.field628 != null && Client.field750 == 0) { - WorldMapSectionType.invalidateWidget(GrandExchangeOfferOwnWorldComparator.field628); - } - - } - - @ObfuscatedName("ig") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;Lho;I)Ljava/lang/String;", - garbageValue = "-1374184738" - ) - static String method4335(String var0, Widget var1) { - if (var0.indexOf("%") != -1) { - for (int var2 = 1; var2 <= 5; ++var2) { - while (true) { - int var3 = var0.indexOf("%" + var2); - if (var3 == -1) { - break; - } - - String var4 = var0.substring(0, var3); - int var6 = class216.method4015(var1, var2 - 1); - String var5; - if (var6 < 999999999) { - var5 = Integer.toString(var6); - } else { - var5 = "*"; - } - - var0 = var4 + var5 + var0.substring(var3 + 2); - } - } - } - - return var0; - } } diff --git a/runescape-client/src/main/java/IsaacCipher.java b/runescape-client/src/main/java/IsaacCipher.java index d58803be22..08e55e2ed3 100644 --- a/runescape-client/src/main/java/IsaacCipher.java +++ b/runescape-client/src/main/java/IsaacCipher.java @@ -4,36 +4,36 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lg") +@ObfuscatedName("lm") @Implements("IsaacCipher") public final class IsaacCipher { - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -925707239 + intValue = 1041384153 ) @Export("valuesRemaining") int valuesRemaining; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("results") int[] results; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("mm") int[] mm; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 460099205 + intValue = 386499495 ) @Export("aa") int aa; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 883284121 + intValue = -1628464269 ) @Export("bb") int bb; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 2097692587 + intValue = 1923641591 ) @Export("cc") int cc; @@ -46,13 +46,13 @@ public final class IsaacCipher { this.results[var2] = var1[var2]; } - this.method6216(); + this.method6377(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "2" + signature = "(I)I", + garbageValue = "-1848840340" ) @Export("nextInt") public final int nextInt() { @@ -64,12 +64,12 @@ public final class IsaacCipher { return this.results[--this.valuesRemaining]; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "2039703989" + garbageValue = "-2138100218" ) - public final int method6214() { + public final int method6378() { if (this.valuesRemaining == 0) { this.generateMoreResults(); this.valuesRemaining = 256; @@ -78,10 +78,10 @@ public final class IsaacCipher { return this.results[this.valuesRemaining - 1]; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "522891016" + garbageValue = "111234133" ) @Export("generateMoreResults") final void generateMoreResults() { @@ -103,18 +103,18 @@ public final class IsaacCipher { this.aa += this.mm[128 + var1 & 255]; int var3; - this.mm[var1] = var3 = this.mm[(var2 & 1020) >> 2] + this.bb + this.aa; + this.mm[var1] = var3 = this.mm[(var2 & 1020) >> 2] + this.aa + this.bb; this.results[var1] = this.bb = this.mm[(var3 >> 8 & 1020) >> 2] + var2; } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-135595454" + signature = "(B)V", + garbageValue = "1" ) - final void method6216() { + final void method6377() { int var9 = -1640531527; int var8 = -1640531527; int var7 = -1640531527; diff --git a/runescape-client/src/main/java/ItemContainer.java b/runescape-client/src/main/java/ItemContainer.java index 2c7b9eb431..7ac981b079 100644 --- a/runescape-client/src/main/java/ItemContainer.java +++ b/runescape-client/src/main/java/ItemContainer.java @@ -1,28 +1,21 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bz") +@ObfuscatedName("bu") @Implements("ItemContainer") public class ItemContainer extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("itemContainers") static NodeHashTable itemContainers; - @ObfuscatedName("mu") - @ObfuscatedGetter( - intValue = -1316536921 - ) - @Export("selectedSpellFlags") - static int selectedSpellFlags; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("ids") int[] ids; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("quantities") int[] quantities; @@ -35,55 +28,49 @@ public class ItemContainer extends Node { this.quantities = new int[]{0}; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;Lhp;Lhp;I)V", - garbageValue = "376678600" + signature = "(B)V", + garbageValue = "4" ) - public static void method1190(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2) { - SequenceDefinition.SequenceDefinition_archive = var0; - SequenceDefinition.SequenceDefinition_animationsArchive = var1; - class188.SequenceDefinition_skeletonsArchive = var2; - } + static void method1250() { + synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock) { + if (ArchiveDiskActionHandler.field3132 == 0) { + ArchiveDiskActionHandler.ArchiveDiskActionHandler_thread = new Thread(new ArchiveDiskActionHandler()); + ArchiveDiskActionHandler.ArchiveDiskActionHandler_thread.setDaemon(true); + ArchiveDiskActionHandler.ArchiveDiskActionHandler_thread.start(); + ArchiveDiskActionHandler.ArchiveDiskActionHandler_thread.setPriority(5); + } - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "(I)Lfz;", - garbageValue = "1488138254" - ) - @Export("newClock") - public static Clock newClock() { - try { - return new NanoClock(); - } catch (Throwable var1) { - return new MilliClock(); + ArchiveDiskActionHandler.field3132 = 600; } } - @ObfuscatedName("io") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIIIIIIII)V", - garbageValue = "-57501603" + signature = "([BIII)Ljava/lang/String;", + garbageValue = "2029003644" ) - @Export("drawWidgets") - static final void drawWidgets(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { - if (WorldMapData_0.loadInterface(var0)) { - GrandExchangeOffer.field61 = null; - ScriptEvent.drawInterface(UserComparator5.Widget_interfaceComponents[var0], -1, var1, var2, var3, var4, var5, var6, var7); - if (GrandExchangeOffer.field61 != null) { - ScriptEvent.drawInterface(GrandExchangeOffer.field61, -1412584499, var1, var2, var3, var4, class227.field3061, Occluder.field1889, var7); - GrandExchangeOffer.field61 = null; - } + public static String method1252(byte[] var0, int var1, int var2) { + StringBuilder var3 = new StringBuilder(); - } else { - if (var7 != -1) { - Client.field841[var7] = true; - } else { - for (int var8 = 0; var8 < 100; ++var8) { - Client.field841[var8] = true; + for (int var4 = var1; var4 < var2 + var1; var4 += 3) { + int var5 = var0[var4] & 255; + var3.append(class289.field3636[var5 >>> 2]); + if (var4 < var2 - 1) { + int var6 = var0[var4 + 1] & 255; + var3.append(class289.field3636[(var5 & 3) << 4 | var6 >>> 4]); + if (var4 < var2 - 2) { + int var7 = var0[var4 + 2] & 255; + var3.append(class289.field3636[(var6 & 15) << 2 | var7 >>> 6]).append(class289.field3636[var7 & 63]); + } else { + var3.append(class289.field3636[(var6 & 15) << 2]).append("="); } + } else { + var3.append(class289.field3636[(var5 & 3) << 4]).append("=="); } - } + + return var3.toString(); } } diff --git a/runescape-client/src/main/java/ItemDefinition.java b/runescape-client/src/main/java/ItemDefinition.java index 162694599c..32334a1112 100644 --- a/runescape-client/src/main/java/ItemDefinition.java +++ b/runescape-client/src/main/java/ItemDefinition.java @@ -1,289 +1,297 @@ -import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("it") +@ObfuscatedName("iw") @Implements("ItemDefinition") public class ItemDefinition extends DualNode { - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("ItemDefinition_archive") - static AbstractArchive ItemDefinition_archive; - @ObfuscatedName("q") + public static AbstractArchive ItemDefinition_archive; + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("ItemDefinition_modelArchive") - static AbstractArchive ItemDefinition_modelArchive; + public static AbstractArchive ItemDefinition_modelArchive; + @ObfuscatedName("o") + @Export("ItemDefinition_inMembersWorld") + public static boolean ItemDefinition_inMembersWorld; @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = -917450963 + ) + @Export("ItemDefinition_fileCount") + public static int ItemDefinition_fileCount; + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ItemDefinition_cached") static EvictingDualNodeHashTable ItemDefinition_cached; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ItemDefinition_cachedModels") static EvictingDualNodeHashTable ItemDefinition_cachedModels; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ItemDefinition_cachedSprites") public static EvictingDualNodeHashTable ItemDefinition_cachedSprites; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 1164476445 + intValue = 1655552733 ) @Export("id") public int id; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = -512556695 + intValue = -547612395 ) @Export("model") int model; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("name") public String name; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("recolorFrom") short[] recolorFrom; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("recolorTo") short[] recolorTo; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("retextureFrom") short[] retextureFrom; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("retextureTo") short[] retextureTo; - @ObfuscatedName("s") + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = -1552364581 + intValue = -1315103765 ) @Export("zoom2d") public int zoom2d; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = 850273909 + intValue = -1143032297 ) @Export("xan2d") public int xan2d; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 1701459647 + intValue = 1607504109 ) @Export("yan2d") public int yan2d; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -1211123861 + intValue = -116977677 ) @Export("zan2d") public int zan2d; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = -973833067 + intValue = -2042292023 ) @Export("offsetX2d") public int offsetX2d; - @ObfuscatedName("k") + @ObfuscatedName("y") @ObfuscatedGetter( - intValue = 992637627 + intValue = 234867639 ) @Export("offsetY2d") public int offsetY2d; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @ObfuscatedGetter( - intValue = -1898122861 + intValue = -1650503273 ) @Export("isStackable") public int isStackable; - @ObfuscatedName("az") + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = -187431889 + intValue = -1059176385 ) @Export("price") public int price; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("isMembersOnly") public boolean isMembersOnly; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @Export("groundActions") public String[] groundActions; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @Export("inventoryActions") public String[] inventoryActions; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @ObfuscatedGetter( - intValue = -281574303 + intValue = -908004017 ) @Export("shiftClickIndex") int shiftClickIndex; - @ObfuscatedName("ax") + @ObfuscatedName("av") @ObfuscatedGetter( - intValue = -1611629547 + intValue = 1119226973 ) @Export("maleModel") int maleModel; - @ObfuscatedName("as") + @ObfuscatedName("am") @ObfuscatedGetter( - intValue = -1653428101 + intValue = 87988501 ) @Export("maleModel1") int maleModel1; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = 708775895 + intValue = 1276760375 ) @Export("maleOffset") int maleOffset; - @ObfuscatedName("al") + @ObfuscatedName("ax") @ObfuscatedGetter( - intValue = -472240431 + intValue = 375502763 ) @Export("femaleModel") int femaleModel; - @ObfuscatedName("ad") + @ObfuscatedName("al") @ObfuscatedGetter( - intValue = -774987533 + intValue = 1319608041 ) @Export("femaleModel1") int femaleModel1; - @ObfuscatedName("an") + @ObfuscatedName("ap") @ObfuscatedGetter( - intValue = 839022773 + intValue = -510888703 ) @Export("femaleOffset") int femaleOffset; - @ObfuscatedName("ai") + @ObfuscatedName("aj") @ObfuscatedGetter( - intValue = -629230839 + intValue = -88424051 ) @Export("maleModel2") int maleModel2; - @ObfuscatedName("ak") + @ObfuscatedName("ae") @ObfuscatedGetter( - intValue = -1320032129 + intValue = -733154665 ) @Export("femaleModel2") int femaleModel2; - @ObfuscatedName("aq") + @ObfuscatedName("au") @ObfuscatedGetter( - intValue = 2070739727 + intValue = 197107887 ) @Export("maleHeadModel") int maleHeadModel; - @ObfuscatedName("am") + @ObfuscatedName("ah") @ObfuscatedGetter( - intValue = 1142570821 + intValue = 844874933 ) @Export("maleHeadModel2") int maleHeadModel2; - @ObfuscatedName("ae") + @ObfuscatedName("an") @ObfuscatedGetter( - intValue = -622073101 + intValue = 458940691 ) @Export("femaleHeadModel") int femaleHeadModel; - @ObfuscatedName("av") + @ObfuscatedName("af") @ObfuscatedGetter( - intValue = -1870487091 + intValue = -25035873 ) @Export("femaleHeadModel2") int femaleHeadModel2; - @ObfuscatedName("ah") + @ObfuscatedName("ay") @Export("countobj") int[] countobj; - @ObfuscatedName("ag") + @ObfuscatedName("az") @Export("countco") int[] countco; - @ObfuscatedName("aj") + @ObfuscatedName("ao") @ObfuscatedGetter( - intValue = 2003146835 + intValue = 1406408801 ) @Export("note") public int note; - @ObfuscatedName("ay") + @ObfuscatedName("ai") @ObfuscatedGetter( - intValue = -922094347 + intValue = 1823216111 ) @Export("noteTemplate") public int noteTemplate; - @ObfuscatedName("au") + @ObfuscatedName("ac") @ObfuscatedGetter( - intValue = 146352651 + intValue = 520393867 ) @Export("resizeX") int resizeX; - @ObfuscatedName("af") + @ObfuscatedName("at") @ObfuscatedGetter( - intValue = 1043908831 + intValue = -979555913 ) @Export("resizeY") int resizeY; - @ObfuscatedName("at") + @ObfuscatedName("as") @ObfuscatedGetter( - intValue = -251593053 + intValue = 1214416487 ) @Export("resizeZ") int resizeZ; - @ObfuscatedName("bx") + @ObfuscatedName("ba") @ObfuscatedGetter( - intValue = 427704773 + intValue = -411723185 ) @Export("ambient") public int ambient; - @ObfuscatedName("bh") + @ObfuscatedName("bg") @ObfuscatedGetter( - intValue = 807356389 + intValue = -1454093755 ) @Export("contrast") public int contrast; - @ObfuscatedName("bd") + @ObfuscatedName("bc") @ObfuscatedGetter( - intValue = 850095651 + intValue = 209054149 ) @Export("team") public int team; - @ObfuscatedName("bm") + @ObfuscatedName("bd") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("params") IterableNodeHashTable params; - @ObfuscatedName("bv") + @ObfuscatedName("bx") @Export("isTradable") public boolean isTradable; - @ObfuscatedName("bj") + @ObfuscatedName("bl") @ObfuscatedGetter( - intValue = 1578768163 + intValue = 1627267757 ) @Export("unnotedId") int unnotedId; - @ObfuscatedName("bs") + @ObfuscatedName("bh") @ObfuscatedGetter( - intValue = -407908075 + intValue = -1264367263 ) @Export("notedId") int notedId; - @ObfuscatedName("bz") + @ObfuscatedName("bu") @ObfuscatedGetter( - intValue = -1594376835 + intValue = -233747953 ) @Export("placeholder") public int placeholder; - @ObfuscatedName("bc") + @ObfuscatedName("br") @ObfuscatedGetter( - intValue = -1887741169 + intValue = -1266476401 ) @Export("placeholderTemplate") public int placeholderTemplate; @@ -335,19 +343,19 @@ public class ItemDefinition extends DualNode { this.placeholderTemplate = -1; } - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "1" + signature = "(S)V", + garbageValue = "3136" ) @Export("post") void post() { } - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "32" + signature = "(Lkc;I)V", + garbageValue = "-1200001770" ) @Export("decode") void decode(Buffer var1) { @@ -361,10 +369,10 @@ public class ItemDefinition extends DualNode { } } - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;IB)V", - garbageValue = "7" + signature = "(Lkc;II)V", + garbageValue = "-1546966172" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -483,16 +491,16 @@ public class ItemDefinition extends DualNode { } else if (var2 == 149) { this.placeholderTemplate = var1.readUnsignedShort(); } else if (var2 == 249) { - this.params = UserComparator5.readStringIntParameters(var1, this.params); + this.params = UserComparator10.readStringIntParameters(var1, this.params); } } } - @ObfuscatedName("p") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lit;Lit;B)V", - garbageValue = "126" + signature = "(Liw;Liw;I)V", + garbageValue = "-320255470" ) @Export("genCert") void genCert(ItemDefinition var1, ItemDefinition var2) { @@ -513,10 +521,10 @@ public class ItemDefinition extends DualNode { this.isStackable = 1; } - @ObfuscatedName("q") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lit;Lit;S)V", - garbageValue = "-15779" + signature = "(Liw;Liw;B)V", + garbageValue = "58" ) @Export("genBought") void genBought(ItemDefinition var1, ItemDefinition var2) { @@ -557,10 +565,10 @@ public class ItemDefinition extends DualNode { this.price = 0; } - @ObfuscatedName("m") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Lit;Lit;I)V", - garbageValue = "-2143595462" + signature = "(Liw;Liw;B)V", + garbageValue = "-82" ) @Export("genPlaceholder") void genPlaceholder(ItemDefinition var1, ItemDefinition var2) { @@ -582,10 +590,10 @@ public class ItemDefinition extends DualNode { this.isTradable = false; } - @ObfuscatedName("y") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(IB)Ldw;", - garbageValue = "-102" + signature = "(II)Ldu;", + garbageValue = "-671168801" ) @Export("getModelData") public final ModelData getModelData(int var1) { @@ -600,7 +608,7 @@ public class ItemDefinition extends DualNode { } if (var2 != -1) { - return Occluder.ItemDefinition_get(var2).getModelData(1); + return class222.ItemDefinition_get(var2).getModelData(1); } } @@ -630,8 +638,8 @@ public class ItemDefinition extends DualNode { @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(II)Ldh;", - garbageValue = "1336448754" + signature = "(IB)Ldv;", + garbageValue = "1" ) @Export("getModel") public final Model getModel(int var1) { @@ -645,7 +653,7 @@ public class ItemDefinition extends DualNode { } if (var2 != -1) { - return Occluder.ItemDefinition_get(var2).getModel(1); + return class222.ItemDefinition_get(var2).getModel(1); } } @@ -682,10 +690,10 @@ public class ItemDefinition extends DualNode { } } - @ObfuscatedName("c") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(IB)Lit;", - garbageValue = "23" + signature = "(II)Liw;", + garbageValue = "709794134" ) @Export("getCountObj") public ItemDefinition getCountObj(int var1) { @@ -699,17 +707,17 @@ public class ItemDefinition extends DualNode { } if (var2 != -1) { - return Occluder.ItemDefinition_get(var2); + return class222.ItemDefinition_get(var2); } } return this; } - @ObfuscatedName("a") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(ZI)Z", - garbageValue = "-94789059" + garbageValue = "1539305914" ) @Export("hasNoValidModel") public final boolean hasNoValidModel(boolean var1) { @@ -742,12 +750,12 @@ public class ItemDefinition extends DualNode { } } - @ObfuscatedName("e") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(ZB)Ldw;", - garbageValue = "22" + signature = "(ZI)Ldu;", + garbageValue = "-1635392002" ) - public final ModelData method4605(boolean var1) { + public final ModelData method4790(boolean var1) { int var2 = this.maleModel; int var3 = this.maleModel1; int var4 = this.maleModel2; @@ -798,12 +806,12 @@ public class ItemDefinition extends DualNode { } } - @ObfuscatedName("x") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(ZB)Z", - garbageValue = "100" + signature = "(ZI)Z", + garbageValue = "-2104705818" ) - public final boolean method4623(boolean var1) { + public final boolean method4791(boolean var1) { int var2 = this.maleHeadModel; int var3 = this.maleHeadModel2; if (var1) { @@ -827,12 +835,12 @@ public class ItemDefinition extends DualNode { } } - @ObfuscatedName("h") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(ZI)Ldw;", - garbageValue = "1830989293" + signature = "(ZI)Ldu;", + garbageValue = "1595698517" ) - public final ModelData method4607(boolean var1) { + public final ModelData method4792(boolean var1) { int var2 = this.maleHeadModel; int var3 = this.maleHeadModel2; if (var1) { @@ -867,30 +875,43 @@ public class ItemDefinition extends DualNode { } } - @ObfuscatedName("s") + @ObfuscatedName("j") @ObfuscatedSignature( signature = "(IIB)I", - garbageValue = "59" + garbageValue = "125" ) @Export("getIntParam") public int getIntParam(int var1, int var2) { - return HealthBar.method2034(this.params, var1, var2); + return FriendsList.method5306(this.params, var1, var2); } - @ObfuscatedName("f") + @ObfuscatedName("r") @ObfuscatedSignature( - signature = "(ILjava/lang/String;I)Ljava/lang/String;", - garbageValue = "570180688" + signature = "(ILjava/lang/String;B)Ljava/lang/String;", + garbageValue = "48" ) @Export("getStringParam") public String getStringParam(int var1, String var2) { - return class96.method2263(this.params, var1, var2); + IterableNodeHashTable var4 = this.params; + String var3; + if (var4 == null) { + var3 = var2; + } else { + ObjectNode var5 = (ObjectNode)var4.get((long)var1); + if (var5 == null) { + var3 = var2; + } else { + var3 = (String)var5.obj; + } + } + + return var3; } - @ObfuscatedName("j") + @ObfuscatedName("e") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1424068644" + garbageValue = "1695709278" ) @Export("getShiftClickIndex") public int getShiftClickIndex() { @@ -904,39 +925,4 @@ public class ItemDefinition extends DualNode { return -1; } } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(B)Lbl;", - garbageValue = "66" - ) - static ClientPreferences method4667() { - AccessFile var0 = null; - ClientPreferences var1 = new ClientPreferences(); - - try { - var0 = class185.getPreferencesFile("", class16.field101.name, false); - byte[] var2 = new byte[(int)var0.length()]; - - int var4; - for (int var3 = 0; var3 < var2.length; var3 += var4) { - var4 = var0.read(var2, var3, var2.length - var3); - if (var4 == -1) { - throw new IOException(); - } - } - - var1 = new ClientPreferences(new Buffer(var2)); - } catch (Exception var6) { - } - - try { - if (var0 != null) { - var0.close(); - } - } catch (Exception var5) { - } - - return var1; - } } diff --git a/runescape-client/src/main/java/IterableDualNodeQueue.java b/runescape-client/src/main/java/IterableDualNodeQueue.java index ad54af0030..c56d783f26 100644 --- a/runescape-client/src/main/java/IterableDualNodeQueue.java +++ b/runescape-client/src/main/java/IterableDualNodeQueue.java @@ -4,18 +4,18 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ji") +@ObfuscatedName("jq") @Implements("IterableDualNodeQueue") public class IterableDualNodeQueue implements Iterable { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("sentinel") public DualNode sentinel; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("head") DualNode head; @@ -26,7 +26,7 @@ public class IterableDualNodeQueue implements Iterable { this.sentinel.nextDual = this.sentinel; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("clear") public void clear() { while (this.sentinel.previousDual != this.sentinel) { @@ -35,9 +35,9 @@ public class IterableDualNodeQueue implements Iterable { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lfw;)V" + signature = "(Lfa;)V" ) @Export("add") public void add(DualNode var1) { @@ -51,9 +51,9 @@ public class IterableDualNodeQueue implements Iterable { var1.previousDual.nextDual = var1; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "()Lfw;" + signature = "()Lfa;" ) @Export("removeLast") public DualNode removeLast() { @@ -66,18 +66,18 @@ public class IterableDualNodeQueue implements Iterable { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "()Lfw;" + signature = "()Lfa;" ) @Export("last") public DualNode last() { return this.previousOrLast((DualNode)null); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lfw;)Lfw;" + signature = "(Lfa;)Lfa;" ) @Export("previousOrLast") DualNode previousOrLast(DualNode var1) { @@ -97,9 +97,9 @@ public class IterableDualNodeQueue implements Iterable { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Lfw;" + signature = "()Lfa;" ) @Export("previous") public DualNode previous() { @@ -117,9 +117,9 @@ public class IterableDualNodeQueue implements Iterable { return new IterableDualNodeQueueIterator(this); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lfw;Lfw;)V" + signature = "(Lfa;Lfa;)V" ) @Export("DualNodeDeque_addBefore") public static void DualNodeDeque_addBefore(DualNode var0, DualNode var1) { diff --git a/runescape-client/src/main/java/IterableDualNodeQueueIterator.java b/runescape-client/src/main/java/IterableDualNodeQueueIterator.java index 2cf7576497..22310ad3b9 100644 --- a/runescape-client/src/main/java/IterableDualNodeQueueIterator.java +++ b/runescape-client/src/main/java/IterableDualNodeQueueIterator.java @@ -4,30 +4,30 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jt") +@ObfuscatedName("jd") @Implements("IterableDualNodeQueueIterator") public class IterableDualNodeQueueIterator implements Iterator { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lji;" + signature = "Ljq;" ) @Export("queue") IterableDualNodeQueue queue; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("head") DualNode head; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lfw;" + signature = "Lfa;" ) @Export("last") DualNode last; @ObfuscatedSignature( - signature = "(Lji;)V" + signature = "(Ljq;)V" ) IterableDualNodeQueueIterator(IterableDualNodeQueue var1) { this.last = null; @@ -37,12 +37,8 @@ public class IterableDualNodeQueueIterator implements Iterator { } public void remove() { - if (this.last == null) { - throw new IllegalStateException(); - } else { - this.last.removeDual(); - this.last = null; - } + this.last.removeDual(); + this.last = null; } public boolean hasNext() { diff --git a/runescape-client/src/main/java/IterableNodeDeque.java b/runescape-client/src/main/java/IterableNodeDeque.java index 5643e81910..2836ebba48 100644 --- a/runescape-client/src/main/java/IterableNodeDeque.java +++ b/runescape-client/src/main/java/IterableNodeDeque.java @@ -5,20 +5,20 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("js") +@ObfuscatedName("jm") @Implements("IterableNodeDeque") public class IterableNodeDeque implements Iterable, Collection { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("sentinel") Node sentinel; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) - Node field3521; + Node field3524; public IterableNodeDeque() { this.sentinel = new Node(); @@ -26,7 +26,7 @@ public class IterableNodeDeque implements Iterable, Collection { this.sentinel.next = this.sentinel; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("rsClear") public void rsClear() { while (this.sentinel.previous != this.sentinel) { @@ -35,9 +35,9 @@ public class IterableNodeDeque implements Iterable, Collection { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lfx;)V" + signature = "(Lfd;)V" ) @Export("addFirst") public void addFirst(Node var1) { @@ -51,9 +51,9 @@ public class IterableNodeDeque implements Iterable, Collection { var1.previous.next = var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lfx;)V" + signature = "(Lfd;)V" ) @Export("addLast") public void addLast(Node var1) { @@ -67,20 +67,20 @@ public class IterableNodeDeque implements Iterable, Collection { var1.previous.next = var1; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("last") public Node last() { - return this.method4796((Node)null); + return this.method4954((Node)null); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lfx;)Lfx;" + signature = "(Lfd;)Lfd;" ) - Node method4796(Node var1) { + Node method4954(Node var1) { Node var2; if (var1 == null) { var2 = this.sentinel.previous; @@ -89,32 +89,32 @@ public class IterableNodeDeque implements Iterable, Collection { } if (var2 == this.sentinel) { - this.field3521 = null; + this.field3524 = null; return null; } else { - this.field3521 = var2.previous; + this.field3524 = var2.previous; return var2; } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("previous") public Node previous() { - Node var1 = this.field3521; + Node var1 = this.field3524; if (var1 == this.sentinel) { - this.field3521 = null; + this.field3524 = null; return null; } else { - this.field3521 = var1.previous; + this.field3524 = var1.previous; return var1; } } - @ObfuscatedName("m") - int method4774() { + @ObfuscatedName("o") + int method4956() { int var1 = 0; for (Node var2 = this.sentinel.previous; var2 != this.sentinel; var2 = var2.previous) { @@ -124,17 +124,17 @@ public class IterableNodeDeque implements Iterable, Collection { return var1; } - @ObfuscatedName("y") - public boolean method4775() { + @ObfuscatedName("i") + public boolean method5004() { return this.sentinel.previous == this.sentinel; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "()[Lfx;" + signature = "()[Lfd;" ) - Node[] method4819() { - Node[] var1 = new Node[this.method4774()]; + Node[] method4961() { + Node[] var1 = new Node[this.method4956()]; int var2 = 0; for (Node var3 = this.sentinel.previous; var3 != this.sentinel; var3 = var3.previous) { @@ -144,29 +144,25 @@ public class IterableNodeDeque implements Iterable, Collection { return var1; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(Lfx;)Z" + signature = "(Lfd;)Z" ) - boolean method4778(Node var1) { + boolean method4963(Node var1) { this.addFirst(var1); return true; } - public Iterator iterator() { - return new IterableNodeDequeDescendingIterator(this); - } - public int size() { - return this.method4774(); + return this.method4956(); } public boolean isEmpty() { - return this.method4775(); + return this.method5004(); } - public boolean contains(Object var1) { - throw new RuntimeException(); + public Object[] toArray() { + return this.method4961(); } public Object[] toArray(Object[] var1) { @@ -179,16 +175,16 @@ public class IterableNodeDeque implements Iterable, Collection { return var1; } - public void clear() { - this.rsClear(); + public boolean containsAll(Collection var1) { + throw new RuntimeException(); } - public boolean add(Object var1) { - return this.method4778((Node)var1); + public boolean addAll(Collection var1) { + throw new RuntimeException(); } - public boolean equals(Object var1) { - return super.equals(var1); + public boolean removeAll(Collection var1) { + throw new RuntimeException(); } public boolean retainAll(Collection var1) { @@ -199,11 +195,7 @@ public class IterableNodeDeque implements Iterable, Collection { return super.hashCode(); } - public boolean containsAll(Collection var1) { - throw new RuntimeException(); - } - - public boolean addAll(Collection var1) { + public boolean contains(Object var1) { throw new RuntimeException(); } @@ -211,17 +203,25 @@ public class IterableNodeDeque implements Iterable, Collection { throw new RuntimeException(); } - public Object[] toArray() { - return this.method4819(); + public void clear() { + this.rsClear(); } - public boolean removeAll(Collection var1) { - throw new RuntimeException(); + public boolean add(Object var1) { + return this.method4963((Node)var1); } - @ObfuscatedName("u") + public Iterator iterator() { + return new IterableNodeDequeDescendingIterator(this); + } + + public boolean equals(Object var1) { + return super.equals(var1); + } + + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lfx;Lfx;)V" + signature = "(Lfd;Lfd;)V" ) @Export("IterableNodeDeque_addBefore") public static void IterableNodeDeque_addBefore(Node var0, Node var1) { diff --git a/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java b/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java index cd8b2c8380..2ead8f581b 100644 --- a/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java +++ b/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java @@ -4,38 +4,38 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jx") +@ObfuscatedName("jk") @Implements("IterableNodeDequeDescendingIterator") public class IterableNodeDequeDescendingIterator implements Iterator { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ljs;" + signature = "Ljm;" ) @Export("deque") IterableNodeDeque deque; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lfd;" + ) + Node field3535; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lfx;" - ) - Node field3531; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("last") Node last; @ObfuscatedSignature( - signature = "(Ljs;)V" + signature = "(Ljm;)V" ) IterableNodeDequeDescendingIterator(IterableNodeDeque var1) { this.last = null; this.setDeque(var1); } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(Ljs;)V" + signature = "(Ljm;)V" ) @Export("setDeque") void setDeque(IterableNodeDeque var1) { @@ -43,13 +43,17 @@ public class IterableNodeDequeDescendingIterator implements Iterator { this.start(); } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("start") void start() { - this.field3531 = this.deque != null ? this.deque.sentinel.previous : null; + this.field3535 = this.deque != null ? this.deque.sentinel.previous : null; this.last = null; } + public boolean hasNext() { + return this.deque.sentinel != this.field3535; + } + public void remove() { if (this.last == null) { throw new IllegalStateException(); @@ -60,19 +64,15 @@ public class IterableNodeDequeDescendingIterator implements Iterator { } public Object next() { - Node var1 = this.field3531; + Node var1 = this.field3535; if (var1 == this.deque.sentinel) { var1 = null; - this.field3531 = null; + this.field3535 = null; } else { - this.field3531 = var1.previous; + this.field3535 = var1.previous; } this.last = var1; return var1; } - - public boolean hasNext() { - return this.deque.sentinel != this.field3531; - } } diff --git a/runescape-client/src/main/java/IterableNodeHashTable.java b/runescape-client/src/main/java/IterableNodeHashTable.java index ba7ae2736b..a7dd868937 100644 --- a/runescape-client/src/main/java/IterableNodeHashTable.java +++ b/runescape-client/src/main/java/IterableNodeHashTable.java @@ -4,31 +4,31 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lb") +@ObfuscatedName("lr") @Implements("IterableNodeHashTable") public final class IterableNodeHashTable implements Iterable { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("size") int size; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "[Lfx;" + signature = "[Lfd;" ) @Export("buckets") Node[] buckets; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("currentGet") Node currentGet; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("current") Node current; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("index") int index; @@ -45,9 +45,9 @@ public final class IterableNodeHashTable implements Iterable { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(J)Lfx;" + signature = "(J)Lfd;" ) @Export("get") public Node get(long var1) { @@ -65,9 +65,9 @@ public final class IterableNodeHashTable implements Iterable { return null; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lfx;J)V" + signature = "(Lfd;J)V" ) @Export("put") public void put(Node var1, long var2) { @@ -83,7 +83,7 @@ public final class IterableNodeHashTable implements Iterable { var1.key = var2; } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("clear") public void clear() { for (int var1 = 0; var1 < this.size; ++var1) { @@ -103,9 +103,9 @@ public final class IterableNodeHashTable implements Iterable { this.current = null; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("first") public Node first() { @@ -113,9 +113,9 @@ public final class IterableNodeHashTable implements Iterable { return this.next(); } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("next") public Node next() { diff --git a/runescape-client/src/main/java/IterableNodeHashTableIterator.java b/runescape-client/src/main/java/IterableNodeHashTableIterator.java index 65752707ed..a65474f662 100644 --- a/runescape-client/src/main/java/IterableNodeHashTableIterator.java +++ b/runescape-client/src/main/java/IterableNodeHashTableIterator.java @@ -4,33 +4,33 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ls") +@ObfuscatedName("ll") @Implements("IterableNodeHashTableIterator") public class IterableNodeHashTableIterator implements Iterator { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("hashTable") IterableNodeHashTable hashTable; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("head") Node head; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("index") int index; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("last") Node last; @ObfuscatedSignature( - signature = "(Llb;)V" + signature = "(Llr;)V" ) IterableNodeHashTableIterator(IterableNodeHashTable var1) { this.last = null; @@ -38,7 +38,7 @@ public class IterableNodeHashTableIterator implements Iterator { this.start(); } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("start") void start() { this.head = this.hashTable.buckets[0].previous; @@ -46,15 +46,6 @@ public class IterableNodeHashTableIterator implements Iterator { this.last = null; } - public void remove() { - if (this.last == null) { - throw new IllegalStateException(); - } else { - this.last.remove(); - this.last = null; - } - } - public Object next() { Node var1; if (this.hashTable.buckets[this.index - 1] != this.head) { @@ -93,4 +84,13 @@ public class IterableNodeHashTableIterator implements Iterator { return false; } } + + public void remove() { + if (this.last == null) { + throw new IllegalStateException(); + } else { + this.last.remove(); + this.last = null; + } + } } diff --git a/runescape-client/src/main/java/JagexCache.java b/runescape-client/src/main/java/JagexCache.java index 58620f7531..bbf1f8a5ab 100644 --- a/runescape-client/src/main/java/JagexCache.java +++ b/runescape-client/src/main/java/JagexCache.java @@ -8,42 +8,44 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("fh") @Implements("JagexCache") public class JagexCache { - @ObfuscatedName("u") - @Export("JagexCache_locationFile") - static File JagexCache_locationFile; - @ObfuscatedName("p") + @ObfuscatedName("v") + @Export("cacheDir") + static File cacheDir; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 34524443 + intValue = 642051021 ) @Export("idxCount") - public static int idxCount; - @ObfuscatedName("y") + static int idxCount; + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -424456649 + intValue = 1587061671 ) - @Export("ItemDefinition_fileCount") - public static int ItemDefinition_fileCount; - @ObfuscatedName("b") + static int field2030; + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lmm;" + signature = "Lmz;" ) @Export("JagexCache_randomDat") public static BufferedFile JagexCache_randomDat; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lmm;" + signature = "Lmz;" ) @Export("JagexCache_dat2File") public static BufferedFile JagexCache_dat2File; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lmm;" + signature = "Lmz;" ) @Export("JagexCache_idx255File") public static BufferedFile JagexCache_idx255File; - @ObfuscatedName("j") - @Export("userHomeDirectory") - public static String userHomeDirectory; + @ObfuscatedName("br") + @ObfuscatedSignature( + signature = "[Llw;" + ) + @Export("worldSelectFlagSprites") + static IndexedSprite[] worldSelectFlagSprites; static { JagexCache_randomDat = null; @@ -51,26 +53,16 @@ public class JagexCache { JagexCache_idx255File = null; } - @ObfuscatedName("z") + @ObfuscatedName("gy") @ObfuscatedSignature( - signature = "(IB)Lir;", - garbageValue = "62" + signature = "(I)V", + garbageValue = "1986411014" ) - @Export("StructDefinition_getStructDefinition") - public static StructDefinition StructDefinition_getStructDefinition(int var0) { - StructDefinition var1 = (StructDefinition)StructDefinition.StructDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = StructDefinition.StructDefinition_archive.takeFile(34, var0); - var1 = new StructDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); - } - - var1.postDecode(); - StructDefinition.StructDefinition_cached.put(var1, (long)var0); - return var1; + static void method3624() { + if (Login.worldMap != null) { + Login.worldMap.method6437(Player.Scene_plane, UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7), HealthBar.baseY * 64 + (class215.localPlayer.y >> 7), false); + Login.worldMap.loadCache(); } + } } diff --git a/runescape-client/src/main/java/KeyHandler.java b/runescape-client/src/main/java/KeyHandler.java index 515a356c44..3bae8c6157 100644 --- a/runescape-client/src/main/java/KeyHandler.java +++ b/runescape-client/src/main/java/KeyHandler.java @@ -1,98 +1,104 @@ +import java.awt.Component; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import java.util.Iterator; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; +import net.runelite.rs.Reflection; -@ObfuscatedName("ah") +@ObfuscatedName("ay") @Implements("KeyHandler") public final class KeyHandler implements KeyListener, FocusListener { - @ObfuscatedName("oc") + @ObfuscatedName("oa") @ObfuscatedSignature( - signature = "Lft;" + signature = "Lfl;" ) @Export("mouseWheel") static MouseWheel mouseWheel; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lah;" + signature = "Lay;" ) @Export("KeyHandler_instance") public static KeyHandler KeyHandler_instance; - @ObfuscatedName("cy") + @ObfuscatedName("cl") @Export("KeyHandler_pressedKeys") public static boolean[] KeyHandler_pressedKeys; - @ObfuscatedName("cj") - public static char field381; - @ObfuscatedName("cr") - public static int[] field365; - @ObfuscatedName("ct") - @ObfuscatedGetter( - intValue = 1575072845 - ) - public static int field372; - @ObfuscatedName("ci") - @ObfuscatedGetter( - intValue = -939573745 - ) - public static int field373; - @ObfuscatedName("cu") - static char[] field374; - @ObfuscatedName("ce") - static int[] field375; - @ObfuscatedName("cc") - public static int[] field376; - @ObfuscatedName("cl") - @ObfuscatedGetter( - intValue = 1675440071 - ) - public static int field361; - @ObfuscatedName("cw") - @ObfuscatedGetter( - intValue = -1686544141 - ) - public static int field378; + @ObfuscatedName("cz") + public static int[] field378; @ObfuscatedName("cq") @ObfuscatedGetter( - intValue = 900188775 + intValue = -2036425657 ) - public static int field371; - @ObfuscatedName("ca") + public static int field379; + @ObfuscatedName("cj") @ObfuscatedGetter( - intValue = -1429227913 + intValue = -900076009 ) public static int field380; - @ObfuscatedName("cf") + @ObfuscatedName("cm") + static char[] field381; + @ObfuscatedName("cb") + static int[] field382; + @ObfuscatedName("cp") + public static int[] field383; + @ObfuscatedName("cs") @ObfuscatedGetter( - intValue = -844580135 + intValue = 1760182155 + ) + public static int field384; + @ObfuscatedName("ck") + @ObfuscatedGetter( + intValue = -1088731015 + ) + public static int field385; + @ObfuscatedName("ct") + @ObfuscatedGetter( + intValue = -1306175843 + ) + public static int field387; + @ObfuscatedName("cc") + @ObfuscatedGetter( + intValue = 1559093381 + ) + public static int field370; + @ObfuscatedName("ch") + @ObfuscatedGetter( + intValue = 1888243371 ) @Export("KeyHandler_idleCycles") public static volatile int KeyHandler_idleCycles; - @ObfuscatedName("cx") + @ObfuscatedName("cg") @Export("KeyHandler_keyCodes") static int[] KeyHandler_keyCodes; + @ObfuscatedName("km") + @ObfuscatedGetter( + intValue = 166190927 + ) + @Export("menuWidth") + static int menuWidth; static { KeyHandler_instance = new KeyHandler(); KeyHandler_pressedKeys = new boolean[112]; - field365 = new int[128]; - field372 = 0; - field373 = 0; - field374 = new char[128]; - field375 = new int[128]; - field376 = new int[128]; - field361 = 0; - field378 = 0; - field371 = 0; + field378 = new int[128]; + field379 = 0; field380 = 0; + field381 = new char[128]; + field382 = new int[128]; + field383 = new int[128]; + field384 = 0; + field385 = 0; + field387 = 0; + field370 = 0; KeyHandler_idleCycles = 0; - KeyHandler_keyCodes = new int[]{-1, -1, -1, -1, -1, -1, -1, -1, 85, 80, 84, -1, 91, -1, -1, -1, 81, 82, 86, -1, -1, -1, -1, -1, -1, -1, -1, 13, -1, -1, -1, -1, 83, 104, 105, 103, 102, 96, 98, 97, 99, -1, -1, -1, -1, -1, -1, -1, 25, 16, 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, 48, 68, 66, 50, 34, 51, 52, 53, 39, 54, 55, 56, 70, 69, 40, 41, 32, 35, 49, 36, 38, 67, 33, 65, 37, 64, -1, -1, -1, -1, -1, 228, 231, 227, 233, 224, 219, 225, 230, 226, 232, 89, 87, -1, 88, 229, 90, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; + KeyHandler_keyCodes = new int[]{-1, -1, -1, -1, -1, -1, -1, -1, 85, 80, 84, -1, 91, -1, -1, -1, 81, 82, 86, -1, -1, -1, -1, -1, -1, -1, -1, 13, -1, -1, -1, -1, 83, 104, 105, 103, 102, 96, 98, 97, 99, -1, -1, -1, -1, -1, -1, -1, 25, 16, 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, 48, 68, 66, 50, 34, 51, 52, 53, 39, 54, 55, 56, 70, 69, 40, 41, 32, 35, 49, 36, 38, 67, 33, 65, 37, 64, -1, -1, -1, -1, -1, 228, 231, 227, 233, 224, 219, 225, 230, 226, 232, 89, 87, -1, 88, 229, 90, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 100, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; } KeyHandler() { @@ -107,11 +113,11 @@ public final class KeyHandler implements KeyListener, FocusListener { var2 = -1; } - if (field373 >= 0 && var2 >= 0) { - field365[field373] = ~var2; - field373 = field373 + 1 & 127; - if (field373 == field372) { - field373 = -1; + if (field380 >= 0 && var2 >= 0) { + field378[field380] = ~var2; + field380 = field380 + 1 & 127; + if (field380 == field379) { + field380 = -1; } } } @@ -122,13 +128,6 @@ public final class KeyHandler implements KeyListener, FocusListener { public final void focusGained(FocusEvent var1) { } - public final synchronized void focusLost(FocusEvent var1) { - if (KeyHandler_instance != null) { - field373 = -1; - } - - } - public final synchronized void keyPressed(KeyEvent var1) { if (KeyHandler_instance != null) { int var2 = var1.getKeyCode(); @@ -141,21 +140,21 @@ public final class KeyHandler implements KeyListener, FocusListener { var2 = -1; } - if (field373 >= 0 && var2 >= 0) { - field365[field373] = var2; - field373 = field373 + 1 & 127; - if (field372 == field373) { - field373 = -1; + if (field380 >= 0 && var2 >= 0) { + field378[field380] = var2; + field380 = field380 + 1 & 127; + if (field379 == field380) { + field380 = -1; } } int var3; if (var2 >= 0) { - var3 = field371 + 1 & 127; - if (var3 != field378) { - field375[field371] = var2; - field374[field371] = 0; - field371 = var3; + var3 = field387 + 1 & 127; + if (var3 != field385) { + field382[field387] = var2; + field381[field387] = 0; + field387 = var3; } } @@ -167,15 +166,45 @@ public final class KeyHandler implements KeyListener, FocusListener { } + public final synchronized void focusLost(FocusEvent var1) { + if (KeyHandler_instance != null) { + field380 = -1; + } + + } + public final void keyTyped(KeyEvent var1) { if (KeyHandler_instance != null) { char var2 = var1.getKeyChar(); - if (var2 != 0 && var2 != '\uffff' && LoginScreenAnimation.method1843(var2)) { - int var3 = field371 + 1 & 127; - if (var3 != field378) { - field375[field371] = -1; - field374[field371] = var2; - field371 = var3; + if (var2 != 0 && var2 != '\uffff') { + boolean var3; + if (var2 > 0 && var2 < 128 || var2 >= 160 && var2 <= 255) { + var3 = true; + } else { + label58: { + if (var2 != 0) { + char[] var7 = class287.cp1252AsciiExtension; + + for (int var5 = 0; var5 < var7.length; ++var5) { + char var6 = var7[var5]; + if (var6 == var2) { + var3 = true; + break label58; + } + } + } + + var3 = false; + } + } + + if (var3) { + int var4 = field387 + 1 & 127; + if (var4 != field385) { + field382[field387] = -1; + field381[field387] = var2; + field387 = var4; + } } } } @@ -183,1251 +212,162 @@ public final class KeyHandler implements KeyListener, FocusListener { var1.consume(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;I)V", - garbageValue = "1410088025" + signature = "(Ljava/awt/Component;I)V", + garbageValue = "1986559270" ) - @Export("InvDefinition_setArchives") - public static void InvDefinition_setArchives(AbstractArchive var0) { - InvDefinition.InvDefinition_archive = var0; + static void method914(Component var0) { + var0.removeMouseListener(MouseHandler.MouseHandler_instance); + var0.removeMouseMotionListener(MouseHandler.MouseHandler_instance); + var0.removeFocusListener(MouseHandler.MouseHandler_instance); + MouseHandler.MouseHandler_currentButtonVolatile = 0; } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lba;IB)V", - garbageValue = "0" + signature = "(Lkc;II)V", + garbageValue = "290450764" ) - @Export("runScript") - static void runScript(ScriptEvent var0, int var1) { - Object[] var2 = var0.args; - Script var3; - int var17; - if (Strings.isWorldMapEvent(var0.type)) { - EnumDefinition.worldMapEvent = (WorldMapEvent)var2[0]; - WorldMapElement var4 = Decimator.WorldMapElement_get(EnumDefinition.worldMapEvent.mapElement); - var3 = class42.getWorldMapScript(var0.type, var4.objectId, var4.category); - } else { - var17 = (Integer)var2[0]; - var3 = LoginPacket.getScript(var17); - } - - if (var3 != null) { - Interpreter.Interpreter_intStackSize = 0; - Interpreter.Interpreter_stringStackSize = 0; - var17 = -1; - int[] var5 = var3.opcodes; - int[] var6 = var3.intOperands; - byte var7 = -1; - Interpreter.Interpreter_frameDepth = 0; - Interpreter.field1074 = false; + @Export("readReflectionCheck") + public static void readReflectionCheck(Buffer var0, int var1) { + ReflectionCheck var2 = new ReflectionCheck(); + var2.size = var0.readUnsignedByte(); + var2.id = var0.readInt(); + var2.operations = new int[var2.size]; + var2.creationErrors = new int[var2.size]; + var2.fields = new Field[var2.size]; + var2.intReplaceValues = new int[var2.size]; + var2.methods = new Method[var2.size]; + var2.arguments = new byte[var2.size][][]; + for (int var3 = 0; var3 < var2.size; ++var3) { try { - int var10; - try { - Interpreter.Interpreter_intLocals = new int[var3.localIntCount]; - int var8 = 0; - UrlRequester.Interpreter_stringLocals = new String[var3.localStringCount]; - int var9 = 0; + int var4 = var0.readUnsignedByte(); + String var5; + String var6; + int var7; + if (var4 != 0 && var4 != 1 && var4 != 2) { + if (var4 == 3 || var4 == 4) { + var5 = var0.readStringCp1252NullTerminated(); + var6 = var0.readStringCp1252NullTerminated(); + var7 = var0.readUnsignedByte(); + String[] var8 = new String[var7]; - int var11; - String var18; - for (var10 = 1; var10 < var2.length; ++var10) { - if (var2[var10] instanceof Integer) { - var11 = (Integer)var2[var10]; - if (var11 == -2147483647) { - var11 = var0.mouseX; - } - - if (var11 == -2147483646) { - var11 = var0.mouseY; - } - - if (var11 == -2147483645) { - var11 = var0.widget != null ? var0.widget.id : -1; - } - - if (var11 == -2147483644) { - var11 = var0.opIndex; - } - - if (var11 == -2147483643) { - var11 = var0.widget != null ? var0.widget.childIndex : -1; - } - - if (var11 == -2147483642) { - var11 = var0.dragTarget != null ? var0.dragTarget.id : -1; - } - - if (var11 == -2147483641) { - var11 = var0.dragTarget != null ? var0.dragTarget.childIndex : -1; - } - - if (var11 == -2147483640) { - var11 = var0.keyTyped; - } - - if (var11 == -2147483639) { - var11 = var0.keyPressed; - } - - Interpreter.Interpreter_intLocals[var8++] = var11; - } else if (var2[var10] instanceof String) { - var18 = (String)var2[var10]; - if (var18.equals("event_opbase")) { - var18 = var0.targetName; - } - - UrlRequester.Interpreter_stringLocals[var9++] = var18; - } - } - - var10 = 0; - Interpreter.field1089 = var0.field568; - - while (true) { - ++var10; - if (var10 > var1) { - throw new RuntimeException(); + for (int var9 = 0; var9 < var7; ++var9) { + var8[var9] = var0.readStringCp1252NullTerminated(); } - ++var17; - int var29 = var5[var17]; - int var20; - if (var29 >= 100) { - boolean var32; - if (var3.intOperands[var17] == 1) { - var32 = true; - } else { - var32 = false; - } - - var20 = TileItem.method2129(var29, var3, var32); - switch(var20) { - case 0: - return; - case 1: - default: - break; - case 2: - throw new IllegalStateException(); - } - } else if (var29 == ScriptOpcodes.ICONST) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6[var17]; - } else if (var29 == ScriptOpcodes.GET_VARP) { - var11 = var6[var17]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Varps.Varps_main[var11]; - } else if (var29 == ScriptOpcodes.SET_VARP) { - var11 = var6[var17]; - Varps.Varps_main[var11] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - NetSocket.method3472(var11); - } else if (var29 == ScriptOpcodes.SCONST) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.stringOperands[var17]; - } else if (var29 == ScriptOpcodes.JUMP) { - var17 += var6[var17]; - } else if (var29 == ScriptOpcodes.IF_ICMPNE) { - Interpreter.Interpreter_intStackSize -= 2; - if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] != Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { - var17 += var6[var17]; - } - } else if (var29 == ScriptOpcodes.IF_ICMPEQ) { - Interpreter.Interpreter_intStackSize -= 2; - if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] == Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { - var17 += var6[var17]; - } - } else if (var29 == ScriptOpcodes.IF_ICMPLT) { - Interpreter.Interpreter_intStackSize -= 2; - if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] < Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { - var17 += var6[var17]; - } - } else if (var29 == ScriptOpcodes.IF_ICMPGT) { - Interpreter.Interpreter_intStackSize -= 2; - if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] > Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { - var17 += var6[var17]; - } - } else if (var29 == ScriptOpcodes.RETURN) { - if (Interpreter.Interpreter_frameDepth == 0) { - return; - } - - ScriptFrame var34 = Interpreter.Interpreter_frames[--Interpreter.Interpreter_frameDepth]; - var3 = var34.script; - var5 = var3.opcodes; - var6 = var3.intOperands; - var17 = var34.pc; - Interpreter.Interpreter_intLocals = var34.intLocals; - UrlRequester.Interpreter_stringLocals = var34.stringLocals; - } else if (var29 == ScriptOpcodes.GET_VARBIT) { - var11 = var6[var17]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapSprite.getVarbit(var11); - } else if (var29 == ScriptOpcodes.SET_VARBIT) { - var11 = var6[var17]; - WorldMapElement.method4360(var11, Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - } else if (var29 == ScriptOpcodes.IF_ICMPLE) { - Interpreter.Interpreter_intStackSize -= 2; - if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] <= Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { - var17 += var6[var17]; - } - } else if (var29 == ScriptOpcodes.IF_ICMPGE) { - Interpreter.Interpreter_intStackSize -= 2; - if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] >= Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { - var17 += var6[var17]; - } - } else if (var29 == ScriptOpcodes.ILOAD) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Interpreter.Interpreter_intLocals[var6[var17]]; - } else if (var29 == ScriptOpcodes.ISTORE) { - Interpreter.Interpreter_intLocals[var6[var17]] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - } else if (var29 == ScriptOpcodes.SLOAD) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = UrlRequester.Interpreter_stringLocals[var6[var17]]; - } else if (var29 == ScriptOpcodes.SSTORE) { - UrlRequester.Interpreter_stringLocals[var6[var17]] = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - } else if (var29 == ScriptOpcodes.JOIN_STRING) { - var11 = var6[var17]; - Interpreter.Interpreter_stringStackSize -= var11; - String var31 = FloorOverlayDefinition.method4716(Interpreter.Interpreter_stringStack, Interpreter.Interpreter_stringStackSize, var11); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var31; - } else if (var29 == ScriptOpcodes.POP_INT) { - --Interpreter.Interpreter_intStackSize; - } else if (var29 == ScriptOpcodes.POP_STRING) { - --Interpreter.Interpreter_stringStackSize; - } else { - int var15; - if (var29 != ScriptOpcodes.INVOKE) { - if (var29 == ScriptOpcodes.GET_VARC_INT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class197.varcs.getInt(var6[var17]); - } else if (var29 == ScriptOpcodes.SET_VARC_INT) { - class197.varcs.setInt(var6[var17], Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - } else if (var29 == ScriptOpcodes.DEFINE_ARRAY) { - var11 = var6[var17] >> 16; - var20 = var6[var17] & 65535; - int var21 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var21 < 0 || var21 > 5000) { - throw new RuntimeException(); - } - - Interpreter.Interpreter_arrayLengths[var11] = var21; - byte var22 = -1; - if (var20 == 105) { - var22 = 0; - } - - for (var15 = 0; var15 < var21; ++var15) { - Interpreter.Interpreter_arrays[var11][var15] = var22; - } - } else if (var29 == ScriptOpcodes.GET_ARRAY_INT) { - var11 = var6[var17]; - var20 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var20 < 0 || var20 >= Interpreter.Interpreter_arrayLengths[var11]) { - throw new RuntimeException(); - } - - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Interpreter.Interpreter_arrays[var11][var20]; - } else if (var29 == ScriptOpcodes.SET_ARRAY_INT) { - var11 = var6[var17]; - Interpreter.Interpreter_intStackSize -= 2; - var20 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - if (var20 < 0 || var20 >= Interpreter.Interpreter_arrayLengths[var11]) { - throw new RuntimeException(); - } - - Interpreter.Interpreter_arrays[var11][var20] = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - } else if (var29 == ScriptOpcodes.GET_VARC_STRING_OLD) { - var18 = class197.varcs.getStringOld(var6[var17]); - if (var18 == null) { - var18 = "null"; - } - - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var18; - } else if (var29 == ScriptOpcodes.SET_VARC_STRING_OLD) { - class197.varcs.setStringOld(var6[var17], Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]); - } else if (var29 == ScriptOpcodes.GET_VARC_STRING) { - var18 = class197.varcs.getString(var6[var17]); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var18; - } else if (var29 == ScriptOpcodes.SET_VARC_STRING) { - class197.varcs.setString(var6[var17], Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]); - } else { - if (var29 != ScriptOpcodes.SWITCH) { - throw new IllegalStateException(); - } - - IterableNodeHashTable var33 = var3.switches[var6[var17]]; - IntegerNode var30 = (IntegerNode)var33.get((long)Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - if (var30 != null) { - var17 += var30.integer; - } - } - } else { - var11 = var6[var17]; - Script var12 = LoginPacket.getScript(var11); - int[] var13 = new int[var12.localIntCount]; - String[] var14 = new String[var12.localStringCount]; - - for (var15 = 0; var15 < var12.intArgumentCount; ++var15) { - var13[var15] = Interpreter.Interpreter_intStack[var15 + (Interpreter.Interpreter_intStackSize - var12.intArgumentCount)]; - } - - for (var15 = 0; var15 < var12.stringArgumentCount; ++var15) { - var14[var15] = Interpreter.Interpreter_stringStack[var15 + (Interpreter.Interpreter_stringStackSize - var12.stringArgumentCount)]; - } - - Interpreter.Interpreter_intStackSize -= var12.intArgumentCount; - Interpreter.Interpreter_stringStackSize -= var12.stringArgumentCount; - ScriptFrame var19 = new ScriptFrame(); - var19.script = var3; - var19.pc = var17; - var19.intLocals = Interpreter.Interpreter_intLocals; - var19.stringLocals = UrlRequester.Interpreter_stringLocals; - Interpreter.Interpreter_frames[++Interpreter.Interpreter_frameDepth - 1] = var19; - var3 = var12; - var5 = var12.opcodes; - var6 = var12.intOperands; - var17 = -1; - Interpreter.Interpreter_intLocals = var13; - UrlRequester.Interpreter_stringLocals = var14; + String var20 = var0.readStringCp1252NullTerminated(); + byte[][] var10 = new byte[var7][]; + int var12; + if (var4 == 3) { + for (int var11 = 0; var11 < var7; ++var11) { + var12 = var0.readInt(); + var10[var11] = new byte[var12]; + var0.readBytes(var10[var11], 0, var12); } } - } - } catch (Exception var27) { - StringBuilder var24 = new StringBuilder(30); - var24.append("").append(var3.key).append(" "); - for (var10 = Interpreter.Interpreter_frameDepth - 1; var10 >= 0; --var10) { - var24.append("").append(Interpreter.Interpreter_frames[var10].script.key).append(" "); + var2.operations[var3] = var4; + Class[] var21 = new Class[var7]; + + for (var12 = 0; var12 < var7; ++var12) { + var21[var12] = FontName.loadClassFromDescriptor(var8[var12]); + } + + Class var22 = FontName.loadClassFromDescriptor(var20); + if (FontName.loadClassFromDescriptor(var5).getClassLoader() == null) { + throw new SecurityException(); + } + + Method[] var13 = FontName.loadClassFromDescriptor(var5).getDeclaredMethods(); + Method[] var14 = var13; + + for (int var15 = 0; var15 < var14.length; ++var15) { + Method var16 = var14[var15]; + if (Reflection.getMethodName(var16).equals(var6)) { + Class[] var17 = Reflection.getParameterTypes(var16); + if (var21.length == var17.length) { + boolean var18 = true; + + for (int var19 = 0; var19 < var21.length; ++var19) { + if (var21[var19] != var17[var19]) { + var18 = false; + break; + } + } + + if (var18 && var22 == var16.getReturnType()) { + var2.methods[var3] = var16; + } + } + } + } + + var2.arguments[var3] = var10; + } + } else { + var5 = var0.readStringCp1252NullTerminated(); + var6 = var0.readStringCp1252NullTerminated(); + var7 = 0; + if (var4 == 1) { + var7 = var0.readInt(); } - var24.append("").append(var7); - class32.RunException_sendStackTrace(var24.toString(), var27); + var2.operations[var3] = var4; + var2.intReplaceValues[var3] = var7; + if (FontName.loadClassFromDescriptor(var5).getClassLoader() == null) { + throw new SecurityException(); + } + + var2.fields[var3] = Reflection.findField(FontName.loadClassFromDescriptor(var5), var6); } - } finally { - if (Interpreter.field1074) { - Interpreter.field1075 = true; - class51.method922(); - Interpreter.field1075 = false; - Interpreter.field1074 = false; - } - + } catch (ClassNotFoundException var24) { + var2.creationErrors[var3] = -1; + } catch (SecurityException var25) { + var2.creationErrors[var3] = -2; + } catch (NullPointerException var26) { + var2.creationErrors[var3] = -3; + } catch (Exception var27) { + var2.creationErrors[var3] = -4; + } catch (Throwable var28) { + var2.creationErrors[var3] = -5; } } + + class96.reflectionChecks.addFirst(var2); } - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "96" - ) - static void method873() { - Iterator var0 = Messages.Messages_hashTable.iterator(); - - while (var0.hasNext()) { - Message var1 = (Message)var0.next(); - var1.clearIsFromFriend(); - } - - } - - @ObfuscatedName("gk") + @ObfuscatedName("gu") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "133309082" + garbageValue = "1922573072" ) - static final void method851() { - GrandExchangeOffer.method129(false); - Client.field689 = 0; - boolean var0 = true; + static final void method913() { + int[] var0 = Players.Players_indices; int var1; - for (var1 = 0; var1 < WorldMapIcon_1.regionLandArchives.length; ++var1) { - if (class197.regionMapArchiveIds[var1] != -1 && WorldMapIcon_1.regionLandArchives[var1] == null) { - WorldMapIcon_1.regionLandArchives[var1] = class3.archive5.takeFile(class197.regionMapArchiveIds[var1], 0); - if (WorldMapIcon_1.regionLandArchives[var1] == null) { - var0 = false; - ++Client.field689; - } - } - - if (class60.regionLandArchiveIds[var1] != -1 && ArchiveLoader.regionMapArchives[var1] == null) { - ArchiveLoader.regionMapArchives[var1] = class3.archive5.takeFileEncrypted(class60.regionLandArchiveIds[var1], 0, class296.xteaKeys[var1]); - if (ArchiveLoader.regionMapArchives[var1] == null) { - var0 = false; - ++Client.field689; + for (var1 = 0; var1 < Players.Players_count; ++var1) { + Player var2 = Client.players[var0[var1]]; + if (var2 != null && var2.overheadTextCyclesRemaining > 0) { + --var2.overheadTextCyclesRemaining; + if (var2.overheadTextCyclesRemaining == 0) { + var2.overheadText = null; } } } - if (!var0) { - Client.field693 = 1; - } else { - Client.field691 = 0; - var0 = true; - - int var3; - int var4; - Buffer var8; - int var9; - int var10; - int var11; - int var13; - int var14; - int var15; - int var16; - int var17; - int var18; - for (var1 = 0; var1 < WorldMapIcon_1.regionLandArchives.length; ++var1) { - byte[] var2 = ArchiveLoader.regionMapArchives[var1]; - if (var2 != null) { - var3 = (MouseHandler.regions[var1] >> 8) * 64 - class223.baseX * 64; - var4 = (MouseHandler.regions[var1] & 255) * 64 - class286.baseY * 64; - if (Client.isInInstance) { - var3 = 10; - var4 = 10; - } - - boolean var7 = true; - var8 = new Buffer(var2); - var9 = -1; - - label1329: - while (true) { - var10 = var8.method5457(); - if (var10 == 0) { - var0 &= var7; - break; - } - - var9 += var10; - var11 = 0; - boolean var12 = false; - - while (true) { - while (!var12) { - var13 = var8.readUShortSmart(); - if (var13 == 0) { - continue label1329; - } - - var11 += var13 - 1; - var14 = var11 & 63; - var15 = var11 >> 6 & 63; - var16 = var8.readUnsignedByte() >> 2; - var17 = var3 + var15; - var18 = var4 + var14; - if (var17 > 0 && var18 > 0 && var17 < 103 && var18 < 103) { - ObjectDefinition var19 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var9); - if (var16 != 22 || !Client.isLowDetail || var19.int1 != 0 || var19.interactType == 1 || var19.boolean2) { - if (!var19.needsModelFiles()) { - ++Client.field691; - var7 = false; - } - - var12 = true; - } - } - } - - var13 = var8.readUShortSmart(); - if (var13 == 0) { - break; - } - - var8.readUnsignedByte(); - } - } + for (var1 = 0; var1 < Client.npcCount; ++var1) { + int var4 = Client.npcIndices[var1]; + NPC var3 = Client.npcs[var4]; + if (var3 != null && var3.overheadTextCyclesRemaining > 0) { + --var3.overheadTextCyclesRemaining; + if (var3.overheadTextCyclesRemaining == 0) { + var3.overheadText = null; } } - - if (!var0) { - Client.field693 = 2; - } else { - if (Client.field693 != 0) { - WorldMapSprite.drawLoadingMessage("Loading - please wait." + "
" + " (" + 100 + "%" + ")", true); - } - - WorldMapID.playPcmPlayers(); - PacketWriter.scene.clear(); - - for (var1 = 0; var1 < 4; ++var1) { - Client.collisionMaps[var1].clear(); - } - - int var46; - for (var1 = 0; var1 < 4; ++var1) { - for (var46 = 0; var46 < 104; ++var46) { - for (var3 = 0; var3 < 104; ++var3) { - Tiles.Tiles_renderFlags[var1][var46][var3] = 0; - } - } - } - - WorldMapID.playPcmPlayers(); - TextureProvider.method2757(); - var1 = WorldMapIcon_1.regionLandArchives.length; - ClientPacket.method3581(); - GrandExchangeOffer.method129(true); - int var5; - int var20; - int var21; - int var51; - int var66; - if (!Client.isInInstance) { - byte[] var47; - for (var46 = 0; var46 < var1; ++var46) { - var3 = (MouseHandler.regions[var46] >> 8) * 64 - class223.baseX * 64; - var4 = (MouseHandler.regions[var46] & 255) * 64 - class286.baseY * 64; - var47 = WorldMapIcon_1.regionLandArchives[var46]; - if (var47 != null) { - WorldMapID.playPcmPlayers(); - class40.method787(var47, var3, var4, ServerPacket.field2131 * 8 - 48, MusicPatchNode.field2422 * 8 - 48, Client.collisionMaps); - } - } - - for (var46 = 0; var46 < var1; ++var46) { - var3 = (MouseHandler.regions[var46] >> 8) * 64 - class223.baseX * 64; - var4 = (MouseHandler.regions[var46] & 255) * 64 - class286.baseY * 64; - var47 = WorldMapIcon_1.regionLandArchives[var46]; - if (var47 == null && MusicPatchNode.field2422 < 800) { - WorldMapID.playPcmPlayers(); - class30.method561(var3, var4, 64, 64); - } - } - - GrandExchangeOffer.method129(true); - - for (var46 = 0; var46 < var1; ++var46) { - byte[] var52 = ArchiveLoader.regionMapArchives[var46]; - if (var52 != null) { - var4 = (MouseHandler.regions[var46] >> 8) * 64 - class223.baseX * 64; - var5 = (MouseHandler.regions[var46] & 255) * 64 - class286.baseY * 64; - WorldMapID.playPcmPlayers(); - Scene var53 = PacketWriter.scene; - CollisionMap[] var54 = Client.collisionMaps; - var8 = new Buffer(var52); - var9 = -1; - - while (true) { - var10 = var8.method5457(); - if (var10 == 0) { - break; - } - - var9 += var10; - var11 = 0; - - while (true) { - var66 = var8.readUShortSmart(); - if (var66 == 0) { - break; - } - - var11 += var66 - 1; - var13 = var11 & 63; - var14 = var11 >> 6 & 63; - var15 = var11 >> 12; - var16 = var8.readUnsignedByte(); - var17 = var16 >> 2; - var18 = var16 & 3; - var51 = var14 + var4; - var20 = var5 + var13; - if (var51 > 0 && var20 > 0 && var51 < 103 && var20 < 103) { - var21 = var15; - if ((Tiles.Tiles_renderFlags[1][var51][var20] & 2) == 2) { - var21 = var15 - 1; - } - - CollisionMap var55 = null; - if (var21 >= 0) { - var55 = var54[var21]; - } - - GrandExchangeOfferAgeComparator.method165(var15, var51, var20, var9, var18, var17, var53, var55); - } - } - } - } - } - } - - int var6; - int[] var10000; - int var22; - int var26; - int var27; - int var28; - int var29; - int var32; - int var34; - int var35; - int var36; - int var48; - int var65; - if (Client.isInInstance) { - for (var46 = 0; var46 < 4; ++var46) { - WorldMapID.playPcmPlayers(); - - for (var3 = 0; var3 < 13; ++var3) { - for (var4 = 0; var4 < 13; ++var4) { - boolean var64 = false; - var6 = Client.instanceChunkTemplates[var46][var3][var4]; - if (var6 != -1) { - var65 = var6 >> 24 & 3; - var48 = var6 >> 1 & 3; - var9 = var6 >> 14 & 1023; - var10 = var6 >> 3 & 2047; - var11 = (var9 / 8 << 8) + var10 / 8; - - for (var66 = 0; var66 < MouseHandler.regions.length; ++var66) { - if (MouseHandler.regions[var66] == var11 && WorldMapIcon_1.regionLandArchives[var66] != null) { - byte[] var49 = WorldMapIcon_1.regionLandArchives[var66]; - var14 = var3 * 8; - var15 = var4 * 8; - var16 = (var9 & 7) * 8; - var17 = (var10 & 7) * 8; - CollisionMap[] var50 = Client.collisionMaps; - - for (var51 = 0; var51 < 8; ++var51) { - for (var20 = 0; var20 < 8; ++var20) { - if (var14 + var51 > 0 && var51 + var14 < 103 && var15 + var20 > 0 && var20 + var15 < 103) { - var10000 = var50[var46].flags[var14 + var51]; - var10000[var15 + var20] &= -16777217; - } - } - } - - Buffer var67 = new Buffer(var49); - - for (var20 = 0; var20 < 4; ++var20) { - for (var21 = 0; var21 < 64; ++var21) { - for (var22 = 0; var22 < 64; ++var22) { - if (var20 == var65 && var21 >= var16 && var21 < var16 + 8 && var22 >= var17 && var22 < var17 + 8) { - var27 = var21 & 7; - var28 = var22 & 7; - var29 = var48 & 3; - if (var29 == 0) { - var26 = var27; - } else if (var29 == 1) { - var26 = var28; - } else if (var29 == 2) { - var26 = 7 - var27; - } else { - var26 = 7 - var28; - } - - var32 = var14 + var26; - var35 = var21 & 7; - var36 = var22 & 7; - int var37 = var48 & 3; - if (var37 == 0) { - var34 = var36; - } else if (var37 == 1) { - var34 = 7 - var35; - } else if (var37 == 2) { - var34 = 7 - var36; - } else { - var34 = var35; - } - - GrandExchangeOfferWorldComparator.loadTerrain(var67, var46, var32, var34 + var15, 0, 0, var48); - } else { - GrandExchangeOfferWorldComparator.loadTerrain(var67, 0, -1, -1, 0, 0, 0); - } - } - } - } - - var64 = true; - break; - } - } - } - - if (!var64) { - WorldMapID.method569(var46, var3 * 8, var4 * 8); - } - } - } - } - - for (var46 = 0; var46 < 13; ++var46) { - for (var3 = 0; var3 < 13; ++var3) { - var4 = Client.instanceChunkTemplates[0][var46][var3]; - if (var4 == -1) { - class30.method561(var46 * 8, var3 * 8, 8, 8); - } - } - } - - GrandExchangeOffer.method129(true); - - for (var46 = 0; var46 < 4; ++var46) { - WorldMapID.playPcmPlayers(); - - for (var3 = 0; var3 < 13; ++var3) { - for (var4 = 0; var4 < 13; ++var4) { - var5 = Client.instanceChunkTemplates[var46][var3][var4]; - if (var5 != -1) { - var6 = var5 >> 24 & 3; - var65 = var5 >> 1 & 3; - var48 = var5 >> 14 & 1023; - var9 = var5 >> 3 & 2047; - var10 = (var48 / 8 << 8) + var9 / 8; - - for (var11 = 0; var11 < MouseHandler.regions.length; ++var11) { - if (MouseHandler.regions[var11] == var10 && ArchiveLoader.regionMapArchives[var11] != null) { - class80.method2051(ArchiveLoader.regionMapArchives[var11], var46, var3 * 8, var4 * 8, var6, (var48 & 7) * 8, (var9 & 7) * 8, var65, PacketWriter.scene, Client.collisionMaps); - break; - } - } - } - } - } - } - } - - GrandExchangeOffer.method129(true); - WorldMapID.playPcmPlayers(); - Scene var63 = PacketWriter.scene; - CollisionMap[] var75 = Client.collisionMaps; - - for (var4 = 0; var4 < 4; ++var4) { - for (var5 = 0; var5 < 104; ++var5) { - for (var6 = 0; var6 < 104; ++var6) { - if ((Tiles.Tiles_renderFlags[var4][var5][var6] & 1) == 1) { - var65 = var4; - if ((Tiles.Tiles_renderFlags[1][var5][var6] & 2) == 2) { - var65 = var4 - 1; - } - - if (var65 >= 0) { - var75[var65].setBlockedByFloor(var5, var6); - } - } - } - } - } - - Tiles.field482 += (int)(Math.random() * 5.0D) - 2; - if (Tiles.field482 < -8) { - Tiles.field482 = -8; - } - - if (Tiles.field482 > 8) { - Tiles.field482 = 8; - } - - Tiles.field496 += (int)(Math.random() * 5.0D) - 2; - if (Tiles.field496 < -16) { - Tiles.field496 = -16; - } - - if (Tiles.field496 > 16) { - Tiles.field496 = 16; - } - - for (var4 = 0; var4 < 4; ++var4) { - byte[][] var71 = Tiles.field486[var4]; - var11 = (int)Math.sqrt(5100.0D); - var66 = var11 * 768 >> 8; - - for (var13 = 1; var13 < 103; ++var13) { - for (var14 = 1; var14 < 103; ++var14) { - var15 = Tiles.Tiles_heights[var4][var14 + 1][var13] - Tiles.Tiles_heights[var4][var14 - 1][var13]; - var16 = Tiles.Tiles_heights[var4][var14][var13 + 1] - Tiles.Tiles_heights[var4][var14][var13 - 1]; - var17 = (int)Math.sqrt((double)(var16 * var16 + var15 * var15 + 65536)); - var18 = (var15 << 8) / var17; - var51 = 65536 / var17; - var20 = (var16 << 8) / var17; - var21 = (var18 * -50 + var20 * -50 + var51 * -10) / var66 + 96; - var22 = (var71[var14][var13 + 1] >> 3) + (var71[var14 - 1][var13] >> 2) + (var71[var14][var13 - 1] >> 2) + (var71[var14 + 1][var13] >> 3) + (var71[var14][var13] >> 1); - DevicePcmPlayerProvider.field386[var14][var13] = var21 - var22; - } - } - - for (var13 = 0; var13 < 104; ++var13) { - Tiles.Tiles_hue[var13] = 0; - ArchiveLoader.Tiles_saturation[var13] = 0; - Tiles.Tiles_lightness[var13] = 0; - FontName.Tiles_hueMultiplier[var13] = 0; - Tiles.field487[var13] = 0; - } - - for (var13 = -5; var13 < 109; ++var13) { - for (var14 = 0; var14 < 104; ++var14) { - var15 = var13 + 5; - int var10002; - if (var15 >= 0 && var15 < 104) { - var16 = Tiles.field501[var4][var15][var14] & 255; - if (var16 > 0) { - FloorUnderlayDefinition var56 = UserComparator9.FloorUnderlayDefinition_get(var16 - 1); - var10000 = Tiles.Tiles_hue; - var10000[var14] += var56.hue; - var10000 = ArchiveLoader.Tiles_saturation; - var10000[var14] += var56.saturation; - var10000 = Tiles.Tiles_lightness; - var10000[var14] += var56.lightness; - var10000 = FontName.Tiles_hueMultiplier; - var10000[var14] += var56.hueMultiplier; - var10002 = Tiles.field487[var14]++; - } - } - - var16 = var13 - 5; - if (var16 >= 0 && var16 < 104) { - var17 = Tiles.field501[var4][var16][var14] & 255; - if (var17 > 0) { - FloorUnderlayDefinition var74 = UserComparator9.FloorUnderlayDefinition_get(var17 - 1); - var10000 = Tiles.Tiles_hue; - var10000[var14] -= var74.hue; - var10000 = ArchiveLoader.Tiles_saturation; - var10000[var14] -= var74.saturation; - var10000 = Tiles.Tiles_lightness; - var10000[var14] -= var74.lightness; - var10000 = FontName.Tiles_hueMultiplier; - var10000[var14] -= var74.hueMultiplier; - var10002 = Tiles.field487[var14]--; - } - } - } - - if (var13 >= 1 && var13 < 103) { - var14 = 0; - var15 = 0; - var16 = 0; - var17 = 0; - var18 = 0; - - for (var51 = -5; var51 < 109; ++var51) { - var20 = var51 + 5; - if (var20 >= 0 && var20 < 104) { - var14 += Tiles.Tiles_hue[var20]; - var15 += ArchiveLoader.Tiles_saturation[var20]; - var16 += Tiles.Tiles_lightness[var20]; - var17 += FontName.Tiles_hueMultiplier[var20]; - var18 += Tiles.field487[var20]; - } - - var21 = var51 - 5; - if (var21 >= 0 && var21 < 104) { - var14 -= Tiles.Tiles_hue[var21]; - var15 -= ArchiveLoader.Tiles_saturation[var21]; - var16 -= Tiles.Tiles_lightness[var21]; - var17 -= FontName.Tiles_hueMultiplier[var21]; - var18 -= Tiles.field487[var21]; - } - - if (var51 >= 1 && var51 < 103 && (!Client.isLowDetail || (Tiles.Tiles_renderFlags[0][var13][var51] & 2) != 0 || (Tiles.Tiles_renderFlags[var4][var13][var51] & 16) == 0)) { - if (var4 < Tiles.Tiles_minPlane) { - Tiles.Tiles_minPlane = var4; - } - - var22 = Tiles.field501[var4][var13][var51] & 255; - int var57 = Tiles.field483[var4][var13][var51] & 255; - if (var22 > 0 || var57 > 0) { - int var24 = Tiles.Tiles_heights[var4][var13][var51]; - int var25 = Tiles.Tiles_heights[var4][var13 + 1][var51]; - var26 = Tiles.Tiles_heights[var4][var13 + 1][var51 + 1]; - var27 = Tiles.Tiles_heights[var4][var13][var51 + 1]; - var28 = DevicePcmPlayerProvider.field386[var13][var51]; - var29 = DevicePcmPlayerProvider.field386[var13 + 1][var51]; - int var58 = DevicePcmPlayerProvider.field386[var13 + 1][var51 + 1]; - int var31 = DevicePcmPlayerProvider.field386[var13][var51 + 1]; - var32 = -1; - int var33 = -1; - if (var22 > 0) { - var34 = var14 * 256 / var17; - var35 = var15 / var18; - var36 = var16 / var18; - var32 = GrandExchangeOfferAgeComparator.hslToRgb(var34, var35, var36); - var34 = var34 + Tiles.field482 & 255; - var36 += Tiles.field496; - if (var36 < 0) { - var36 = 0; - } else if (var36 > 255) { - var36 = 255; - } - - var33 = GrandExchangeOfferAgeComparator.hslToRgb(var34, var35, var36); - } - - FloorOverlayDefinition var59; - if (var4 > 0) { - boolean var69 = true; - if (var22 == 0 && DevicePcmPlayerProvider.field393[var4][var13][var51] != 0) { - var69 = false; - } - - if (var57 > 0) { - var36 = var57 - 1; - var59 = (FloorOverlayDefinition)FloorOverlayDefinition.FloorOverlayDefinition_cached.get((long)var36); - FloorOverlayDefinition var60; - if (var59 != null) { - var60 = var59; - } else { - byte[] var62 = FloorOverlayDefinition.FloorOverlayDefinition_archive.takeFile(4, var36); - var59 = new FloorOverlayDefinition(); - if (var62 != null) { - var59.decode(new Buffer(var62), var36); - } - - var59.postDecode(); - FloorOverlayDefinition.FloorOverlayDefinition_cached.put(var59, (long)var36); - var60 = var59; - } - - if (!var60.hideUnderlay) { - var69 = false; - } - } - - if (var69 && var24 == var25 && var24 == var26 && var27 == var24) { - var10000 = Tiles.field488[var4][var13]; - var10000[var51] |= 2340; - } - } - - var34 = 0; - if (var33 != -1) { - var34 = Rasterizer3D.Rasterizer3D_colorPalette[class192.method3648(var33, 96)]; - } - - if (var57 == 0) { - var63.addTile(var4, var13, var51, 0, 0, -1, var24, var25, var26, var27, class192.method3648(var32, var28), class192.method3648(var32, var29), class192.method3648(var32, var58), class192.method3648(var32, var31), 0, 0, 0, 0, var34, 0); - } else { - var35 = DevicePcmPlayerProvider.field393[var4][var13][var51] + 1; - byte var70 = class287.field3634[var4][var13][var51]; - int var38 = var57 - 1; - FloorOverlayDefinition var39 = (FloorOverlayDefinition)FloorOverlayDefinition.FloorOverlayDefinition_cached.get((long)var38); - if (var39 != null) { - var59 = var39; - } else { - byte[] var61 = FloorOverlayDefinition.FloorOverlayDefinition_archive.takeFile(4, var38); - var39 = new FloorOverlayDefinition(); - if (var61 != null) { - var39.decode(new Buffer(var61), var38); - } - - var39.postDecode(); - FloorOverlayDefinition.FloorOverlayDefinition_cached.put(var39, (long)var38); - var59 = var39; - } - - int var40 = var59.texture; - int var41; - int var42; - int var43; - int var44; - if (var40 >= 0) { - var42 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var40); - var41 = -1; - } else if (var59.primaryRgb == 16711935) { - var41 = -2; - var40 = -1; - var42 = -2; - } else { - var41 = GrandExchangeOfferAgeComparator.hslToRgb(var59.hue, var59.saturation, var59.lightness); - var43 = var59.hue + Tiles.field482 & 255; - var44 = var59.lightness + Tiles.field496; - if (var44 < 0) { - var44 = 0; - } else if (var44 > 255) { - var44 = 255; - } - - var42 = GrandExchangeOfferAgeComparator.hslToRgb(var43, var59.saturation, var44); - } - - var43 = 0; - if (var42 != -2) { - var43 = Rasterizer3D.Rasterizer3D_colorPalette[WorldMapEvent.method800(var42, 96)]; - } - - if (var59.secondaryRgb != -1) { - var44 = var59.secondaryHue + Tiles.field482 & 255; - int var45 = var59.secondaryLightness + Tiles.field496; - if (var45 < 0) { - var45 = 0; - } else if (var45 > 255) { - var45 = 255; - } - - var42 = GrandExchangeOfferAgeComparator.hslToRgb(var44, var59.secondarySaturation, var45); - var43 = Rasterizer3D.Rasterizer3D_colorPalette[WorldMapEvent.method800(var42, 96)]; - } - - var63.addTile(var4, var13, var51, var35, var70, var40, var24, var25, var26, var27, class192.method3648(var32, var28), class192.method3648(var32, var29), class192.method3648(var32, var58), class192.method3648(var32, var31), WorldMapEvent.method800(var41, var28), WorldMapEvent.method800(var41, var29), WorldMapEvent.method800(var41, var58), WorldMapEvent.method800(var41, var31), var34, var43); - } - } - } - } - } - } - - for (var13 = 1; var13 < 103; ++var13) { - for (var14 = 1; var14 < 103; ++var14) { - var63.setTileMinPlane(var4, var14, var13, class189.method3612(var4, var14, var13)); - } - } - - Tiles.field501[var4] = null; - Tiles.field483[var4] = null; - DevicePcmPlayerProvider.field393[var4] = null; - class287.field3634[var4] = null; - Tiles.field486[var4] = null; - } - - var63.method3071(-50, -10, -50); - - for (var4 = 0; var4 < 104; ++var4) { - for (var5 = 0; var5 < 104; ++var5) { - if ((Tiles.Tiles_renderFlags[1][var4][var5] & 2) == 2) { - var63.setLinkBelow(var4, var5); - } - } - } - - var4 = 1; - var5 = 2; - var6 = 4; - - for (var65 = 0; var65 < 4; ++var65) { - if (var65 > 0) { - var4 <<= 3; - var5 <<= 3; - var6 <<= 3; - } - - for (var48 = 0; var48 <= var65; ++var48) { - for (var9 = 0; var9 <= 104; ++var9) { - for (var10 = 0; var10 <= 104; ++var10) { - short var68; - if ((Tiles.field488[var48][var10][var9] & var4) != 0) { - var11 = var9; - var66 = var9; - var13 = var48; - - for (var14 = var48; var11 > 0 && (Tiles.field488[var48][var10][var11 - 1] & var4) != 0; --var11) { - } - - while (var66 < 104 && (Tiles.field488[var48][var10][var66 + 1] & var4) != 0) { - ++var66; - } - - label901: - while (var13 > 0) { - for (var15 = var11; var15 <= var66; ++var15) { - if ((Tiles.field488[var13 - 1][var10][var15] & var4) == 0) { - break label901; - } - } - - --var13; - } - - label890: - while (var14 < var65) { - for (var15 = var11; var15 <= var66; ++var15) { - if ((Tiles.field488[var14 + 1][var10][var15] & var4) == 0) { - break label890; - } - } - - ++var14; - } - - var15 = (var66 - var11 + 1) * (var14 + 1 - var13); - if (var15 >= 8) { - var68 = 240; - var17 = Tiles.Tiles_heights[var14][var10][var11] - var68; - var18 = Tiles.Tiles_heights[var13][var10][var11]; - Scene.Scene_addOccluder(var65, 1, var10 * 128, var10 * 128, var11 * 128, var66 * 128 + 128, var17, var18); - - for (var51 = var13; var51 <= var14; ++var51) { - for (var20 = var11; var20 <= var66; ++var20) { - var10000 = Tiles.field488[var51][var10]; - var10000[var20] &= ~var4; - } - } - } - } - - if ((Tiles.field488[var48][var10][var9] & var5) != 0) { - var11 = var10; - var66 = var10; - var13 = var48; - - for (var14 = var48; var11 > 0 && (Tiles.field488[var48][var11 - 1][var9] & var5) != 0; --var11) { - } - - while (var66 < 104 && (Tiles.field488[var48][var66 + 1][var9] & var5) != 0) { - ++var66; - } - - label954: - while (var13 > 0) { - for (var15 = var11; var15 <= var66; ++var15) { - if ((Tiles.field488[var13 - 1][var15][var9] & var5) == 0) { - break label954; - } - } - - --var13; - } - - label943: - while (var14 < var65) { - for (var15 = var11; var15 <= var66; ++var15) { - if ((Tiles.field488[var14 + 1][var15][var9] & var5) == 0) { - break label943; - } - } - - ++var14; - } - - var15 = (var14 + 1 - var13) * (var66 - var11 + 1); - if (var15 >= 8) { - var68 = 240; - var17 = Tiles.Tiles_heights[var14][var11][var9] - var68; - var18 = Tiles.Tiles_heights[var13][var11][var9]; - Scene.Scene_addOccluder(var65, 2, var11 * 128, var66 * 128 + 128, var9 * 128, var9 * 128, var17, var18); - - for (var51 = var13; var51 <= var14; ++var51) { - for (var20 = var11; var20 <= var66; ++var20) { - var10000 = Tiles.field488[var51][var20]; - var10000[var9] &= ~var5; - } - } - } - } - - if ((Tiles.field488[var48][var10][var9] & var6) != 0) { - var11 = var10; - var66 = var10; - var13 = var9; - - for (var14 = var9; var13 > 0 && (Tiles.field488[var48][var10][var13 - 1] & var6) != 0; --var13) { - } - - while (var14 < 104 && (Tiles.field488[var48][var10][var14 + 1] & var6) != 0) { - ++var14; - } - - label1007: - while (var11 > 0) { - for (var15 = var13; var15 <= var14; ++var15) { - if ((Tiles.field488[var48][var11 - 1][var15] & var6) == 0) { - break label1007; - } - } - - --var11; - } - - label996: - while (var66 < 104) { - for (var15 = var13; var15 <= var14; ++var15) { - if ((Tiles.field488[var48][var66 + 1][var15] & var6) == 0) { - break label996; - } - } - - ++var66; - } - - if ((var14 - var13 + 1) * (var66 - var11 + 1) >= 4) { - var15 = Tiles.Tiles_heights[var48][var11][var13]; - Scene.Scene_addOccluder(var65, 4, var11 * 128, var66 * 128 + 128, var13 * 128, var14 * 128 + 128, var15, var15); - - for (var16 = var11; var16 <= var66; ++var16) { - for (var17 = var13; var17 <= var14; ++var17) { - var10000 = Tiles.field488[var48][var16]; - var10000[var17] &= ~var6; - } - } - } - } - } - } - } - } - - GrandExchangeOffer.method129(true); - var4 = Tiles.Tiles_minPlane; - if (var4 > WorldMapRectangle.plane) { - var4 = WorldMapRectangle.plane; - } - - if (var4 < WorldMapRectangle.plane - 1) { - var4 = WorldMapRectangle.plane - 1; - } - - if (Client.isLowDetail) { - PacketWriter.scene.init(Tiles.Tiles_minPlane); - } else { - PacketWriter.scene.init(0); - } - - for (var5 = 0; var5 < 104; ++var5) { - for (var6 = 0; var6 < 104; ++var6) { - WorldMapCacheName.updateItemPile(var5, var6); - } - } - - WorldMapID.playPcmPlayers(); - - for (PendingSpawn var72 = (PendingSpawn)Client.pendingSpawns.last(); var72 != null; var72 = (PendingSpawn)Client.pendingSpawns.previous()) { - if (var72.hitpoints == -1) { - var72.delay = 0; - GrandExchangeEvent.method88(var72); - } else { - var72.remove(); - } - } - - ObjectDefinition.ObjectDefinition_cachedModelData.clear(); - PacketBufferNode var73; - if (ViewportMouse.client.hasFrame()) { - var73 = InterfaceParent.getPacketBufferNode(ClientPacket.field2208, Client.packetWriter.isaacCipher); - var73.packetBuffer.writeInt(1057001181); - Client.packetWriter.addNode(var73); - } - - if (!Client.isInInstance) { - var5 = (ServerPacket.field2131 - 6) / 8; - var6 = (ServerPacket.field2131 + 6) / 8; - var65 = (MusicPatchNode.field2422 - 6) / 8; - var48 = (MusicPatchNode.field2422 + 6) / 8; - - for (var9 = var5 - 1; var9 <= var6 + 1; ++var9) { - for (var10 = var65 - 1; var10 <= var48 + 1; ++var10) { - if (var9 < var5 || var9 > var6 || var10 < var65 || var10 > var48) { - class3.archive5.loadRegionFromName("m" + var9 + "_" + var10); - class3.archive5.loadRegionFromName("l" + var9 + "_" + var10); - } - } - } - } - - MouseRecorder.updateGameState(30); - WorldMapID.playPcmPlayers(); - Friend.method5148(); - var73 = InterfaceParent.getPacketBufferNode(ClientPacket.field2229, Client.packetWriter.isaacCipher); - Client.packetWriter.addNode(var73); - WorldMapDecoration.method343(); - } } - } - @ObfuscatedName("hr") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "819665124" - ) - @Export("addCancelMenuEntry") - static void addCancelMenuEntry() { - ScriptEvent.method1205(); - Client.menuActions[0] = "Cancel"; - Client.menuTargets[0] = ""; - Client.menuOpcodes[0] = 1006; - Client.menuShiftClick[0] = false; - Client.menuOptionsCount = 1; } } diff --git a/runescape-client/src/main/java/KitDefinition.java b/runescape-client/src/main/java/KitDefinition.java index f1ebc967cd..7717b75653 100644 --- a/runescape-client/src/main/java/KitDefinition.java +++ b/runescape-client/src/main/java/KitDefinition.java @@ -4,51 +4,52 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("iy") +@ObfuscatedName("io") @Implements("KitDefinition") public class KitDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("KitDefinition_archive") public static AbstractArchive KitDefinition_archive; - @ObfuscatedName("u") + @ObfuscatedName("n") + @ObfuscatedGetter( + intValue = 582717835 + ) + @Export("KitDefinition_fileCount") + public static int KitDefinition_fileCount; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("KitDefinition_cached") - public static EvictingDualNodeHashTable KitDefinition_cached; - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lho;" - ) - static Widget field3252; - @ObfuscatedName("r") + static EvictingDualNodeHashTable KitDefinition_cached; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1391426239 + intValue = -846711719 ) @Export("bodypartID") public int bodypartID; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("models2") int[] models2; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("recolorFrom") short[] recolorFrom; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("recolorTo") short[] recolorTo; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("retextureFrom") short[] retextureFrom; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("retextureTo") short[] retextureTo; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("models") int[] models; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("nonSelectable") public boolean nonSelectable; @@ -62,10 +63,10 @@ public class KitDefinition extends DualNode { this.nonSelectable = false; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "801046571" + signature = "(Lkc;I)V", + garbageValue = "-1072389484" ) @Export("decode") void decode(Buffer var1) { @@ -79,10 +80,10 @@ public class KitDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "1307391521" + signature = "(Lkc;II)V", + garbageValue = "1034745229" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -125,10 +126,10 @@ public class KitDefinition extends DualNode { } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-1837700521" + garbageValue = "2037455287" ) @Export("ready") public boolean ready() { @@ -138,7 +139,7 @@ public class KitDefinition extends DualNode { boolean var1 = true; for (int var2 = 0; var2 < this.models2.length; ++var2) { - if (!GrandExchangeOfferOwnWorldComparator.KitDefinition_modelsArchive.tryLoadFile(this.models2[var2], 0)) { + if (!class43.KitDefinition_modelsArchive.tryLoadFile(this.models2[var2], 0)) { var1 = false; } } @@ -147,10 +148,10 @@ public class KitDefinition extends DualNode { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(I)Ldw;", - garbageValue = "538019624" + signature = "(I)Ldu;", + garbageValue = "1847415813" ) @Export("getModelData") public ModelData getModelData() { @@ -160,7 +161,7 @@ public class KitDefinition extends DualNode { ModelData[] var1 = new ModelData[this.models2.length]; for (int var2 = 0; var2 < this.models2.length; ++var2) { - var1[var2] = ModelData.ModelData_get(GrandExchangeOfferOwnWorldComparator.KitDefinition_modelsArchive, this.models2[var2], 0); + var1[var2] = ModelData.ModelData_get(class43.KitDefinition_modelsArchive, this.models2[var2], 0); } ModelData var4; @@ -187,16 +188,16 @@ public class KitDefinition extends DualNode { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-361074735" + garbageValue = "1557117338" ) - public boolean method4423() { + public boolean method4602() { boolean var1 = true; for (int var2 = 0; var2 < 5; ++var2) { - if (this.models[var2] != -1 && !GrandExchangeOfferOwnWorldComparator.KitDefinition_modelsArchive.tryLoadFile(this.models[var2], 0)) { + if (this.models[var2] != -1 && !class43.KitDefinition_modelsArchive.tryLoadFile(this.models[var2], 0)) { var1 = false; } } @@ -204,10 +205,10 @@ public class KitDefinition extends DualNode { return var1; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(B)Ldw;", - garbageValue = "-26" + signature = "(I)Ldu;", + garbageValue = "1574535853" ) @Export("getKitDefinitionModels") public ModelData getKitDefinitionModels() { @@ -216,7 +217,7 @@ public class KitDefinition extends DualNode { for (int var3 = 0; var3 < 5; ++var3) { if (this.models[var3] != -1) { - var1[var2++] = ModelData.ModelData_get(GrandExchangeOfferOwnWorldComparator.KitDefinition_modelsArchive, this.models[var3], 0); + var1[var2++] = ModelData.ModelData_get(class43.KitDefinition_modelsArchive, this.models[var3], 0); } } diff --git a/runescape-client/src/main/java/Language.java b/runescape-client/src/main/java/Language.java index ba0e9cbc94..27c72765b8 100644 --- a/runescape-client/src/main/java/Language.java +++ b/runescape-client/src/main/java/Language.java @@ -1,3 +1,4 @@ +import java.security.SecureRandom; import java.util.Locale; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; @@ -5,90 +6,89 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gt") +@ObfuscatedName("gw") @Implements("Language") public class Language implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_EN") public static final Language Language_EN; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_DE") static final Language Language_DE; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_FR") public static final Language Language_FR; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_PT") static final Language Language_PT; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_NL") static final Language Language_NL; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_ES") public static final Language Language_ES; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lgt;" + signature = "Lgw;" ) @Export("Language_ES_MX") static final Language Language_ES_MX; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "[Lgt;" + signature = "[Lgw;" ) @Export("Language_valuesOrdered") - static final Language[] Language_valuesOrdered; - @ObfuscatedName("bc") - @ObfuscatedSignature( - signature = "[Llp;" + public static final Language[] Language_valuesOrdered; + @ObfuscatedName("ai") + @ObfuscatedGetter( + intValue = -252727609 ) - @Export("worldSelectFlagSprites") - static IndexedSprite[] worldSelectFlagSprites; - @ObfuscatedName("dz") + static int field2328; + @ObfuscatedName("dp") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lij;" ) @Export("archive7") static Archive archive7; - @ObfuscatedName("m") - final String field2338; - @ObfuscatedName("y") + @ObfuscatedName("o") + final String field2325; + @ObfuscatedName("i") @Export("language") final String language; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 1051697599 + intValue = -367223779 ) @Export("id") final int id; static { - Language_EN = new Language("EN", "en", "English", class192.field2362, 0, "GB"); - Language_DE = new Language("DE", "de", "German", class192.field2362, 1, "DE"); - Language_FR = new Language("FR", "fr", "French", class192.field2362, 2, "FR"); - Language_PT = new Language("PT", "pt", "Portuguese", class192.field2362, 3, "BR"); - Language_NL = new Language("NL", "nl", "Dutch", class192.field2353, 4, "NL"); - Language_ES = new Language("ES", "es", "Spanish", class192.field2353, 5, "ES"); - Language_ES_MX = new Language("ES_MX", "es-mx", "Spanish (Latin American)", class192.field2362, 6, "MX"); - Language[] var0 = method3638(); + Language_EN = new Language("EN", "en", "English", class192.field2345, 0, "GB"); + Language_DE = new Language("DE", "de", "German", class192.field2345, 1, "DE"); + Language_FR = new Language("FR", "fr", "French", class192.field2345, 2, "FR"); + Language_PT = new Language("PT", "pt", "Portuguese", class192.field2345, 3, "BR"); + Language_NL = new Language("NL", "nl", "Dutch", class192.field2341, 4, "NL"); + Language_ES = new Language("ES", "es", "Spanish", class192.field2341, 5, "ES"); + Language_ES_MX = new Language("ES_MX", "es-mx", "Spanish (Latin American)", class192.field2345, 6, "MX"); + Language[] var0 = method3808(); Language_valuesOrdered = new Language[var0.length]; Language[] var1 = var0; @@ -104,10 +104,10 @@ public class Language implements Enumerated { } @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lgs;ILjava/lang/String;)V" + signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lgm;ILjava/lang/String;)V" ) Language(String var1, String var2, String var3, class192 var4, int var5, String var6) { - this.field2338 = var1; + this.field2325 = var1; this.language = var2; this.id = var5; if (var6 != null) { @@ -118,20 +118,20 @@ public class Language implements Enumerated { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "-1300604357" + garbageValue = "-2063741998" ) @Export("getLanguage") String getLanguage() { return this.language; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { @@ -142,57 +142,37 @@ public class Language implements Enumerated { return this.getLanguage().toLowerCase(Locale.ENGLISH); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)[Lgt;", - garbageValue = "1567762755" + signature = "(I)Ljava/security/SecureRandom;", + garbageValue = "810839825" ) - static Language[] method3638() { - return new Language[]{Language_PT, Language_EN, Language_NL, Language_ES, Language_FR, Language_ES_MX, Language_DE}; + static SecureRandom method3800() { + SecureRandom var0 = new SecureRandom(); + var0.nextInt(); + return var0; } - @ObfuscatedName("n") - public static boolean method3635(long var0) { - boolean var2 = 0L != var0; - if (var2) { - boolean var3 = (int)(var0 >>> 16 & 1L) == 1; - var2 = !var3; - } - - return var2; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(I)[Lgw;", + garbageValue = "165302960" + ) + static Language[] method3808() { + return new Language[]{Language_NL, Language_ES, Language_PT, Language_DE, Language_ES_MX, Language_FR, Language_EN}; } - @ObfuscatedName("u") + @ObfuscatedName("ai") @ObfuscatedSignature( - signature = "(II)Lgt;", - garbageValue = "-1627784008" + signature = "(ILhf;ZI)V", + garbageValue = "-294923905" ) - public static Language method3618(int var0) { - return var0 >= 0 && var0 < Language_valuesOrdered.length ? Language_valuesOrdered[var0] : null; - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "6522" - ) - @Export("savePreferences") - static void savePreferences() { - AccessFile var0 = null; - - try { - var0 = class185.getPreferencesFile("", class16.field101.name, true); - Buffer var1 = AbstractArchive.clientPreferences.toBuffer(); - var0.write(var1.array, 0, var1.offset); - } catch (Exception var3) { - } - - try { - if (var0 != null) { - var0.closeSync(true); - } - } catch (Exception var2) { - } - + static void method3810(int var0, Coord var1, boolean var2) { + WorldMapArea var3 = UserComparator4.getWorldMap().getMapArea(var0); + int var4 = class215.localPlayer.Scene_plane; + int var5 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); + int var6 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); + Coord var7 = new Coord(var4, var5, var6); + UserComparator4.getWorldMap().method6443(var3, var7, var1, var2); } } diff --git a/runescape-client/src/main/java/Link.java b/runescape-client/src/main/java/Link.java index e06c6768dd..f89d60b8d2 100644 --- a/runescape-client/src/main/java/Link.java +++ b/runescape-client/src/main/java/Link.java @@ -3,23 +3,23 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fs") +@ObfuscatedName("fz") @Implements("Link") public class Link { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfs;" + signature = "Lfz;" ) @Export("previous") public Link previous; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfs;" + signature = "Lfz;" ) @Export("next") public Link next; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("remove") public void remove() { if (this.next != null) { diff --git a/runescape-client/src/main/java/LinkDeque.java b/runescape-client/src/main/java/LinkDeque.java index 546a965885..66d3fadbd2 100644 --- a/runescape-client/src/main/java/LinkDeque.java +++ b/runescape-client/src/main/java/LinkDeque.java @@ -3,18 +3,18 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("je") +@ObfuscatedName("ja") @Implements("LinkDeque") public class LinkDeque { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfs;" + signature = "Lfz;" ) @Export("sentinel") Link sentinel; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfs;" + signature = "Lfz;" ) @Export("current") Link current; @@ -25,9 +25,9 @@ public class LinkDeque { this.sentinel.next = this.sentinel; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lfs;)V" + signature = "(Lfz;)V" ) @Export("addFirst") public void addFirst(Link var1) { @@ -41,9 +41,9 @@ public class LinkDeque { var1.previous.next = var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "()Lfs;" + signature = "()Lfz;" ) @Export("last") public Link last() { @@ -57,9 +57,9 @@ public class LinkDeque { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "()Lfs;" + signature = "()Lfz;" ) @Export("previous") public Link previous() { diff --git a/runescape-client/src/main/java/Login.java b/runescape-client/src/main/java/Login.java index ac02520465..4bb16bfd18 100644 --- a/runescape-client/src/main/java/Login.java +++ b/runescape-client/src/main/java/Login.java @@ -4,136 +4,158 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("cd") +@ObfuscatedName("ci") @Implements("Login") public class Login { + @ObfuscatedName("se") + @ObfuscatedSignature( + signature = "Llo;" + ) + @Export("worldMap") + static WorldMap worldMap; + @ObfuscatedName("t") + static boolean field1188; @ObfuscatedName("n") - static boolean field1160; - @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1085278935 + intValue = 1763315451 ) @Export("xPadding") static int xPadding; - @ObfuscatedName("u") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "[Llp;" + signature = "Llx;" ) - @Export("runesSprite") - static IndexedSprite[] runesSprite; - @ObfuscatedName("a") - @ObfuscatedSignature( - signature = "Llp;" - ) - static IndexedSprite field1163; + @Export("leftTitleSprite") + static Sprite leftTitleSprite; @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "Llw;" + ) + @Export("options_buttons_2Sprite") + static IndexedSprite options_buttons_2Sprite; + @ObfuscatedName("x") + @ObfuscatedSignature( + signature = "Lbv;" + ) + @Export("loginScreenRunesAnimation") + static LoginScreenAnimation loginScreenRunesAnimation; + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = -1106370935 + intValue = -2059277113 ) @Export("loginBoxX") static int loginBoxX; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = -1258124087 + intValue = 1978997765 ) @Export("Login_loadingPercent") static int Login_loadingPercent; - @ObfuscatedName("j") + @ObfuscatedName("g") @Export("Login_loadingText") static String Login_loadingText; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = 1751945439 + intValue = 1768123277 ) - static int field1174; - @ObfuscatedName("ab") + static int field1156; + @ObfuscatedName("ak") @ObfuscatedGetter( - intValue = -1223310887 + intValue = -1622828931 ) - static int field1171; - @ObfuscatedName("al") + static int field1166; + @ObfuscatedName("ax") @ObfuscatedGetter( - intValue = -857433701 + intValue = -750997095 ) @Export("loginIndex") static int loginIndex; - @ObfuscatedName("ad") + @ObfuscatedName("al") @Export("Login_response0") static String Login_response0; - @ObfuscatedName("an") + @ObfuscatedName("ap") @Export("Login_response1") static String Login_response1; - @ObfuscatedName("ai") + @ObfuscatedName("aj") @Export("Login_response2") static String Login_response2; - @ObfuscatedName("ak") + @ObfuscatedName("ae") @Export("Login_response3") static String Login_response3; - @ObfuscatedName("aq") + @ObfuscatedName("au") @Export("Login_username") static String Login_username; - @ObfuscatedName("am") + @ObfuscatedName("ah") @Export("Login_password") static String Login_password; - @ObfuscatedName("au") - static boolean field1176; - @ObfuscatedName("af") - static boolean field1192; - @ObfuscatedName("bh") - static boolean field1183; - @ObfuscatedName("bd") + @ObfuscatedName("ao") @ObfuscatedGetter( - intValue = -1323916819 + intValue = -557990001 + ) + static int field1174; + @ObfuscatedName("ac") + static boolean field1159; + @ObfuscatedName("at") + static boolean field1175; + @ObfuscatedName("bg") + static boolean field1177; + @ObfuscatedName("bc") + @ObfuscatedGetter( + intValue = -255503835 ) @Export("currentLoginField") static int currentLoginField; - @ObfuscatedName("bs") + @ObfuscatedName("bh") @Export("worldSelectOpen") static boolean worldSelectOpen; - @ObfuscatedName("bi") + @ObfuscatedName("bj") @ObfuscatedGetter( - intValue = 1218721579 + intValue = -236759579 ) @Export("hoveredWorldIndex") static int hoveredWorldIndex; - @ObfuscatedName("bb") + @ObfuscatedName("bm") @ObfuscatedGetter( - intValue = 838409867 + intValue = -1991064971 ) @Export("worldSelectPage") static int worldSelectPage; - @ObfuscatedName("bt") + @ObfuscatedName("bn") @ObfuscatedGetter( - intValue = -94881399 + intValue = -1550903987 ) @Export("worldSelectPagesCount") static int worldSelectPagesCount; - @ObfuscatedName("by") + @ObfuscatedName("bo") @ObfuscatedGetter( - longValue = 5865138585351193781L + longValue = -6046220397950701943L ) - static long field1181; - @ObfuscatedName("bq") + static long field1185; + @ObfuscatedName("bk") @ObfuscatedGetter( - longValue = 4842998671579245891L + longValue = -7219619967505319403L ) - static long field1177; - @ObfuscatedName("dn") + static long field1186; + @ObfuscatedName("gz") @ObfuscatedSignature( - signature = "Lfv;" + signature = "[Llx;" ) - @Export("js5SocketTask") - static Task js5SocketTask; + @Export("headIconPrayerSprites") + static Sprite[] headIconPrayerSprites; + @ObfuscatedName("jq") + @ObfuscatedSignature( + signature = "Lhi;" + ) + static Widget field1165; static { xPadding = 0; loginBoxX = xPadding + 202; Login_loadingPercent = 10; Login_loadingText = ""; - field1174 = -1; - field1171 = 1; + field1156 = -1; + field1166 = 1; loginIndex = 0; Login_response0 = ""; Login_response1 = ""; @@ -141,9 +163,9 @@ public class Login { Login_response3 = ""; Login_username = ""; Login_password = ""; - field1176 = false; - field1192 = false; - field1183 = true; + field1159 = false; + field1175 = false; + field1177 = true; currentLoginField = 0; worldSelectOpen = false; hoveredWorldIndex = -1; @@ -151,97 +173,25 @@ public class Login { worldSelectPagesCount = 0; new DecimalFormat("##0.00"); new class162(); - field1181 = -1L; - field1177 = -1L; + field1185 = -1L; + field1186 = -1L; } - @ObfuscatedName("r") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "432150558" + signature = "(I)V", + garbageValue = "-1795095420" ) - static int method2115(int var0, Script var1, boolean var2) { - int var3 = -1; - Widget var4; - if (var0 >= 2000) { - var0 -= 1000; - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var4 = Canvas.getWidget(var3); - } else { - var4 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - } - - if (var0 == ScriptOpcodes.CC_SETPOSITION) { - Interpreter.Interpreter_intStackSize -= 4; - var4.rawX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4.rawY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var4.xAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - var4.yAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - WorldMapSectionType.invalidateWidget(var4); - ViewportMouse.client.alignWidget(var4); - if (var3 != -1 && var4.type == 0) { - GameShell.revalidateWidgetScroll(UserComparator5.Widget_interfaceComponents[var3 >> 16], var4, false); - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_SETSIZE) { - Interpreter.Interpreter_intStackSize -= 4; - var4.rawWidth = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4.rawHeight = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var4.widthAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - var4.heightAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - WorldMapSectionType.invalidateWidget(var4); - ViewportMouse.client.alignWidget(var4); - if (var3 != -1 && var4.type == 0) { - GameShell.revalidateWidgetScroll(UserComparator5.Widget_interfaceComponents[var3 >> 16], var4, false); - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_SETHIDE) { - boolean var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (var5 != var4.isHidden) { - var4.isHidden = var5; - WorldMapSectionType.invalidateWidget(var4); - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_SETNOCLICKTHROUGH) { - var4.noClickThrough = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETNOSCROLLTHROUGH) { - var4.noScrollThrough = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else { - return 2; - } + public static void method2258() { + FloorUnderlayDefinition.FloorUnderlayDefinition_cached.clear(); } - @ObfuscatedName("b") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "-161600604" + signature = "(I)Z", + garbageValue = "-722020095" ) - static final int method2100(int var0, int var1) { - int var2 = class160.method3416(var0 - 1, var1 - 1) + class160.method3416(var0 + 1, var1 - 1) + class160.method3416(var0 - 1, 1 + var1) + class160.method3416(1 + var0, var1 + 1); - int var3 = class160.method3416(var0 - 1, var1) + class160.method3416(var0 + 1, var1) + class160.method3416(var0, var1 - 1) + class160.method3416(var0, var1 + 1); - int var4 = class160.method3416(var0, var1); - return var2 / 16 + var3 / 8 + var4 / 4; - } - - @ObfuscatedName("ge") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "8" - ) - static void method2114() { - int var0 = Players.Players_count; - int[] var1 = Players.Players_indices; - - for (int var2 = 0; var2 < var0; ++var2) { - if (var1[var2] != Client.combatTargetPlayerIndex && var1[var2] != Client.localPlayerIndex) { - Players.addPlayerToScene(Client.players[var1[var2]], true); - } - } - + public static boolean method2256() { + return class197.field2377 != 0 ? true : class197.midiPcmStream.isReady(); } } diff --git a/runescape-client/src/main/java/LoginPacket.java b/runescape-client/src/main/java/LoginPacket.java index a4c62337ab..699df12dec 100644 --- a/runescape-client/src/main/java/LoginPacket.java +++ b/runescape-client/src/main/java/LoginPacket.java @@ -4,61 +4,61 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ge") +@ObfuscatedName("gs") @Implements("LoginPacket") public class LoginPacket implements class181 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lge;" + signature = "Lgs;" ) - public static final LoginPacket field2289; + public static final LoginPacket field2283; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lgs;" + ) + static final LoginPacket field2284; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lge;" + signature = "Lgs;" ) - static final LoginPacket field2288; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lge;" - ) - public static final LoginPacket field2287; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lge;" - ) - public static final LoginPacket field2290; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lge;" - ) - static final LoginPacket field2291; + public static final LoginPacket field2285; @ObfuscatedName("q") @ObfuscatedSignature( - signature = "[Lge;" + signature = "Lgs;" + ) + public static final LoginPacket field2286; + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "Lgs;" + ) + static final LoginPacket field2287; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "[Lgs;" ) @Export("LoginPacket_indexedValues") static final LoginPacket[] LoginPacket_indexedValues; - @ObfuscatedName("ff") + @ObfuscatedName("ds") @ObfuscatedSignature( - signature = "Lfv;" + signature = "Lij;" ) - @Export("socketTask") - static Task socketTask; - @ObfuscatedName("p") + @Export("archive1") + static Archive archive1; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1737377539 + intValue = -975966301 ) @Export("id") public final int id; static { - field2289 = new LoginPacket(14, 0); - field2288 = new LoginPacket(15, 4); - field2287 = new LoginPacket(16, -2); - field2290 = new LoginPacket(18, -2); - field2291 = new LoginPacket(27, 0); + field2283 = new LoginPacket(14, 0); + field2284 = new LoginPacket(15, 4); + field2285 = new LoginPacket(16, -2); + field2286 = new LoginPacket(18, -2); + field2287 = new LoginPacket(27, 0); LoginPacket_indexedValues = new LoginPacket[32]; - LoginPacket[] var0 = class192.method3649(); + LoginPacket[] var0 = GrandExchangeOfferWorldComparator.method105(); for (int var1 = 0; var1 < var0.length; ++var1) { LoginPacket_indexedValues[var0[var1].id] = var0[var1]; @@ -74,677 +74,13 @@ public class LoginPacket implements class181 { this.id = var1; } - @ObfuscatedName("z") + @ObfuscatedName("lb") @ObfuscatedSignature( - signature = "(II)Lcu;", - garbageValue = "-1747084073" + signature = "(B)V", + garbageValue = "19" ) - @Export("getScript") - static Script getScript(int var0) { - Script var1 = (Script)Script.Script_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = GrandExchangeOfferOwnWorldComparator.archive12.takeFile(var0, 0); - if (var2 == null) { - return null; - } else { - var1 = class3.newScript(var2); - Script.Script_cached.put(var1, (long)var0); - return var1; - } - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(Lbh;S)V", - garbageValue = "21228" - ) - @Export("doCycleTitle") - static void doCycleTitle(GameShell var0) { - if (Login.worldSelectOpen) { - while (DynamicObject.isKeyDown()) { - if (SecureRandomFuture.field1230 == 13) { - Coord.closeWorldSelect(); - return; - } else if (SecureRandomFuture.field1230 == 96) { - if (Login.worldSelectPage > 0) { - if (WorldMapIcon_0.worldSelectLeftSprite != null) { - --Login.worldSelectPage; - } - } - } else if (SecureRandomFuture.field1230 == 97) { - if (Login.worldSelectPage < Login.worldSelectPagesCount) { - if (HealthBar.worldSelectRightSprite != null) { - ++Login.worldSelectPage; - } - } - } - } - - if (MouseHandler.MouseHandler_lastButton != 1 && (WorldMapIcon_1.mouseCam || MouseHandler.MouseHandler_lastButton != 4)) { - return; - } - - int var1 = Login.xPadding + 280; - if (MouseHandler.MouseHandler_lastPressedX >= var1 && MouseHandler.MouseHandler_lastPressedX <= var1 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(0, 0); - return; - } - - if (MouseHandler.MouseHandler_lastPressedX >= var1 + 15 && MouseHandler.MouseHandler_lastPressedX <= var1 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(0, 1); - return; - } - - int var2 = Login.xPadding + 390; - if (MouseHandler.MouseHandler_lastPressedX >= var2 && MouseHandler.MouseHandler_lastPressedX <= var2 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(1, 0); - return; - } - - if (MouseHandler.MouseHandler_lastPressedX >= var2 + 15 && MouseHandler.MouseHandler_lastPressedX <= var2 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(1, 1); - return; - } - - int var17 = Login.xPadding + 500; - if (MouseHandler.MouseHandler_lastPressedX >= var17 && MouseHandler.MouseHandler_lastPressedX <= var17 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(2, 0); - return; - } - - if (MouseHandler.MouseHandler_lastPressedX >= var17 + 15 && MouseHandler.MouseHandler_lastPressedX <= var17 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(2, 1); - return; - } - - int var4 = Login.xPadding + 610; - if (MouseHandler.MouseHandler_lastPressedX >= var4 && MouseHandler.MouseHandler_lastPressedX <= var4 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(3, 0); - return; - } - - if (MouseHandler.MouseHandler_lastPressedX >= var4 + 15 && MouseHandler.MouseHandler_lastPressedX <= var4 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { - class192.changeWorldSelectSorting(3, 1); - return; - } - - if (MouseHandler.MouseHandler_lastPressedX >= Login.xPadding + 708 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedX <= Login.xPadding + 708 + 50 && MouseHandler.MouseHandler_lastPressedY <= 20) { - Coord.closeWorldSelect(); - return; - } - - if (Login.hoveredWorldIndex != -1) { - World var5 = World.World_worlds[Login.hoveredWorldIndex]; - class4.changeWorld(var5); - Coord.closeWorldSelect(); - return; - } - - if (Login.worldSelectPage > 0 && WorldMapIcon_0.worldSelectLeftSprite != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= WorldMapIcon_0.worldSelectLeftSprite.subWidth && MouseHandler.MouseHandler_lastPressedY >= WallDecoration.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= WallDecoration.canvasHeight / 2 + 50) { - --Login.worldSelectPage; - } - - if (Login.worldSelectPage < Login.worldSelectPagesCount && HealthBar.worldSelectRightSprite != null && MouseHandler.MouseHandler_lastPressedX >= FloorDecoration.canvasWidth - HealthBar.worldSelectRightSprite.subWidth - 5 && MouseHandler.MouseHandler_lastPressedX <= FloorDecoration.canvasWidth && MouseHandler.MouseHandler_lastPressedY >= WallDecoration.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= WallDecoration.canvasHeight / 2 + 50) { - ++Login.worldSelectPage; - } - return; - } - - if ((MouseHandler.MouseHandler_lastButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= Login.xPadding + 765 - 50 && MouseHandler.MouseHandler_lastPressedY >= 453) { - AbstractArchive.clientPreferences.titleMusicDisabled = !AbstractArchive.clientPreferences.titleMusicDisabled; - Language.savePreferences(); - if (!AbstractArchive.clientPreferences.titleMusicDisabled) { - UserComparator4.method3349(class225.archive6, "scape main", "", 255, false); - } else { - VertexNormal.method2960(); - } - } - - if (Client.gameState == 5) { - return; - } - - if (Login.field1181 == -1L) { - Login.field1181 = class30.currentTimeMillis() + 1000L; - } - - long var12 = class30.currentTimeMillis(); - boolean var3; - if (Client.archiveLoaders == null || Client.archiveLoadersDone >= Client.archiveLoaders.size()) { - var3 = true; - } else { - while (true) { - if (Client.archiveLoadersDone >= Client.archiveLoaders.size()) { - var3 = true; - break; - } - - ArchiveLoader var15 = (ArchiveLoader)Client.archiveLoaders.get(Client.archiveLoadersDone); - if (!var15.isLoaded()) { - var3 = false; - break; - } - - ++Client.archiveLoadersDone; - } - } - - if (var3 && Login.field1177 == -1L) { - Login.field1177 = var12; - if (Login.field1177 > Login.field1181) { - Login.field1181 = Login.field1177; - } - } - - if (Client.gameState != 10 && Client.gameState != 11) { - return; - } - if (WorldMapLabelSize.clientLanguage == Language.Language_EN) { - if (MouseHandler.MouseHandler_lastButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_lastButton == 4) { - int var4 = Login.xPadding + 5; - short var14 = 463; - byte var6 = 100; - byte var7 = 35; - if (MouseHandler.MouseHandler_lastPressedX >= var4 && MouseHandler.MouseHandler_lastPressedX <= var6 + var4 && MouseHandler.MouseHandler_lastPressedY >= var14 && MouseHandler.MouseHandler_lastPressedY <= var14 + var7) { - if (BufferedNetSocket.loadWorlds()) { - Login.worldSelectOpen = true; - Login.worldSelectPage = 0; - Login.worldSelectPagesCount = 0; - } - - return; - } - } - - if (class51.World_request != null && BufferedNetSocket.loadWorlds()) { - Login.worldSelectOpen = true; - Login.worldSelectPage = 0; - Login.worldSelectPagesCount = 0; - } - } - - int var4 = MouseHandler.MouseHandler_lastButton; - int var25 = MouseHandler.MouseHandler_lastPressedX; - int var18 = MouseHandler.MouseHandler_lastPressedY; - if (var4 == 0) { - var25 = MouseHandler.MouseHandler_x; - var18 = MouseHandler.MouseHandler_y; - } - - if (!WorldMapIcon_1.mouseCam && var4 == 4) { - var4 = 1; - } - - if (Login.loginIndex == 0) { - boolean var19 = false; - - while (DynamicObject.isKeyDown()) { - if (SecureRandomFuture.field1230 == 84) { - var19 = true; - } - } - - int var8 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 80; - short var9 = 291; - if (var4 == 1 && var25 >= var8 - 75 && var25 <= var8 + 75 && var18 >= var9 - 20 && var18 <= var9 + 20) { - ArchiveDiskActionHandler.openURL(FaceNormal.method3229("secure", true) + "m=account-creation/g=oldscape/create_account_funnel.ws", true, false); - } - - var8 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + 80; - if (var4 == 1 && var25 >= var8 - 75 && var25 <= var8 + 75 && var18 >= var9 - 20 && var18 <= var9 + 20 || var19) { - if ((Client.worldProperties & 33554432) != 0) { - Login.Login_response0 = ""; - Login.Login_response1 = "This is a Beta world."; - Login.Login_response2 = "Your normal account will not be affected."; - Login.Login_response3 = ""; - Login.loginIndex = 1; - if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { - Login.currentLoginField = 1; - } else { - Login.currentLoginField = 0; - } - } else if ((Client.worldProperties & 4) != 0) { - if ((Client.worldProperties & 1024) != 0) { - Login.Login_response1 = "This is a High Risk PvP world."; - Login.Login_response2 = "Players can attack each other almost everywhere"; - Login.Login_response3 = "and the Protect Item prayer won't work."; - } else { - Login.Login_response1 = "This is a PvP world."; - Login.Login_response2 = "Players can attack each other"; - Login.Login_response3 = "almost everywhere."; - } - - Login.Login_response0 = "Warning!"; - Login.loginIndex = 1; - if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { - Login.currentLoginField = 1; - } else { - Login.currentLoginField = 0; - } - } else if ((Client.worldProperties & 1024) != 0) { - Login.Login_response1 = "This is a High Risk world."; - Login.Login_response2 = "The Protect Item prayer will"; - Login.Login_response3 = "not work on this world."; - Login.Login_response0 = "Warning!"; - Login.loginIndex = 1; - if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { - Login.currentLoginField = 1; - } else { - Login.currentLoginField = 0; - } - } else { - TilePaint.Login_promptCredentials(false); - } - } - } else if (Login.loginIndex == 1) { - while (DynamicObject.isKeyDown()) { - if (SecureRandomFuture.field1230 == 84) { - TilePaint.Login_promptCredentials(false); - } else if (SecureRandomFuture.field1230 == 13) { - Login.loginIndex = 0; - } - } - - int var20 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 80; - short var22 = 321; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - TilePaint.Login_promptCredentials(false); - } - - var20 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + 80; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - Login.loginIndex = 0; - } - } else if (Login.loginIndex == 2) { - short var21 = 201; - int var20 = var21 + 52; - if (var4 == 1 && var18 >= var20 - 12 && var18 < var20 + 2) { - Login.currentLoginField = 0; - } - - var20 += 15; - if (var4 == 1 && var18 >= var20 - 12 && var18 < var20 + 2) { - Login.currentLoginField = 1; - } - - var20 += 15; - var21 = 361; - if (LoginScreenAnimation.field1032 != null) { - int var8 = LoginScreenAnimation.field1032.highX / 2; - if (var4 == 1 && var25 >= LoginScreenAnimation.field1032.lowX - var8 && var25 <= var8 + LoginScreenAnimation.field1032.lowX && var18 >= var21 - 15 && var18 < var21) { - switch (Login.field1171) { - case 1: - PlayerType.setLoginResponseString("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); - Login.loginIndex = 5; - return; - case 2: - ArchiveDiskActionHandler.openURL("https://support.runescape.com/hc/en-gb", true, false); - } - } - } - - int var8 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 80; - short var9 = 321; - if (var4 == 1 && var25 >= var8 - 75 && var25 <= var8 + 75 && var18 >= var9 - 20 && var18 <= var9 + 20) { - Login.Login_username = Login.Login_username.trim(); - if (Login.Login_username.length() == 0) { - PlayerType.setLoginResponseString("", "Please enter your username/email address.", ""); - return; - } - - if (Login.Login_password.length() == 0) { - PlayerType.setLoginResponseString("", "Please enter your password.", ""); - return; - } - - PlayerType.setLoginResponseString("", "Connecting to server...", ""); - PlayerType.method4104(false); - MouseRecorder.updateGameState(20); - return; - } - - var8 = Login.loginBoxX + 180 + 80; - if (var4 == 1 && var25 >= var8 - 75 && var25 <= var8 + 75 && var18 >= var9 - 20 && var18 <= var9 + 20) { - Login.loginIndex = 0; - Login.Login_username = ""; - Login.Login_password = ""; - class185.field2305 = 0; - DesktopPlatformInfoProvider.otp = ""; - Login.field1183 = true; - } - - var8 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + -117; - var9 = 277; - Login.field1176 = var25 >= var8 && var25 < var8 + class83.field1145 && var18 >= var9 && var18 < var9 + WorldMapCacheName.field286; - if (var4 == 1 && Login.field1176) { - Client.Login_isUsernameRemembered = !Client.Login_isUsernameRemembered; - if (!Client.Login_isUsernameRemembered && AbstractArchive.clientPreferences.rememberedUsername != null) { - AbstractArchive.clientPreferences.rememberedUsername = null; - Language.savePreferences(); - } - } - - var8 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + 24; - var9 = 277; - Login.field1192 = var25 >= var8 && var25 < var8 + class83.field1145 && var18 >= var9 && var18 < var9 + WorldMapCacheName.field286; - if (var4 == 1 && Login.field1192) { - AbstractArchive.clientPreferences.hideUsername = !AbstractArchive.clientPreferences.hideUsername; - if (!AbstractArchive.clientPreferences.hideUsername) { - Login.Login_username = ""; - AbstractArchive.clientPreferences.rememberedUsername = null; - if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { - Login.currentLoginField = 1; - } else { - Login.currentLoginField = 0; - } - } - - Language.savePreferences(); - } - - while (DynamicObject.isKeyDown()) { - boolean var10 = false; - - for (int var11 = 0; var11 < "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".length(); ++var11) { - if (KeyHandler.field381 == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".charAt(var11)) { - var10 = true; - break; - } - } - - if (SecureRandomFuture.field1230 == 13) { - Login.loginIndex = 0; - Login.Login_username = ""; - Login.Login_password = ""; - class185.field2305 = 0; - DesktopPlatformInfoProvider.otp = ""; - Login.field1183 = true; - } else if (Login.currentLoginField == 0) { - if (SecureRandomFuture.field1230 == 85 && Login.Login_username.length() > 0) { - Login.Login_username = Login.Login_username.substring(0, Login.Login_username.length() - 1); - } - - if (SecureRandomFuture.field1230 == 84 || SecureRandomFuture.field1230 == 80) { - Login.currentLoginField = 1; - } - - if (var10 && Login.Login_username.length() < 320) { - Login.Login_username = Login.Login_username + KeyHandler.field381; - } - } else if (Login.currentLoginField == 1) { - if (SecureRandomFuture.field1230 == 85 && Login.Login_password.length() > 0) { - Login.Login_password = Login.Login_password.substring(0, Login.Login_password.length() - 1); - } - - if (SecureRandomFuture.field1230 == 84 || SecureRandomFuture.field1230 == 80) { - Login.currentLoginField = 0; - } - - if (SecureRandomFuture.field1230 == 84) { - Login.Login_username = Login.Login_username.trim(); - if (Login.Login_username.length() == 0) { - PlayerType.setLoginResponseString("", "Please enter your username/email address.", ""); - return; - } - - if (Login.Login_password.length() == 0) { - PlayerType.setLoginResponseString("", "Please enter your password.", ""); - return; - } - - PlayerType.setLoginResponseString("", "Connecting to server...", ""); - PlayerType.method4104(false); - MouseRecorder.updateGameState(20); - return; - } - - if (var10 && Login.Login_password.length() < 20) { - Login.Login_password = Login.Login_password + KeyHandler.field381; - } - } - } - } else if (Login.loginIndex == 3) { - int var20 = Login.loginBoxX + 180; - short var22 = 276; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - TilePaint.Login_promptCredentials(false); - } - - var20 = Login.loginBoxX + 180; - var22 = 326; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - PlayerType.setLoginResponseString("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); - Login.loginIndex = 5; - } - } else if (Login.loginIndex == 4) { - int var20 = Login.loginBoxX + 180 - 80; - short var22 = 321; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - DesktopPlatformInfoProvider.otp.trim(); - if (DesktopPlatformInfoProvider.otp.length() != 6) { - PlayerType.setLoginResponseString("", "Please enter a 6-digit PIN.", ""); - return; - } - - class185.field2305 = Integer.parseInt(DesktopPlatformInfoProvider.otp); - DesktopPlatformInfoProvider.otp = ""; - PlayerType.method4104(true); - PlayerType.setLoginResponseString("", "Connecting to server...", ""); - MouseRecorder.updateGameState(20); - return; - } - - if (var4 == 1 && var25 >= Login.loginBoxX + 180 - 9 && var25 <= Login.loginBoxX + 180 + 130 && var18 >= 263 && var18 <= 296) { - Login.field1183 = !Login.field1183; - } - - if (var4 == 1 && var25 >= Login.loginBoxX + 180 - 34 && var25 <= Login.loginBoxX + 34 + 180 && var18 >= 351 && var18 <= 363) { - ArchiveDiskActionHandler.openURL(FaceNormal.method3229("secure", true) + "m=totp-authenticator/disableTOTPRequest", true, false); - } - - var20 = Login.loginBoxX + 180 + 80; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - Login.loginIndex = 0; - Login.Login_username = ""; - Login.Login_password = ""; - class185.field2305 = 0; - DesktopPlatformInfoProvider.otp = ""; - } - - while (DynamicObject.isKeyDown()) { - boolean var23 = false; - - for (int var24 = 0; var24 < "1234567890".length(); ++var24) { - if (KeyHandler.field381 == "1234567890".charAt(var24)) { - var23 = true; - break; - } - } - - if (SecureRandomFuture.field1230 == 13) { - Login.loginIndex = 0; - Login.Login_username = ""; - Login.Login_password = ""; - class185.field2305 = 0; - DesktopPlatformInfoProvider.otp = ""; - } else { - if (SecureRandomFuture.field1230 == 85 && DesktopPlatformInfoProvider.otp.length() > 0) { - DesktopPlatformInfoProvider.otp = DesktopPlatformInfoProvider.otp.substring(0, DesktopPlatformInfoProvider.otp.length() - 1); - } - - if (SecureRandomFuture.field1230 == 84) { - DesktopPlatformInfoProvider.otp.trim(); - if (DesktopPlatformInfoProvider.otp.length() != 6) { - PlayerType.setLoginResponseString("", "Please enter a 6-digit PIN.", ""); - return; - } - - class185.field2305 = Integer.parseInt(DesktopPlatformInfoProvider.otp); - DesktopPlatformInfoProvider.otp = ""; - PlayerType.method4104(true); - PlayerType.setLoginResponseString("", "Connecting to server...", ""); - MouseRecorder.updateGameState(20); - return; - } - - if (var23 && DesktopPlatformInfoProvider.otp.length() < 6) { - DesktopPlatformInfoProvider.otp = DesktopPlatformInfoProvider.otp + KeyHandler.field381; - } - } - } - } else if (Login.loginIndex == 5) { - int var20 = Login.loginBoxX + 180 - 80; - short var22 = 321; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - GrandExchangeOfferAgeComparator.method167(); - return; - } - - var20 = Login.loginBoxX + 180 + 80; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - TilePaint.Login_promptCredentials(true); - } - - short var9 = 361; - if (class162.field1988 != null) { - int var24 = class162.field1988.highX / 2; - if (var4 == 1 && var25 >= class162.field1988.lowX - var24 && var25 <= var24 + class162.field1988.lowX && var18 >= var9 - 15 && var18 < var9) { - ArchiveDiskActionHandler.openURL(FaceNormal.method3229("secure", true) + "m=weblogin/g=oldscape/cant_log_in", true, false); - } - } - - while (DynamicObject.isKeyDown()) { - boolean var10 = false; - - for (int var11 = 0; var11 < "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".length(); ++var11) { - if (KeyHandler.field381 == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".charAt(var11)) { - var10 = true; - break; - } - } - - if (SecureRandomFuture.field1230 == 13) { - TilePaint.Login_promptCredentials(true); - } else { - if (SecureRandomFuture.field1230 == 85 && Login.Login_username.length() > 0) { - Login.Login_username = Login.Login_username.substring(0, Login.Login_username.length() - 1); - } - - if (SecureRandomFuture.field1230 == 84) { - GrandExchangeOfferAgeComparator.method167(); - return; - } - - if (var10 && Login.Login_username.length() < 320) { - Login.Login_username = Login.Login_username + KeyHandler.field381; - } - } - } - } else if (Login.loginIndex == 6) { - while (DynamicObject.isKeyDown()) { - if (SecureRandomFuture.field1230 == 84 || SecureRandomFuture.field1230 == 13) { - TilePaint.Login_promptCredentials(true); - } - } - - short var21 = 321; - if (var4 == 1 && var18 >= var21 - 20 && var18 <= var21 + 20){ - TilePaint.Login_promptCredentials(true); - } - } else if (Login.loginIndex == 7) { - int var20 = Login.loginBoxX + 180 - 80; - short var22 = 321; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - ArchiveDiskActionHandler.openURL(FaceNormal.method3229("secure", true) + "m=dob/set_dob.ws", true, false); - PlayerType.setLoginResponseString("", "Page has opened in a new window.", "(Please check your popup blocker.)"); - Login.loginIndex = 6; - return; - } - - var20 = Login.loginBoxX + 180 + 80; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - TilePaint.Login_promptCredentials(true); - } - } else if (Login.loginIndex == 8) { - int var20 = Login.loginBoxX + 180 - 80; - short var22 = 321; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - ArchiveDiskActionHandler.openURL("https://www.jagex.com/terms/privacy/#eight", true, false); - PlayerType.setLoginResponseString("", "Page has opened in a new window.", "(Please check your popup blocker.)"); - Login.loginIndex = 6; - return; - } - - var20 = Login.loginBoxX + 180 + 80; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - TilePaint.Login_promptCredentials(true); - } - } else if (Login.loginIndex == 12) { - String var16 = ""; - switch (Login.field1174) { - case 0: - var16 = "https://support.runescape.com/hc/en-gb/articles/115002238729-Account-Bans"; - break; - case 1: - var16 = "https://support.runescape.com/hc/en-gb/articles/206103939-My-account-is-locked"; - break; - default: - TilePaint.Login_promptCredentials(false); - } - - int var8 = Login.loginBoxX + 180; - short var9 = 276; - if (var4 == 1 && var25 >= var8 - 75 && var25 <= var8 + 75 && var18 >= var9 - 20 && var18 <= var9 + 20) { - ArchiveDiskActionHandler.openURL(var16, true, false); - PlayerType.setLoginResponseString("", "Page has opened in a new window.", "(Please check your popup blocker.)"); - Login.loginIndex = 6; - return; - } - - var8 = Login.loginBoxX + 180; - var9 = 326; - if (var4 == 1 && var25 >= var8 - 75 && var25 <= var8 + 75 && var18 >= var9 - 20 && var18 <= var9 + 20) { - TilePaint.Login_promptCredentials(false); - } - } else if (Login.loginIndex == 24) { - int var20 = Login.loginBoxX + 180; - short var22 = 301; - if (var4 == 1 && var25 >= var20 - 75 && var25 <= var20 + 75 && var18 >= var22 - 20 && var18 <= var22 + 20) { - TilePaint.Login_promptCredentials(false); - } - } - } - - @ObfuscatedName("fi") - @ObfuscatedSignature( - signature = "(Lbi;III)V", - garbageValue = "1912035221" - ) - @Export("performPlayerAnimation") - static void performPlayerAnimation(Player var0, int var1, int var2) { - if (var0.sequence == var1 && var1 != -1) { - int var3 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var1).field3517; - if (var3 == 1) { - var0.sequenceFrame = 0; - var0.sequenceFrameCycle = 0; - var0.sequenceDelay = var2; - var0.field965 = 0; - } - - if (var3 == 2) { - var0.field965 = 0; - } - } else if (var1 == -1 || var0.sequence == -1 || GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var1).field3511 >= GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var0.sequence).field3511) { - var0.sequence = var1; - var0.sequenceFrame = 0; - var0.sequenceFrameCycle = 0; - var0.sequenceDelay = var2; - var0.field965 = 0; - var0.field988 = var0.pathLength; - } - + static void method3767() { + Client.packetWriter.addNode(SoundSystem.getPacketBufferNode(ClientPacket.field2210, Client.packetWriter.isaacCipher)); + Client.oculusOrbState = 0; } } diff --git a/runescape-client/src/main/java/LoginScreenAnimation.java b/runescape-client/src/main/java/LoginScreenAnimation.java index ecffcbeaf2..dcd5990b66 100644 --- a/runescape-client/src/main/java/LoginScreenAnimation.java +++ b/runescape-client/src/main/java/LoginScreenAnimation.java @@ -1,218 +1,216 @@ -import java.net.MalformedURLException; -import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("br") +@ObfuscatedName("bv") @Implements("LoginScreenAnimation") public class LoginScreenAnimation { - @ObfuscatedName("as") - @ObfuscatedSignature( - signature = "Lll;" + @ObfuscatedName("l") + @ObfuscatedGetter( + intValue = 1863023515 ) - static Bounds field1032; - @ObfuscatedName("z") + static int field1029; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "[Llp;" + signature = "[Llw;" ) @Export("sprites") IndexedSprite[] sprites; - @ObfuscatedName("q") - int[] field1017; - @ObfuscatedName("m") - @ObfuscatedGetter( - intValue = 433825167 - ) - int field1018; - @ObfuscatedName("y") - int[] field1019; - @ObfuscatedName("i") - int[] field1030; @ObfuscatedName("c") - int[] field1021; - @ObfuscatedName("b") - int[] field1022; + int[] field1013; @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 1054808651 + intValue = 816842913 ) - int field1023; - @ObfuscatedName("a") - @ObfuscatedGetter( - intValue = -1416071611 - ) - int field1014; - @ObfuscatedName("e") - int[] field1020; - @ObfuscatedName("w") - int[] field1027; - @ObfuscatedName("t") - int[] field1031; - @ObfuscatedName("g") + int field1011; + @ObfuscatedName("i") int[] field1015; - @ObfuscatedName("x") - @ObfuscatedGetter( - intValue = 153935283 - ) - int field1029; + @ObfuscatedName("d") + int[] field1016; + @ObfuscatedName("m") + int[] field1010; + @ObfuscatedName("p") + int[] field1019; @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 456974096 + intValue = 462290829 ) - int field1024; + int field1030; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = 945230157 + ) + int field1020; + @ObfuscatedName("x") + int[] field1021; + @ObfuscatedName("j") + int[] field1022; + @ObfuscatedName("r") + int[] field1014; + @ObfuscatedName("e") + int[] field1024; @ObfuscatedName("s") @ObfuscatedGetter( - intValue = -389038271 + intValue = -1611011869 ) int field1025; + @ObfuscatedName("b") + @ObfuscatedGetter( + intValue = -180087120 + ) + int field1026; + @ObfuscatedName("z") + @ObfuscatedGetter( + intValue = -151698419 + ) + int field1018; @ObfuscatedSignature( - signature = "([Llp;)V" + signature = "([Llw;)V" ) LoginScreenAnimation(IndexedSprite[] var1) { - this.field1017 = new int[256]; - this.field1018 = 0; - this.field1023 = 0; - this.field1014 = 0; - this.field1029 = 0; - this.field1024 = 0; + this.field1013 = new int[256]; + this.field1011 = 0; + this.field1030 = 0; + this.field1020 = 0; this.field1025 = 0; + this.field1026 = 0; + this.field1018 = 0; this.sprites = var1; this.initColors(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-27245818" + garbageValue = "-1417087240" ) @Export("initColors") void initColors() { - this.field1030 = new int[256]; + this.field1016 = new int[256]; int var1; for (var1 = 0; var1 < 64; ++var1) { - this.field1030[var1] = var1 * 262144; + this.field1016[var1] = var1 * 262144; } for (var1 = 0; var1 < 64; ++var1) { - this.field1030[var1 + 64] = var1 * 1024 + 16711680; + this.field1016[var1 + 64] = var1 * 1024 + 16711680; } for (var1 = 0; var1 < 64; ++var1) { - this.field1030[var1 + 128] = var1 * 4 + 16776960; + this.field1016[var1 + 128] = var1 * 4 + 16776960; } for (var1 = 0; var1 < 64; ++var1) { - this.field1030[var1 + 192] = 16777215; + this.field1016[var1 + 192] = 16777215; } - this.field1021 = new int[256]; + this.field1010 = new int[256]; for (var1 = 0; var1 < 64; ++var1) { - this.field1021[var1] = var1 * 1024; + this.field1010[var1] = var1 * 1024; } for (var1 = 0; var1 < 64; ++var1) { - this.field1021[var1 + 64] = var1 * 4 + 65280; + this.field1010[var1 + 64] = var1 * 4 + 65280; } for (var1 = 0; var1 < 64; ++var1) { - this.field1021[var1 + 128] = var1 * 262144 + 65535; + this.field1010[var1 + 128] = var1 * 262144 + 65535; } for (var1 = 0; var1 < 64; ++var1) { - this.field1021[var1 + 192] = 16777215; - } - - this.field1022 = new int[256]; - - for (var1 = 0; var1 < 64; ++var1) { - this.field1022[var1] = var1 * 4; - } - - for (var1 = 0; var1 < 64; ++var1) { - this.field1022[var1 + 64] = var1 * 262144 + 255; - } - - for (var1 = 0; var1 < 64; ++var1) { - this.field1022[var1 + 128] = var1 * 1024 + 16711935; - } - - for (var1 = 0; var1 < 64; ++var1) { - this.field1022[var1 + 192] = 16777215; + this.field1010[var1 + 192] = 16777215; } this.field1019 = new int[256]; - this.field1029 = 0; - this.field1031 = new int[32768]; - this.field1015 = new int[32768]; - this.method1828((IndexedSprite)null); - this.field1020 = new int[32768]; - this.field1027 = new int[32768]; + + for (var1 = 0; var1 < 64; ++var1) { + this.field1019[var1] = var1 * 4; + } + + for (var1 = 0; var1 < 64; ++var1) { + this.field1019[var1 + 64] = var1 * 262144 + 255; + } + + for (var1 = 0; var1 < 64; ++var1) { + this.field1019[var1 + 128] = var1 * 1024 + 16711935; + } + + for (var1 = 0; var1 < 64; ++var1) { + this.field1019[var1 + 192] = 16777215; + } + + this.field1015 = new int[256]; + this.field1025 = 0; + this.field1014 = new int[32768]; + this.field1024 = new int[32768]; + this.method1932((IndexedSprite)null); + this.field1021 = new int[32768]; + this.field1022 = new int[32768]; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "-89" + ) + void method1955() { + this.field1016 = null; + this.field1010 = null; + this.field1019 = null; + this.field1015 = null; + this.field1014 = null; + this.field1024 = null; + this.field1021 = null; + this.field1022 = null; + this.field1025 = 0; + this.field1026 = 0; } @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1384251878" - ) - void method1821() { - this.field1030 = null; - this.field1021 = null; - this.field1022 = null; - this.field1019 = null; - this.field1031 = null; - this.field1015 = null; - this.field1020 = null; - this.field1027 = null; - this.field1029 = 0; - this.field1024 = 0; - } - - @ObfuscatedName("v") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "-938798150" + garbageValue = "664773191" ) @Export("draw") void draw(int var1, int var2) { - if (this.field1020 == null) { + if (this.field1021 == null) { this.initColors(); } - if (this.field1025 == 0) { - this.field1025 = var2; + if (this.field1018 == 0) { + this.field1018 = var2; } - int var3 = var2 - this.field1025; + int var3 = var2 - this.field1018; if (var3 >= 256) { var3 = 0; } - this.field1025 = var2; + this.field1018 = var2; if (var3 > 0) { - this.method1823(var3); + this.method1927(var3); } - this.method1840(var1); + this.method1929(var1); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-1108655518" + signature = "(IB)V", + garbageValue = "-50" ) - final void method1823(int var1) { - this.field1029 += var1 * 128; + final void method1927(int var1) { + this.field1025 += var1 * 128; int var2; - if (this.field1029 > this.field1031.length) { - this.field1029 -= this.field1031.length; + if (this.field1025 > this.field1014.length) { + this.field1025 -= this.field1014.length; var2 = (int)(Math.random() * 12.0D); - this.method1828(this.sprites[var2]); + this.method1932(this.sprites[var2]); } var2 = 0; @@ -221,12 +219,12 @@ public class LoginScreenAnimation { int var6; for (int var5 = 0; var5 < var4; ++var5) { - var6 = this.field1020[var2 + var3] - this.field1031[var2 + this.field1029 & this.field1031.length - 1] * var1 / 6; + var6 = this.field1021[var2 + var3] - this.field1014[var2 + this.field1025 & this.field1014.length - 1] * var1 / 6; if (var6 < 0) { var6 = 0; } - this.field1020[var2++] = var6; + this.field1021[var2++] = var6; } byte var15 = 10; @@ -240,42 +238,42 @@ public class LoginScreenAnimation { for (int var9 = 0; var9 < 128; ++var9) { var10 = (int)(Math.random() * 100.0D); if (var10 < 50 && var9 > var15 && var9 < var6) { - this.field1020[var9 + var8] = 255; + this.field1021[var9 + var8] = 255; } else { - this.field1020[var8 + var9] = 0; + this.field1021[var9 + var8] = 0; } } } - if (this.field1023 * 16 > 0) { - this.field1023 = this.field1023 * 16 - var1 * 4; + if (this.field1030 * 16 > 0) { + this.field1030 = this.field1030 * 16 - var1 * 4; } - if (this.field1014 * 16 > 0) { - this.field1014 = this.field1014 * 16 - var1 * 4; + if (this.field1020 * 16 > 0) { + this.field1020 = this.field1020 * 16 - var1 * 4; } - if (this.field1023 * 16 == 0 && this.field1014 * 16 == 0) { + if (this.field1030 * 16 == 0 && this.field1020 * 16 == 0) { var7 = (int)(Math.random() * (double)(2000 / var1)); if (var7 == 0) { - this.field1023 = 1024; + this.field1030 = 1024; } if (var7 == 1) { - this.field1014 = 1024; + this.field1020 = 1024; } } for (var7 = 0; var7 < 256 - var1; ++var7) { - this.field1017[var7] = this.field1017[var7 + var1]; + this.field1013[var7] = this.field1013[var7 + var1]; } for (var7 = 256 - var1; var7 < 256; ++var7) { - this.field1017[var7] = (int)(Math.sin((double)this.field1018 / 14.0D) * 16.0D + Math.sin((double)this.field1018 / 15.0D) * 14.0D + Math.sin((double)this.field1018 / 16.0D) * 12.0D); - ++this.field1018; + this.field1013[var7] = (int)(Math.sin((double)this.field1011 / 14.0D) * 16.0D + Math.sin((double)this.field1011 / 15.0D) * 14.0D + Math.sin((double)this.field1011 / 16.0D) * 12.0D); + ++this.field1011; } - this.field1024 = this.field1024 * 10000 + 10000 * var1; + this.field1026 = this.field1026 * 10000 + 10000 * var1; var7 = ((Client.cycle & 1) + var1) / 2; if (var7 > 0) { short var16 = 128; @@ -285,13 +283,13 @@ public class LoginScreenAnimation { int var11; int var12; int var13; - for (var11 = 0; var11 < this.field1024 * 100; ++var11) { + for (var11 = 0; var11 < this.field1026 * 100; ++var11) { var12 = (int)(Math.random() * (double)var10) + var17; var13 = (int)(Math.random() * (double)var16) + var16; - this.field1020[var12 + (var13 << 7)] = 192; + this.field1021[var12 + (var13 << 7)] = 192; } - this.field1024 = 0; + this.field1026 = 0; int var14; for (var11 = 0; var11 < 256; ++var11) { @@ -300,15 +298,15 @@ public class LoginScreenAnimation { for (var14 = -var7; var14 < 128; ++var14) { if (var14 + var7 < 128) { - var12 += this.field1020[var7 + var14 + var13]; + var12 += this.field1021[var7 + var13 + var14]; } if (var14 - (var7 + 1) >= 0) { - var12 -= this.field1020[var13 + var14 - (var7 + 1)]; + var12 -= this.field1021[var14 + var13 - (var7 + 1)]; } if (var14 >= 0) { - this.field1027[var14 + var13] = var12 / (var7 * 2 + 1); + this.field1022[var13 + var14] = var12 / (var7 * 2 + 1); } } } @@ -319,15 +317,15 @@ public class LoginScreenAnimation { for (var13 = -var7; var13 < 256; ++var13) { var14 = var13 * 128; if (var7 + var13 < 256) { - var12 += this.field1027[var7 * 128 + var14 + var11]; + var12 += this.field1022[var7 * 128 + var11 + var14]; } if (var13 - (var7 + 1) >= 0) { - var12 -= this.field1027[var14 + var11 - (var7 + 1) * 128]; + var12 -= this.field1022[var11 + var14 - (var7 + 1) * 128]; } if (var13 >= 0) { - this.field1020[var11 + var14] = var12 / (var7 * 2 + 1); + this.field1021[var14 + var11] = var12 / (var7 * 2 + 1); } } } @@ -335,66 +333,66 @@ public class LoginScreenAnimation { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(IIII)I", - garbageValue = "1638746019" + garbageValue = "-805696454" ) - final int method1824(int var1, int var2, int var3) { + final int method1928(int var1, int var2, int var3) { int var4 = 256 - var3; - return (var3 * (var2 & 65280) + var4 * (var1 & 65280) & 16711680) + (var4 * (var1 & 16711935) + var3 * (var2 & 16711935) & -16711936) >> 8; + return (var4 * (var1 & 16711935) + var3 * (var2 & 16711935) & -16711936) + (var3 * (var2 & 65280) + var4 * (var1 & 65280) & 16711680) >> 8; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "97" + signature = "(IS)V", + garbageValue = "25374" ) - final void method1840(int var1) { - int var2 = this.field1019.length; - if (this.field1023 * 16 > 0) { - this.method1826(this.field1023 * 16, this.field1021); - } else if (this.field1014 * 16 > 0) { - this.method1826(this.field1014 * 16, this.field1022); + final void method1929(int var1) { + int var2 = this.field1015.length; + if (this.field1030 * 16 > 0) { + this.method1930(this.field1030 * 16, this.field1010); + } else if (this.field1020 * 16 > 0) { + this.method1930(this.field1020 * 16, this.field1019); } else { for (int var3 = 0; var3 < var2; ++var3) { - this.field1019[var3] = this.field1030[var3]; + this.field1015[var3] = this.field1016[var3]; } } - this.method1827(var1); + this.method1931(var1); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I[II)V", - garbageValue = "-1982126918" + garbageValue = "-1624613392" ) - final void method1826(int var1, int[] var2) { - int var3 = this.field1019.length; + final void method1930(int var1, int[] var2) { + int var3 = this.field1015.length; for (int var4 = 0; var4 < var3; ++var4) { if (var1 > 768) { - this.field1019[var4] = this.method1824(this.field1030[var4], var2[var4], 1024 - var1); + this.field1015[var4] = this.method1928(this.field1016[var4], var2[var4], 1024 - var1); } else if (var1 > 256) { - this.field1019[var4] = var2[var4]; + this.field1015[var4] = var2[var4]; } else { - this.field1019[var4] = this.method1824(var2[var4], this.field1030[var4], 256 - var1); + this.field1015[var4] = this.method1928(var2[var4], this.field1016[var4], 256 - var1); } } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-224486060" + garbageValue = "-782964305" ) - final void method1827(int var1) { + final void method1931(int var1) { int var2 = 0; for (int var3 = 1; var3 < 255; ++var3) { - int var4 = (256 - var3) * this.field1017[var3] / 256; + int var4 = (256 - var3) * this.field1013[var3] / 256; int var5 = var4 + var1; int var6 = 0; int var7 = 128; @@ -403,22 +401,22 @@ public class LoginScreenAnimation { var5 = 0; } - if (var5 + 128 >= class42.rasterProvider.width) { - var7 = class42.rasterProvider.width - var5; + if (var5 + 128 >= AbstractWorldMapData.rasterProvider.width) { + var7 = AbstractWorldMapData.rasterProvider.width - var5; } - int var8 = var5 + (var3 + 8) * class42.rasterProvider.width; + int var8 = var5 + (var3 + 8) * AbstractWorldMapData.rasterProvider.width; var2 += var6; for (int var9 = var6; var9 < var7; ++var9) { - int var10 = this.field1020[var2++]; + int var10 = this.field1021[var2++]; int var11 = var8 % Rasterizer2D.Rasterizer2D_width; if (var10 != 0 && var11 >= Rasterizer2D.Rasterizer2D_xClipStart && var11 < Rasterizer2D.Rasterizer2D_xClipEnd) { int var12 = var10; int var13 = 256 - var10; - var10 = this.field1019[var10]; - int var14 = class42.rasterProvider.pixels[var8]; - class42.rasterProvider.pixels[var8++] = -16777216 | ((var14 & 16711935) * var13 + (var10 & 16711935) * var12 & -16711936) + (var12 * (var10 & 65280) + var13 * (var14 & 65280) & 16711680) >> 8; + var10 = this.field1015[var10]; + int var14 = AbstractWorldMapData.rasterProvider.pixels[var8]; + AbstractWorldMapData.rasterProvider.pixels[var8++] = -16777216 | (var12 * (var10 & 65280) + var13 * (var14 & 65280) & 16711680) + ((var14 & 16711935) * var13 + (var10 & 16711935) * var12 & -16711936) >> 8; } else { ++var8; } @@ -429,21 +427,21 @@ public class LoginScreenAnimation { } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(Llp;I)V", - garbageValue = "1363271921" + signature = "(Llw;I)V", + garbageValue = "2025756403" ) - final void method1828(IndexedSprite var1) { + final void method1932(IndexedSprite var1) { int var2; - for (var2 = 0; var2 < this.field1031.length; ++var2) { - this.field1031[var2] = 0; + for (var2 = 0; var2 < this.field1014.length; ++var2) { + this.field1014[var2] = 0; } int var3; for (var2 = 0; var2 < 5000; ++var2) { var3 = (int)(Math.random() * 128.0D * 256.0D); - this.field1031[var3] = (int)(Math.random() * 256.0D); + this.field1014[var3] = (int)(Math.random() * 256.0D); } int var4; @@ -452,13 +450,13 @@ public class LoginScreenAnimation { for (var3 = 1; var3 < 255; ++var3) { for (var4 = 1; var4 < 127; ++var4) { var5 = var4 + (var3 << 7); - this.field1015[var5] = (this.field1031[var5 + 1] + this.field1031[var5 + 128] + this.field1031[var5 - 128] + this.field1031[var5 - 1]) / 4; + this.field1024[var5] = (this.field1014[var5 - 128] + this.field1014[var5 + 1] + this.field1014[var5 + 128] + this.field1014[var5 - 1]) / 4; } } - int[] var8 = this.field1031; - this.field1031 = this.field1015; - this.field1015 = var8; + int[] var8 = this.field1014; + this.field1014 = this.field1024; + this.field1024 = var8; } if (var1 != null) { @@ -470,98 +468,11 @@ public class LoginScreenAnimation { var5 = var4 + var1.xOffset + 16; int var6 = var3 + var1.yOffset + 16; int var7 = var5 + (var6 << 7); - this.field1031[var7] = 0; + this.field1014[var7] = 0; } } } } } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)Z", - garbageValue = "666011978" - ) - @Export("isValidURL") - static boolean isValidURL(String var0) { - if (var0 == null) { - return false; - } else { - try { - new URL(var0); - return true; - } catch (MalformedURLException var2) { - return false; - } - } - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(CI)Z", - garbageValue = "1979853088" - ) - public static boolean method1843(char var0) { - if ((var0 <= 0 || var0 >= 128) && (var0 < 160 || var0 > 255)) { - if (var0 != 0) { - char[] var1 = class287.cp1252AsciiExtension; - - for (int var2 = 0; var2 < var1.length; ++var2) { - char var3 = var1[var2]; - if (var0 == var3) { - return true; - } - } - } - - return false; - } else { - return true; - } - } - - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "(Lho;IIII)V", - garbageValue = "1378912334" - ) - @Export("Widget_setKeyRate") - static final void Widget_setKeyRate(Widget var0, int var1, int var2, int var3) { - if (var0.field2586 == null) { - throw new RuntimeException(); - } else { - var0.field2586[var1] = var2; - var0.field2548[var1] = var3; - } - } - - @ObfuscatedName("an") - @ObfuscatedSignature( - signature = "([BIII)I", - garbageValue = "-1562433827" - ) - static int method1848(byte[] var0, int var1, int var2) { - int var3 = -1; - - for (int var4 = var1; var4 < var2; ++var4) { - var3 = var3 >>> 8 ^ Buffer.crc32Table[(var3 ^ var0[var4]) & 255]; - } - - var3 = ~var3; - return var3; - } - - @ObfuscatedName("kh") - @ObfuscatedSignature( - signature = "([BII)V", - garbageValue = "-2002563170" - ) - static void method1832(byte[] var0, int var1) { - if (Client.randomDatData == null) { - Client.randomDatData = new byte[24]; - } - - class300.writeRandomDat(var0, var1, Client.randomDatData, 0, 24); - } } diff --git a/runescape-client/src/main/java/LoginType.java b/runescape-client/src/main/java/LoginType.java index f8bb5f98ca..7e4eb6d952 100644 --- a/runescape-client/src/main/java/LoginType.java +++ b/runescape-client/src/main/java/LoginType.java @@ -4,73 +4,73 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("li") +@ObfuscatedName("ln") @Implements("LoginType") public class LoginType { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) @Export("oldscape") public static final LoginType oldscape; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lli;" - ) - static final LoginType field4026; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lli;" - ) - static final LoginType field4029; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) static final LoginType field4025; - @ObfuscatedName("r") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lli;" - ) - static final LoginType field4028; - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lli;" - ) - static final LoginType field4027; - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "Lli;" - ) - static final LoginType field4024; - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" ) static final LoginType field4031; - @ObfuscatedName("y") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lln;" + ) + static final LoginType field4029; + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "Lln;" + ) + static final LoginType field4028; + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "Lln;" + ) + static final LoginType field4027; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Lln;" + ) + static final LoginType field4030; + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lln;" + ) + static final LoginType field4026; + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "Lln;" ) public static final LoginType field4032; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 1653780659 + intValue = -812459159 ) final int field4033; - @ObfuscatedName("c") + @ObfuscatedName("m") final String field4034; static { - oldscape = new LoginType(7, 0, "", ""); - field4026 = new LoginType(5, 1, "", ""); - field4029 = new LoginType(6, 2, "", ""); - field4025 = new LoginType(2, 3, "", ""); - field4028 = new LoginType(4, 4, "", ""); - field4027 = new LoginType(0, 5, "", ""); - field4024 = new LoginType(8, 6, "", ""); - field4031 = new LoginType(3, 7, "", ""); - field4032 = new LoginType(1, -1, "", "", true, new LoginType[]{oldscape, field4026, field4029, field4028, field4025}); + oldscape = new LoginType(4, 0, "", ""); + field4025 = new LoginType(1, 1, "", ""); + field4031 = new LoginType(2, 2, "", ""); + field4029 = new LoginType(5, 3, "", ""); + field4028 = new LoginType(0, 4, "", ""); + field4027 = new LoginType(8, 5, "", ""); + field4030 = new LoginType(6, 6, "", ""); + field4026 = new LoginType(7, 7, "", ""); + field4032 = new LoginType(3, -1, "", "", true, new LoginType[]{oldscape, field4025, field4031, field4028, field4029}); } LoginType(int var1, int var2, String var3, String var4) { @@ -79,7 +79,7 @@ public class LoginType { } @ObfuscatedSignature( - signature = "(IILjava/lang/String;Ljava/lang/String;Z[Lli;)V" + signature = "(IILjava/lang/String;Ljava/lang/String;Z[Lln;)V" ) LoginType(int var1, int var2, String var3, String var4, boolean var5, LoginType[] var6) { this.field4033 = var1; diff --git a/runescape-client/src/main/java/MenuAction.java b/runescape-client/src/main/java/MenuAction.java index 08a56b78a2..3ac05be930 100644 --- a/runescape-client/src/main/java/MenuAction.java +++ b/runescape-client/src/main/java/MenuAction.java @@ -1,121 +1,79 @@ -import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cs") +@ObfuscatedName("cd") @Implements("MenuAction") public class MenuAction { - @ObfuscatedName("y") - @ObfuscatedGetter( - intValue = 237272937 + @ObfuscatedName("qj") + @ObfuscatedSignature( + signature = "Ldq;" ) - @Export("PcmPlayer_count") - public static int PcmPlayer_count; - @ObfuscatedName("z") + @Export("pcmPlayer1") + static PcmPlayer pcmPlayer1; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1746809863 - ) - @Export("opcode") - int opcode; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = -950426859 + intValue = -1613868885 ) @Export("argument1") int argument1; - @ObfuscatedName("v") + @ObfuscatedName("t") + @Export("action") + String action; + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -290789191 + intValue = -872703787 ) @Export("argument2") int argument2; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1009688897 + intValue = 553279575 + ) + @Export("opcode") + int opcode; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = -1804422619 ) @Export("argument0") int argument0; - @ObfuscatedName("r") - @Export("action") - String action; MenuAction() { } - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lky;ZS)V", - garbageValue = "-32250" + signature = "(II)Lim;", + garbageValue = "-2086805733" ) - public static void method2067(AbstractSocket var0, boolean var1) { - if (NetCache.NetCache_socket != null) { - try { - NetCache.NetCache_socket.close(); - } catch (Exception var6) { + @Export("SpotAnimationDefinition_get") + public static SpotAnimationDefinition SpotAnimationDefinition_get(int var0) { + SpotAnimationDefinition var1 = (SpotAnimationDefinition)SpotAnimationDefinition.SpotAnimationDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = SpotAnimationDefinition.SpotAnimationDefinition_archive.takeFile(13, var0); + var1 = new SpotAnimationDefinition(); + var1.id = var0; + if (var2 != null) { + var1.decode(new Buffer(var2)); } - NetCache.NetCache_socket = null; - } - - NetCache.NetCache_socket = var0; - DirectByteArrayCopier.method3924(var1); - NetCache.NetCache_responseHeaderBuffer.offset = 0; - WorldMapEvent.NetCache_currentResponse = null; - FaceNormal.NetCache_responseArchiveBuffer = null; - NetCache.field3140 = 0; - - while (true) { - NetFileRequest var2 = (NetFileRequest)NetCache.NetCache_pendingPriorityResponses.first(); - if (var2 == null) { - while (true) { - var2 = (NetFileRequest)NetCache.NetCache_pendingResponses.first(); - if (var2 == null) { - if (NetCache.field3156 != 0) { - try { - Buffer var7 = new Buffer(4); - var7.writeByte(4); - var7.writeByte(NetCache.field3156); - var7.writeShort(0); - NetCache.NetCache_socket.write(var7.array, 0, 4); - } catch (IOException var5) { - try { - NetCache.NetCache_socket.close(); - } catch (Exception var4) { - } - - ++NetCache.NetCache_ioExceptions; - NetCache.NetCache_socket = null; - } - } - - NetCache.NetCache_loadTime = 0; - NetCache.field3142 = class30.currentTimeMillis(); - return; - } - - NetCache.NetCache_pendingWritesQueue.addLast(var2); - NetCache.NetCache_pendingWrites.put(var2, var2.key); - ++NetCache.NetCache_pendingWritesCount; - --NetCache.NetCache_pendingResponsesCount; - } - } - - NetCache.NetCache_pendingPriorityWrites.put(var2, var2.key); - ++NetCache.NetCache_pendingPriorityWritesCount; - --NetCache.NetCache_pendingPriorityResponsesCount; + SpotAnimationDefinition.SpotAnimationDefinition_cached.put(var1, (long)var0); + return var1; } } - @ObfuscatedName("c") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1201643852" + signature = "(Lhq;III)Llx;", + garbageValue = "1380862020" ) - public static final void method2066() { - ViewportMouse.ViewportMouse_isInViewport = false; - ViewportMouse.ViewportMouse_entityCount = 0; + @Export("SpriteBuffer_getSprite") + public static Sprite SpriteBuffer_getSprite(AbstractArchive var0, int var1, int var2) { + return !class32.method618(var0, var1, var2) ? null : Username.method5338(); } } diff --git a/runescape-client/src/main/java/Message.java b/runescape-client/src/main/java/Message.java index aaa5ec3c79..b5c4275c2d 100644 --- a/runescape-client/src/main/java/Message.java +++ b/runescape-client/src/main/java/Message.java @@ -3,58 +3,69 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("be") +@ObfuscatedName("bt") @Implements("Message") public class Message extends DualNode { - @ObfuscatedName("eh") + @ObfuscatedName("sb") @ObfuscatedGetter( - intValue = -1928576619 + longValue = -680699599489496797L ) - static int field592; - @ObfuscatedName("z") + static long field584; + @ObfuscatedName("be") + @ObfuscatedSignature( + signature = "Llw;" + ) + static IndexedSprite field587; + @ObfuscatedName("fi") @ObfuscatedGetter( - intValue = 36313413 + longValue = 9196175446999067947L + ) + static long field577; + @ObfuscatedName("a") + @ObfuscatedGetter( + intValue = 911828469 ) @Export("count") int count; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1483460383 + intValue = -1904084765 ) @Export("cycle") int cycle; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -991694021 + intValue = 1353192455 ) @Export("type") int type; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("sender") String sender; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Ljq;" + signature = "Lju;" ) @Export("senderUsername") Username senderUsername; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("isFromFriend0") TriBool isFromFriend0; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("isFromIgnored0") TriBool isFromIgnored0; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("prefix") String prefix; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("text") String text; @@ -64,10 +75,10 @@ public class Message extends DualNode { this.set(var1, var2, var3, var4); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;B)V", - garbageValue = "29" + signature = "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;S)V", + garbageValue = "-16257" ) @Export("set") void set(int var1, String var2, String var3, String var4) { @@ -83,20 +94,20 @@ public class Message extends DualNode { this.clearIsFromIgnored(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "10" + signature = "(I)V", + garbageValue = "2091066977" ) @Export("clearIsFromFriend") void clearIsFromFriend() { this.isFromFriend0 = TriBool.TriBool_unknown; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-1794465193" + signature = "(B)Z", + garbageValue = "-112" ) @Export("isFromFriend") final boolean isFromFriend() { @@ -107,30 +118,30 @@ public class Message extends DualNode { return this.isFromFriend0 == TriBool.TriBool_true; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1169950855" + garbageValue = "-327157913" ) @Export("fillIsFromFriend") void fillIsFromFriend() { - this.isFromFriend0 = Tiles.friendSystem.friendsList.contains(this.senderUsername) ? TriBool.TriBool_true : TriBool.TriBool_false; + this.isFromFriend0 = PacketWriter.friendSystem.friendsList.contains(this.senderUsername) ? TriBool.TriBool_true : TriBool.TriBool_false; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1690653176" + signature = "(B)V", + garbageValue = "63" ) @Export("clearIsFromIgnored") void clearIsFromIgnored() { this.isFromIgnored0 = TriBool.TriBool_unknown; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-759719202" + garbageValue = "694631904" ) @Export("isFromIgnored") final boolean isFromIgnored() { @@ -141,61 +152,551 @@ public class Message extends DualNode { return this.isFromIgnored0 == TriBool.TriBool_true; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1328990032" + garbageValue = "-1904334547" ) @Export("fillIsFromIgnored") void fillIsFromIgnored() { - this.isFromIgnored0 = Tiles.friendSystem.ignoreList.contains(this.senderUsername) ? TriBool.TriBool_true : TriBool.TriBool_false; + this.isFromIgnored0 = PacketWriter.friendSystem.ignoreList.contains(this.senderUsername) ? TriBool.TriBool_true : TriBool.TriBool_false; } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1885223886" + garbageValue = "-452155961" ) @Export("fillSenderUsername") final void fillSenderUsername() { if (this.sender != null) { - this.senderUsername = new Username(WorldMapSectionType.method250(this.sender), WorldMapSection1.loginType); + this.senderUsername = new Username(class186.method3776(this.sender), class60.loginType); } else { this.senderUsername = null; } } - @ObfuscatedName("fk") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIII)V", - garbageValue = "2017032545" + signature = "(IIILfc;Lfm;Z[I[IB)I", + garbageValue = "-128" ) - @Export("queueSoundEffect") - static void queueSoundEffect(int var0, int var1, int var2) { - if (Client.soundEffectVolume != 0 && var1 != 0 && Client.soundEffectCount < 50) { - Client.soundEffectIds[Client.soundEffectCount] = var0; - Client.queuedSoundEffectLoops[Client.soundEffectCount] = var1; - Client.queuedSoundEffectDelays[Client.soundEffectCount] = var2; - Client.soundEffects[Client.soundEffectCount] = null; - Client.soundLocations[Client.soundEffectCount] = 0; - ++Client.soundEffectCount; + public static int method1311(int var0, int var1, int var2, RouteStrategy var3, CollisionMap var4, boolean var5, int[] var6, int[] var7) { + int var9; + for (int var8 = 0; var8 < 128; ++var8) { + for (var9 = 0; var9 < 128; ++var9) { + class173.directions[var8][var9] = 0; + class173.distances[var8][var9] = 99999999; + } + } + + int var10; + int var11; + byte var13; + int var14; + int var15; + int var17; + int var19; + int var20; + int var21; + boolean var28; + int var30; + int var31; + int var33; + if (var2 == 1) { + var10 = var0; + var11 = var1; + byte var12 = 64; + var13 = 64; + var14 = var0 - var12; + var15 = var1 - var13; + class173.directions[var12][var13] = 99; + class173.distances[var12][var13] = 0; + byte var16 = 0; + var17 = 0; + class173.bufferX[var16] = var0; + var33 = var16 + 1; + class173.bufferY[var16] = var1; + int[][] var18 = var4.flags; + + boolean var29; + while (true) { + if (var33 == var17) { + class173.field2070 = var10; + LoginScreenAnimation.field1029 = var11; + var29 = false; + break; + } + + var10 = class173.bufferX[var17]; + var11 = class173.bufferY[var17]; + var17 = var17 + 1 & 4095; + var30 = var10 - var14; + var31 = var11 - var15; + var19 = var10 - var4.xInset; + var20 = var11 - var4.yInset; + if (var3.hasArrived(1, var10, var11, var4)) { + class173.field2070 = var10; + LoginScreenAnimation.field1029 = var11; + var29 = true; + break; + } + + var21 = class173.distances[var30][var31] + 1; + if (var30 > 0 && class173.directions[var30 - 1][var31] == 0 && (var18[var19 - 1][var20] & 19136776) == 0) { + class173.bufferX[var33] = var10 - 1; + class173.bufferY[var33] = var11; + var33 = var33 + 1 & 4095; + class173.directions[var30 - 1][var31] = 2; + class173.distances[var30 - 1][var31] = var21; + } + + if (var30 < 127 && class173.directions[var30 + 1][var31] == 0 && (var18[var19 + 1][var20] & 19136896) == 0) { + class173.bufferX[var33] = var10 + 1; + class173.bufferY[var33] = var11; + var33 = var33 + 1 & 4095; + class173.directions[var30 + 1][var31] = 8; + class173.distances[var30 + 1][var31] = var21; + } + + if (var31 > 0 && class173.directions[var30][var31 - 1] == 0 && (var18[var19][var20 - 1] & 19136770) == 0) { + class173.bufferX[var33] = var10; + class173.bufferY[var33] = var11 - 1; + var33 = var33 + 1 & 4095; + class173.directions[var30][var31 - 1] = 1; + class173.distances[var30][var31 - 1] = var21; + } + + if (var31 < 127 && class173.directions[var30][var31 + 1] == 0 && (var18[var19][var20 + 1] & 19136800) == 0) { + class173.bufferX[var33] = var10; + class173.bufferY[var33] = var11 + 1; + var33 = var33 + 1 & 4095; + class173.directions[var30][var31 + 1] = 4; + class173.distances[var30][var31 + 1] = var21; + } + + if (var30 > 0 && var31 > 0 && class173.directions[var30 - 1][var31 - 1] == 0 && (var18[var19 - 1][var20 - 1] & 19136782) == 0 && (var18[var19 - 1][var20] & 19136776) == 0 && (var18[var19][var20 - 1] & 19136770) == 0) { + class173.bufferX[var33] = var10 - 1; + class173.bufferY[var33] = var11 - 1; + var33 = var33 + 1 & 4095; + class173.directions[var30 - 1][var31 - 1] = 3; + class173.distances[var30 - 1][var31 - 1] = var21; + } + + if (var30 < 127 && var31 > 0 && class173.directions[var30 + 1][var31 - 1] == 0 && (var18[var19 + 1][var20 - 1] & 19136899) == 0 && (var18[var19 + 1][var20] & 19136896) == 0 && (var18[var19][var20 - 1] & 19136770) == 0) { + class173.bufferX[var33] = var10 + 1; + class173.bufferY[var33] = var11 - 1; + var33 = var33 + 1 & 4095; + class173.directions[var30 + 1][var31 - 1] = 9; + class173.distances[var30 + 1][var31 - 1] = var21; + } + + if (var30 > 0 && var31 < 127 && class173.directions[var30 - 1][var31 + 1] == 0 && (var18[var19 - 1][var20 + 1] & 19136824) == 0 && (var18[var19 - 1][var20] & 19136776) == 0 && (var18[var19][var20 + 1] & 19136800) == 0) { + class173.bufferX[var33] = var10 - 1; + class173.bufferY[var33] = var11 + 1; + var33 = var33 + 1 & 4095; + class173.directions[var30 - 1][var31 + 1] = 6; + class173.distances[var30 - 1][var31 + 1] = var21; + } + + if (var30 < 127 && var31 < 127 && class173.directions[var30 + 1][var31 + 1] == 0 && (var18[var19 + 1][var20 + 1] & 19136992) == 0 && (var18[var19 + 1][var20] & 19136896) == 0 && (var18[var19][var20 + 1] & 19136800) == 0) { + class173.bufferX[var33] = var10 + 1; + class173.bufferY[var33] = var11 + 1; + var33 = var33 + 1 & 4095; + class173.directions[var30 + 1][var31 + 1] = 12; + class173.distances[var30 + 1][var31 + 1] = var21; + } + } + + var28 = var29; + } else if (var2 == 2) { + var28 = InterfaceParent.method1262(var0, var1, var3, var4); + } else { + var28 = WorldMapLabelSize.method236(var0, var1, var2, var3, var4); + } + + var9 = var0 - 64; + var10 = var1 - 64; + var11 = class173.field2070; + var30 = LoginScreenAnimation.field1029; + if (!var28) { + var31 = Integer.MAX_VALUE; + var14 = Integer.MAX_VALUE; + byte var32 = 10; + var33 = var3.approxDestinationX; + var17 = var3.approxDestinationY; + int var27 = var3.approxDestinationSizeX; + var19 = var3.approxDestinationSizeY; + + for (var20 = var33 - var32; var20 <= var32 + var33; ++var20) { + for (var21 = var17 - var32; var21 <= var17 + var32; ++var21) { + int var22 = var20 - var9; + int var23 = var21 - var10; + if (var22 >= 0 && var23 >= 0 && var22 < 128 && var23 < 128 && class173.distances[var22][var23] < 100) { + int var24 = 0; + if (var20 < var33) { + var24 = var33 - var20; + } else if (var20 > var33 + var27 - 1) { + var24 = var20 - (var33 + var27 - 1); + } + + int var25 = 0; + if (var21 < var17) { + var25 = var17 - var21; + } else if (var21 > var17 + var19 - 1) { + var25 = var21 - (var17 + var19 - 1); + } + + int var26 = var24 * var24 + var25 * var25; + if (var26 < var31 || var31 == var26 && class173.distances[var22][var23] < var14) { + var31 = var26; + var14 = class173.distances[var22][var23]; + var11 = var20; + var30 = var21; + } + } + } + } + + if (var31 == Integer.MAX_VALUE) { + return -1; + } + } + + if (var0 == var11 && var30 == var1) { + return 0; + } else { + var13 = 0; + class173.bufferX[var13] = var11; + var31 = var13 + 1; + class173.bufferY[var13] = var30; + + for (var14 = var15 = class173.directions[var11 - var9][var30 - var10]; var0 != var11 || var30 != var1; var14 = class173.directions[var11 - var9][var30 - var10]) { + if (var15 != var14) { + var15 = var14; + class173.bufferX[var31] = var11; + class173.bufferY[var31++] = var30; + } + + if ((var14 & 2) != 0) { + ++var11; + } else if ((var14 & 8) != 0) { + --var11; + } + + if ((var14 & 1) != 0) { + ++var30; + } else if ((var14 & 4) != 0) { + --var30; + } + } + + var33 = 0; + + while (var31-- > 0) { + var6[var33] = class173.bufferX[var31]; + var7[var33++] = class173.bufferY[var31]; + if (var33 >= var6.length) { + break; + } + } + + return var33; + } + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(IIB)V", + garbageValue = "18" + ) + public static void method1299(int var0, int var1) { + VarbitDefinition var3 = (VarbitDefinition)VarbitDefinition.VarbitDefinition_cached.get((long)var0); + VarbitDefinition var2; + if (var3 != null) { + var2 = var3; + } else { + byte[] var8 = VarbitDefinition.VarbitDefinition_archive.takeFile(14, var0); + var3 = new VarbitDefinition(); + if (var8 != null) { + var3.decode(new Buffer(var8)); + } + + VarbitDefinition.VarbitDefinition_cached.put(var3, (long)var0); + var2 = var3; + } + + int var4 = var2.baseVar; + int var5 = var2.startBit; + int var6 = var2.endBit; + int var7 = Varps.Varps_masks[var6 - var5]; + if (var1 < 0 || var1 > var7) { + var1 = 0; + } + + var7 <<= var5; + Varps.Varps_main[var4] = Varps.Varps_main[var4] & ~var7 | var1 << var5 & var7; + } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "([BI)[B", + garbageValue = "-2141353592" + ) + static byte[] method1312(byte[] var0) { + int var1 = var0.length; + byte[] var2 = new byte[var1]; + System.arraycopy(var0, 0, var2, 0, var1); + return var2; + } + + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "([BI)V", + garbageValue = "1623096265" + ) + @Export("SpriteBuffer_decode") + static void SpriteBuffer_decode(byte[] var0) { + Buffer var1 = new Buffer(var0); + var1.offset = var0.length - 2; + class325.SpriteBuffer_spriteCount = var1.readUnsignedShort(); + SecureRandomFuture.SpriteBuffer_xOffsets = new int[class325.SpriteBuffer_spriteCount]; + HealthBar.SpriteBuffer_yOffsets = new int[class325.SpriteBuffer_spriteCount]; + SecureRandomCallable.SpriteBuffer_spriteWidths = new int[class325.SpriteBuffer_spriteCount]; + AttackOption.SpriteBuffer_spriteHeights = new int[class325.SpriteBuffer_spriteCount]; + class325.SpriteBuffer_pixels = new byte[class325.SpriteBuffer_spriteCount][]; + var1.offset = var0.length - 7 - class325.SpriteBuffer_spriteCount * 8; + class325.SpriteBuffer_spriteWidth = var1.readUnsignedShort(); + class325.SpriteBuffer_spriteHeight = var1.readUnsignedShort(); + int var2 = (var1.readUnsignedByte() & 255) + 1; + + int var3; + for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { + SecureRandomFuture.SpriteBuffer_xOffsets[var3] = var1.readUnsignedShort(); + } + + for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { + HealthBar.SpriteBuffer_yOffsets[var3] = var1.readUnsignedShort(); + } + + for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { + SecureRandomCallable.SpriteBuffer_spriteWidths[var3] = var1.readUnsignedShort(); + } + + for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { + AttackOption.SpriteBuffer_spriteHeights[var3] = var1.readUnsignedShort(); + } + + var1.offset = var0.length - 7 - class325.SpriteBuffer_spriteCount * 8 - (var2 - 1) * 3; + class325.SpriteBuffer_spritePalette = new int[var2]; + + for (var3 = 1; var3 < var2; ++var3) { + class325.SpriteBuffer_spritePalette[var3] = var1.readMedium(); + if (class325.SpriteBuffer_spritePalette[var3] == 0) { + class325.SpriteBuffer_spritePalette[var3] = 1; + } + } + + var1.offset = 0; + + for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { + int var4 = SecureRandomCallable.SpriteBuffer_spriteWidths[var3]; + int var5 = AttackOption.SpriteBuffer_spriteHeights[var3]; + int var6 = var4 * var5; + byte[] var7 = new byte[var6]; + class325.SpriteBuffer_pixels[var3] = var7; + int var8 = var1.readUnsignedByte(); + int var9; + if (var8 == 0) { + for (var9 = 0; var9 < var6; ++var9) { + var7[var9] = var1.readByte(); + } + } else if (var8 == 1) { + for (var9 = 0; var9 < var4; ++var9) { + for (int var10 = 0; var10 < var5; ++var10) { + var7[var9 + var4 * var10] = var1.readByte(); + } + } + } } } - @ObfuscatedName("gi") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "200131202" + signature = "(ILcj;ZI)I", + garbageValue = "-1500417983" ) - static final void method1231(int var0, int var1) { - if (Client.hintArrowType == 2) { - PlayerAppearance.worldToScreen(Client.hintArrowSubX * 64 + (Client.hintArrowX - class223.baseX * 64 << 7), Client.hintArrowSubY * 64 + (Client.hintArrowY - class286.baseY * 64 << 7), Client.hintArrowHeight * 4); - if (Client.viewportTempX > -1 && Client.cycle % 20 < 10) { - ReflectionCheck.headIconHintSprites[0].drawTransBgAt(var0 + Client.viewportTempX - 12, Client.viewportTempY + var1 - 28); + static int method1310(int var0, Script var1, boolean var2) { + int var3; + int var4; + int var6; + if (var0 == ScriptOpcodes.ENUM_STRING) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + EnumDefinition var5 = Coord.getEnum(var3); + if (var5.outputType != 's') { } + for (var6 = 0; var6 < var5.outputCount; ++var6) { + if (var4 == var5.keys[var6]) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var5.strVals[var6]; + var5 = null; + break; + } + } + + if (var5 != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var5.defaultStr; + } + + return 1; + } else if (var0 != ScriptOpcodes.ENUM) { + if (var0 == ScriptOpcodes.ENUM_GETOUTPUTCOUNT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + EnumDefinition var10 = Coord.getEnum(var3); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var10.size(); + return 1; + } else { + return 2; + } + } else { + Interpreter.Interpreter_intStackSize -= 4; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + int var9 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + EnumDefinition var7 = Coord.getEnum(var9); + if (var3 == var7.inputType && var4 == var7.outputType) { + for (int var8 = 0; var8 < var7.outputCount; ++var8) { + if (var6 == var7.keys[var8]) { + if (var4 == 115) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var7.strVals[var8]; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.intVals[var8]; + } + + var7 = null; + break; + } + } + + if (var7 != null) { + if (var4 == 115) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var7.defaultStr; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.defaultInt; + } + } + + return 1; + } else { + if (var4 == 115) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = "null"; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } + } + } + + @ObfuscatedName("jz") + @ObfuscatedSignature( + signature = "([Lhi;IIIZI)V", + garbageValue = "-548793337" + ) + @Export("resizeInterface") + static void resizeInterface(Widget[] var0, int var1, int var2, int var3, boolean var4) { + for (int var5 = 0; var5 < var0.length; ++var5) { + Widget var6 = var0[var5]; + if (var6 != null && var6.parentId == var1) { + TriBool.alignWidgetSize(var6, var2, var3, var4); + ObjectDefinition.alignWidgetPosition(var6, var2, var3); + if (var6.scrollX > var6.scrollWidth - var6.width) { + var6.scrollX = var6.scrollWidth - var6.width; + } + + if (var6.scrollX < 0) { + var6.scrollX = 0; + } + + if (var6.scrollY > var6.scrollHeight - var6.height) { + var6.scrollY = var6.scrollHeight - var6.height; + } + + if (var6.scrollY < 0) { + var6.scrollY = 0; + } + + if (var6.type == 0) { + class43.revalidateWidgetScroll(var0, var6, var4); + } + } + } + + } + + @ObfuscatedName("ji") + @ObfuscatedSignature( + signature = "(Lhi;Liw;IIZS)V", + garbageValue = "4095" + ) + @Export("addWidgetItemMenuItem") + static final void addWidgetItemMenuItem(Widget var0, ItemDefinition var1, int var2, int var3, boolean var4) { + String[] var5 = var1.inventoryActions; + byte var6 = -1; + String var7 = null; + if (var5 != null && var5[var3] != null) { + if (var3 == 0) { + var6 = 33; + } else if (var3 == 1) { + var6 = 34; + } else if (var3 == 2) { + var6 = 35; + } else if (var3 == 3) { + var6 = 36; + } else { + var6 = 37; + } + + var7 = var5[var3]; + } else if (var3 == 4) { + var6 = 37; + var7 = "Drop"; + } + + if (var6 != -1 && var7 != null) { + ArchiveDiskAction.insertMenuItem(var7, AbstractArchive.colorStartTag(16748608) + var1.name, var6, var1.id, var2, var0.id, var4); + } + + } + + @ObfuscatedName("kn") + @ObfuscatedSignature( + signature = "(IIIILlx;Lhn;B)V", + garbageValue = "40" + ) + @Export("drawSpriteOnMinimap") + static final void drawSpriteOnMinimap(int var0, int var1, int var2, int var3, Sprite var4, SpriteMask var5) { + if (var4 != null) { + int var6 = Client.camAngleY & 2047; + int var7 = var3 * var3 + var2 * var2; + if (var7 <= 6400) { + int var8 = Rasterizer3D.Rasterizer3D_sine[var6]; + int var9 = Rasterizer3D.Rasterizer3D_cosine[var6]; + int var10 = var9 * var2 + var3 * var8 >> 16; + int var11 = var3 * var9 - var8 * var2 >> 16; + if (var7 > 2500) { + var4.method6263(var10 + var5.width / 2 - var4.width / 2, var5.height / 2 - var11 - var4.height / 2, var0, var1, var5.width, var5.height, var5.xStarts, var5.xWidths); + } else { + var4.drawTransBgAt(var0 + var10 + var5.width / 2 - var4.width / 2, var5.height / 2 + var1 - var11 - var4.height / 2); + } + + } } } } diff --git a/runescape-client/src/main/java/Messages.java b/runescape-client/src/main/java/Messages.java index 979b201483..4242368e7e 100644 --- a/runescape-client/src/main/java/Messages.java +++ b/runescape-client/src/main/java/Messages.java @@ -5,37 +5,37 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ci") +@ObfuscatedName("cq") @Implements("Messages") public class Messages { - @ObfuscatedName("qu") - @ObfuscatedGetter( - intValue = -859114081 - ) - static int field1262; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("Messages_channels") static final Map Messages_channels; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("Messages_hashTable") static final IterableNodeHashTable Messages_hashTable; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lji;" + signature = "Ljq;" ) @Export("Messages_queue") static final IterableDualNodeQueue Messages_queue; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 229573181 + intValue = -34471415 ) @Export("Messages_count") static int Messages_count; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = 93041405 + ) + @Export("graphicsTickTimeIdx") + static int graphicsTickTimeIdx; static { Messages_channels = new HashMap(); @@ -43,355 +43,4 @@ public class Messages { Messages_queue = new IterableDualNodeQueue(); Messages_count = 0; } - - @ObfuscatedName("l") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1500079981" - ) - static int method2211(int var0, Script var1, boolean var2) { - String var3; - if (var0 == ScriptOpcodes.MES) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - class210.addGameMessage(0, "", var3); - return 1; - } else if (var0 == ScriptOpcodes.ANIM) { - Interpreter.Interpreter_intStackSize -= 2; - LoginPacket.performPlayerAnimation(class223.localPlayer, Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - return 1; - } else if (var0 == ScriptOpcodes.IF_CLOSE) { - if (!Interpreter.field1075) { - Interpreter.field1074 = true; - } - - return 1; - } else { - int var10; - if (var0 == ScriptOpcodes.RESUME_COUNTDIALOG) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var10 = 0; - if (NetSocket.isNumber(var3)) { - var10 = TilePaint.parseInt(var3); - } - - PacketBufferNode var12 = InterfaceParent.getPacketBufferNode(ClientPacket.field2238, Client.packetWriter.isaacCipher); - var12.packetBuffer.writeInt(var10); - Client.packetWriter.addNode(var12); - return 1; - } else { - PacketBufferNode var14; - if (var0 == ScriptOpcodes.RESUME_NAMEDIALOG) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2284, Client.packetWriter.isaacCipher); - var14.packetBuffer.writeByte(var3.length() + 1); - var14.packetBuffer.writeStringCp1252NullTerminated(var3); - Client.packetWriter.addNode(var14); - return 1; - } else if (var0 == ScriptOpcodes.RESUME_STRINGDIALOG) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2202, Client.packetWriter.isaacCipher); - var14.packetBuffer.writeByte(var3.length() + 1); - var14.packetBuffer.writeStringCp1252NullTerminated(var3); - Client.packetWriter.addNode(var14); - return 1; - } else { - String var7; - int var15; - if (var0 == ScriptOpcodes.OPPLAYER) { - var15 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var7 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - WorldMapLabelSize.method201(var15, var7); - return 1; - } else if (var0 == ScriptOpcodes.IF_DRAGPICKUP) { - Interpreter.Interpreter_intStackSize -= 3; - var15 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - int var9 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - Widget var13 = Canvas.getWidget(var9); - class227.clickWidget(var13, var15, var10); - return 1; - } else if (var0 == ScriptOpcodes.CC_DRAGPICKUP) { - Interpreter.Interpreter_intStackSize -= 2; - var15 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Widget var11 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - class227.clickWidget(var11, var15, var10); - return 1; - } else if (var0 == ScriptOpcodes.MOUSECAM) { - WorldMapIcon_1.mouseCam = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.GETREMOVEROOFS) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AbstractArchive.clientPreferences.roofsHidden ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.SETREMOVEROOFS) { - AbstractArchive.clientPreferences.roofsHidden = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Language.savePreferences(); - return 1; - } else if (var0 == ScriptOpcodes.OPENURL) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - boolean var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - ArchiveDiskActionHandler.openURL(var3, var4, false); - return 1; - } else if (var0 == ScriptOpcodes.RESUME_OBJDIALOG) { - var15 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var14 = InterfaceParent.getPacketBufferNode(ClientPacket.field2245, Client.packetWriter.isaacCipher); - var14.packetBuffer.writeShort(var15); - Client.packetWriter.addNode(var14); - return 1; - } else if (var0 == ScriptOpcodes.BUG_REPORT) { - var15 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_stringStackSize -= 2; - var7 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; - String var5 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - if (var7.length() > 500) { - return 1; - } else if (var5.length() > 500) { - return 1; - } else { - PacketBufferNode var6 = InterfaceParent.getPacketBufferNode(ClientPacket.field2270, Client.packetWriter.isaacCipher); - var6.packetBuffer.writeShort(1 + class268.stringCp1252NullTerminatedByteSize(var7) + class268.stringCp1252NullTerminatedByteSize(var5)); - var6.packetBuffer.writeStringCp1252NullTerminated(var7); - var6.packetBuffer.writeStringCp1252NullTerminated(var5); - var6.packetBuffer.method5468(var15); - Client.packetWriter.addNode(var6); - return 1; - } - } else if (var0 == ScriptOpcodes.SETSHIFTCLICKDROP) { - Client.shiftClickDrop = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.SETSHOWMOUSEOVERTEXT) { - Client.showMouseOverText = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.RENDERSELF) { - Client.renderSelf = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == 3120) { - if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { - Client.drawPlayerNames |= 1; - } else { - Client.drawPlayerNames &= -2; - } - - return 1; - } else if (var0 == 3121) { - if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { - Client.drawPlayerNames |= 2; - } else { - Client.drawPlayerNames &= -3; - } - - return 1; - } else if (var0 == 3122) { - if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { - Client.drawPlayerNames |= 4; - } else { - Client.drawPlayerNames &= -5; - } - - return 1; - } else if (var0 == 3123) { - if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { - Client.drawPlayerNames |= 8; - } else { - Client.drawPlayerNames &= -9; - } - - return 1; - } else if (var0 == 3124) { - Client.drawPlayerNames = 0; - return 1; - } else if (var0 == ScriptOpcodes.SETSHOWMOUSECROSS) { - Client.showMouseCross = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.SETSHOWLOADINGMESSAGES) { - Client.showLoadingMessages = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.SETTAPTODROP) { - ScriptEvent.setTapToDrop(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1); - return 1; - } else if (var0 == ScriptOpcodes.GETTAPTODROP) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapSprite.getTapToDrop() ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.SETOCULUSORBSPEED) { - Interpreter.Interpreter_intStackSize -= 2; - Client.oculusOrbNormalSpeed = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - Client.oculusOrbSlowedSpeed = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - return 1; - } else if (var0 == 3130) { - Interpreter.Interpreter_intStackSize -= 2; - return 1; - } else if (var0 == 3131) { - --Interpreter.Interpreter_intStackSize; - return 1; - } else if (var0 == ScriptOpcodes.GETCANVASSIZE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = FloorDecoration.canvasWidth; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WallDecoration.canvasHeight; - return 1; - } else if (var0 == ScriptOpcodes.MOBILE_SETFPS) { - --Interpreter.Interpreter_intStackSize; - return 1; - } else if (var0 == ScriptOpcodes.MOBILE_OPENSTORE) { - return 1; - } else if (var0 == ScriptOpcodes.MOBILE_OPENSTORECATEGORY) { - Interpreter.Interpreter_intStackSize -= 2; - return 1; - } else if (var0 == 3136) { - Client.field798 = 3; - Client.field824 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - return 1; - } else if (var0 == 3137) { - Client.field798 = 2; - Client.field824 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - return 1; - } else if (var0 == 3138) { - Client.field798 = 0; - return 1; - } else if (var0 == 3139) { - Client.field798 = 1; - return 1; - } else if (var0 == 3140) { - Client.field798 = 3; - Client.field824 = var2 ? GrandExchangeOfferAgeComparator.field76.id : KitDefinition.field3252.id; - return 1; - } else { - boolean var8; - if (var0 == ScriptOpcodes.SETHIDEUSERNAME) { - var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - AbstractArchive.clientPreferences.hideUsername = var8; - Language.savePreferences(); - return 1; - } else if (var0 == ScriptOpcodes.GETHIDEUSERNAME) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AbstractArchive.clientPreferences.hideUsername ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.SETREMEMBERUSERNAME) { - var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Client.Login_isUsernameRemembered = var8; - if (!var8) { - AbstractArchive.clientPreferences.rememberedUsername = ""; - Language.savePreferences(); - } - - return 1; - } else if (var0 == ScriptOpcodes.GETREMEMBERUSERNAME) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.Login_isUsernameRemembered ? 1 : 0; - return 1; - } else if (var0 == 3145) { - return 1; - } else if (var0 == ScriptOpcodes.SETTITLEMUSICENABLED) { - var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - if (var8 == AbstractArchive.clientPreferences.titleMusicDisabled) { - AbstractArchive.clientPreferences.titleMusicDisabled = !var8; - Language.savePreferences(); - } - - return 1; - } else if (var0 == ScriptOpcodes.GETTITLEMUSICENABLED) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AbstractArchive.clientPreferences.titleMusicDisabled ? 0 : 1; - return 1; - } else if (var0 == 3148) { - return 1; - } else if (var0 == 3149) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3150) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3151) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3152) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3153) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Login.Login_loadingPercent; - return 1; - } else if (var0 == 3154) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = GrandExchangeOfferTotalQuantityComparator.method100(); - return 1; - } else if (var0 == 3155) { - --Interpreter.Interpreter_stringStackSize; - return 1; - } else if (var0 == 3156) { - return 1; - } else if (var0 == 3157) { - Interpreter.Interpreter_intStackSize -= 2; - return 1; - } else if (var0 == 3158) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3159) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3160) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3161) { - --Interpreter.Interpreter_intStackSize; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3162) { - --Interpreter.Interpreter_intStackSize; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3163) { - --Interpreter.Interpreter_stringStackSize; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3164) { - --Interpreter.Interpreter_intStackSize; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - return 1; - } else if (var0 == 3165) { - --Interpreter.Interpreter_intStackSize; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3166) { - Interpreter.Interpreter_intStackSize -= 2; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3167) { - Interpreter.Interpreter_intStackSize -= 2; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3168) { - Interpreter.Interpreter_intStackSize -= 2; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - return 1; - } else if (var0 == 3169) { - return 1; - } else if (var0 == 3170) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3171) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3172) { - --Interpreter.Interpreter_intStackSize; - return 1; - } else if (var0 == 3173) { - --Interpreter.Interpreter_intStackSize; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else if (var0 == 3174) { - --Interpreter.Interpreter_intStackSize; - return 1; - } else if (var0 == 3175) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else { - return var0 == 3176 ? 1 : 2; - } - } - } - } - } - } } diff --git a/runescape-client/src/main/java/MidiFileReader.java b/runescape-client/src/main/java/MidiFileReader.java index f35265e284..1b7ec6752d 100644 --- a/runescape-client/src/main/java/MidiFileReader.java +++ b/runescape-client/src/main/java/MidiFileReader.java @@ -3,38 +3,38 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gc") +@ObfuscatedName("gr") @Implements("MidiFileReader") public class MidiFileReader { - @ObfuscatedName("i") - static final byte[] field2447; - @ObfuscatedName("z") + @ObfuscatedName("d") + static final byte[] field2439; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lkl;" + signature = "Lkc;" ) @Export("buffer") Buffer buffer; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("division") int division; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("trackStarts") int[] trackStarts; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("trackPositions") int[] trackPositions; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("trackLengths") int[] trackLengths; - @ObfuscatedName("p") - int[] field2453; - @ObfuscatedName("q") - int field2442; - @ObfuscatedName("y") - long field2450; + @ObfuscatedName("l") + int[] field2444; + @ObfuscatedName("c") + int field2445; + @ObfuscatedName("i") + long field2448; static { - field2447 = new byte[]{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + field2439 = new byte[]{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; } MidiFileReader(byte[] var1) { @@ -46,14 +46,14 @@ public class MidiFileReader { this.buffer = new Buffer((byte[])null); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("parse") void parse(byte[] var1) { this.buffer.array = var1; this.buffer.offset = 10; int var2 = this.buffer.readUnsignedShort(); this.division = this.buffer.readUnsignedShort(); - this.field2442 = 500000; + this.field2445 = 500000; this.trackStarts = new int[var2]; Buffer var10000; @@ -70,7 +70,7 @@ public class MidiFileReader { var10000 = this.buffer; } - this.field2450 = 0L; + this.field2448 = 0L; this.trackPositions = new int[var2]; for (var3 = 0; var3 < var2; ++var3) { @@ -78,50 +78,50 @@ public class MidiFileReader { } this.trackLengths = new int[var2]; - this.field2453 = new int[var2]; + this.field2444 = new int[var2]; } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("clear") void clear() { this.buffer.array = null; this.trackStarts = null; this.trackPositions = null; this.trackLengths = null; - this.field2453 = null; + this.field2444 = null; } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("isReady") boolean isReady() { return this.buffer.array != null; } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("trackCount") int trackCount() { return this.trackPositions.length; } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("gotoTrack") void gotoTrack(int var1) { this.buffer.offset = this.trackPositions[var1]; } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("markTrackPosition") void markTrackPosition(int var1) { this.trackPositions[var1] = this.buffer.offset; } - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("setTrackDone") void setTrackDone() { this.buffer.offset = -1; } - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("readTrackLength") void readTrackLength(int var1) { int var2 = this.buffer.readVarInt(); @@ -129,36 +129,36 @@ public class MidiFileReader { var10000[var1] += var2; } - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("readMessage") int readMessage(int var1) { int var2 = this.readMessage0(var1); return var2; } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("readMessage0") int readMessage0(int var1) { byte var2 = this.buffer.array[this.buffer.offset]; int var5; if (var2 < 0) { var5 = var2 & 255; - this.field2453[var1] = var5; + this.field2444[var1] = var5; ++this.buffer.offset; } else { - var5 = this.field2453[var1]; + var5 = this.field2444[var1]; } if (var5 != 240 && var5 != 247) { - return this.method3812(var1, var5); + return this.method3997(var1, var5); } else { int var3 = this.buffer.readVarInt(); if (var5 == 247 && var3 > 0) { int var4 = this.buffer.array[this.buffer.offset] & 255; if (var4 >= 241 && var4 <= 243 || var4 == 246 || var4 == 248 || var4 >= 250 && var4 <= 252 || var4 == 254) { ++this.buffer.offset; - this.field2453[var1] = var4; - return this.method3812(var1, var4); + this.field2444[var1] = var4; + return this.method3997(var1, var4); } } @@ -168,8 +168,8 @@ public class MidiFileReader { } } - @ObfuscatedName("c") - int method3812(int var1, int var2) { + @ObfuscatedName("m") + int method3997(int var1, int var2) { int var4; if (var2 == 255) { int var7 = this.buffer.readUnsignedByte(); @@ -183,8 +183,8 @@ public class MidiFileReader { int var5 = this.buffer.readMedium(); var4 -= 3; int var6 = this.trackLengths[var1]; - this.field2450 += (long)var6 * (long)(this.field2442 - var5); - this.field2442 = var5; + this.field2448 += (long)var6 * (long)(this.field2445 - var5); + this.field2445 = var5; var10000 = this.buffer; var10000.offset += var4; return 2; @@ -194,7 +194,7 @@ public class MidiFileReader { return 3; } } else { - byte var3 = field2447[var2 - 128]; + byte var3 = field2439[var2 - 128]; var4 = var2; if (var3 >= 1) { var4 = var2 | this.buffer.readUnsignedByte() << 8; @@ -208,12 +208,12 @@ public class MidiFileReader { } } - @ObfuscatedName("b") - long method3813(int var1) { - return this.field2450 + (long)var1 * (long)this.field2442; + @ObfuscatedName("p") + long method3987(int var1) { + return this.field2448 + (long)var1 * (long)this.field2445; } - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("getPrioritizedTrack") int getPrioritizedTrack() { int var1 = this.trackPositions.length; @@ -230,7 +230,7 @@ public class MidiFileReader { return var2; } - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("isDone") boolean isDone() { int var1 = this.trackPositions.length; @@ -244,15 +244,15 @@ public class MidiFileReader { return true; } - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("reset") void reset(long var1) { - this.field2450 = var1; + this.field2448 = var1; int var3 = this.trackPositions.length; for (int var4 = 0; var4 < var3; ++var4) { this.trackLengths[var4] = 0; - this.field2453[var4] = 0; + this.field2444[var4] = 0; this.buffer.offset = this.trackStarts[var4]; this.readTrackLength(var4); this.trackPositions[var4] = this.buffer.offset; diff --git a/runescape-client/src/main/java/MidiPcmStream.java b/runescape-client/src/main/java/MidiPcmStream.java index 8517ab3ad0..530d819c14 100644 --- a/runescape-client/src/main/java/MidiPcmStream.java +++ b/runescape-client/src/main/java/MidiPcmStream.java @@ -4,154 +4,160 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gb") +@ObfuscatedName("gg") @Implements("MidiPcmStream") public class MidiPcmStream extends PcmStream { - @ObfuscatedName("z") + @ObfuscatedName("ix") + @ObfuscatedGetter( + intValue = -1186569365 + ) + @Export("selectedItemWidget") + static int selectedItemWidget; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("musicPatches") NodeHashTable musicPatches; + @ObfuscatedName("t") + @ObfuscatedGetter( + intValue = -969808631 + ) + int field2399; @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1432283379 + intValue = 1268396736 ) - int field2393; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = 621704105 - ) - int field2394; - @ObfuscatedName("u") - int[] field2409; - @ObfuscatedName("r") - int[] field2405; - @ObfuscatedName("p") - int[] field2407; + int field2387; @ObfuscatedName("q") + int[] field2388; + @ObfuscatedName("v") int[] field2398; + @ObfuscatedName("l") + int[] field2390; + @ObfuscatedName("c") + int[] field2391; + @ObfuscatedName("o") + int[] field2413; + @ObfuscatedName("i") + int[] field2393; + @ObfuscatedName("d") + int[] field2396; @ObfuscatedName("m") int[] field2395; - @ObfuscatedName("y") - int[] field2400; - @ObfuscatedName("i") - int[] field2399; - @ObfuscatedName("c") - int[] field2402; + @ObfuscatedName("p") + int[] field2389; @ObfuscatedName("b") - int[] field2403; - @ObfuscatedName("h") - int[] field2404; - @ObfuscatedName("s") - int[] field2392; + int[] field2386; + @ObfuscatedName("z") + int[] field2394; @ObfuscatedName("f") - int[] field2418; - @ObfuscatedName("j") - int[] field2408; - @ObfuscatedName("d") - int[] field2406; - @ObfuscatedName("l") + int[] field2400; + @ObfuscatedName("g") int[] field2401; - @ObfuscatedName("k") + @ObfuscatedName("w") + int[] field2392; + @ObfuscatedName("u") + int[] field2403; + @ObfuscatedName("y") @ObfuscatedSignature( - signature = "[[Lgu;" + signature = "[[Lgq;" ) - MusicPatchNode[][] field2410; - @ObfuscatedName("ac") + MusicPatchNode[][] field2409; + @ObfuscatedName("aa") @ObfuscatedSignature( - signature = "[[Lgu;" + signature = "[[Lgq;" ) - MusicPatchNode[][] field2411; - @ObfuscatedName("az") + MusicPatchNode[][] field2385; + @ObfuscatedName("aw") @ObfuscatedSignature( - signature = "Lgc;" + signature = "Lgr;" ) @Export("midiFile") MidiFileReader midiFile; - @ObfuscatedName("aw") - boolean field2413; - @ObfuscatedName("aa") + @ObfuscatedName("ar") + boolean field2407; + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = 442651773 + intValue = -1908280461 ) @Export("track") int track; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedGetter( - intValue = -532588397 + intValue = 1604575573 ) @Export("trackLength") int trackLength; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @ObfuscatedGetter( - longValue = -7808892689914607303L + longValue = -5934484016518299703L ) - long field2416; - @ObfuscatedName("ab") + long field2410; + @ObfuscatedName("ak") @ObfuscatedGetter( - longValue = -2211095128418699139L + longValue = 6514613664969707015L ) - long field2417; - @ObfuscatedName("ax") + long field2411; + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "Lgp;" + signature = "Lgd;" ) @Export("patchStream") MusicPatchPcmStream patchStream; public MidiPcmStream() { - this.field2393 = 256; - this.field2394 = 1000000; - this.field2409 = new int[16]; - this.field2405 = new int[16]; - this.field2407 = new int[16]; + this.field2399 = 256; + this.field2387 = -727379968; + this.field2388 = new int[16]; this.field2398 = new int[16]; + this.field2390 = new int[16]; + this.field2391 = new int[16]; + this.field2413 = new int[16]; + this.field2393 = new int[16]; + this.field2396 = new int[16]; this.field2395 = new int[16]; + this.field2389 = new int[16]; + this.field2386 = new int[16]; + this.field2394 = new int[16]; this.field2400 = new int[16]; - this.field2399 = new int[16]; - this.field2402 = new int[16]; - this.field2403 = new int[16]; - this.field2404 = new int[16]; - this.field2392 = new int[16]; - this.field2418 = new int[16]; - this.field2408 = new int[16]; - this.field2406 = new int[16]; this.field2401 = new int[16]; - this.field2410 = new MusicPatchNode[16][128]; - this.field2411 = new MusicPatchNode[16][128]; + this.field2392 = new int[16]; + this.field2403 = new int[16]; + this.field2409 = new MusicPatchNode[16][128]; + this.field2385 = new MusicPatchNode[16][128]; this.midiFile = new MidiFileReader(); this.patchStream = new MusicPatchPcmStream(this); this.musicPatches = new NodeHashTable(128); - this.method3690(); + this.method3866(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-1812413582" + garbageValue = "636798046" ) - public synchronized void method3760(int var1) { - this.field2393 = var1; + public synchronized void method3942(int var1) { + this.field2399 = var1; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(B)I", + garbageValue = "13" + ) + public int method3848() { + return this.field2399; } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1892008992" - ) - public int method3745() { - return this.field2393; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Lgh;Lhp;Ldq;II)Z", - garbageValue = "-1805357835" + signature = "(Lgb;Lhq;Ldm;II)Z", + garbageValue = "220322847" ) @Export("loadMusicTrack") public synchronized boolean loadMusicTrack(MusicTrack var1, AbstractArchive var2, SoundCache var3, int var4) { - var1.method3895(); + var1.method4072(); boolean var5 = true; int[] var6 = null; if (var4 > 0) { @@ -162,16 +168,24 @@ public class MidiPcmStream extends PcmStream { int var8 = (int)var7.key; MusicPatch var9 = (MusicPatch)this.musicPatches.get((long)var8); if (var9 == null) { - var9 = WorldMapRegion.method519(var2, var8); - if (var9 == null) { + byte[] var11 = var2.takeFileFlat(var8); + MusicPatch var10; + if (var11 == null) { + var10 = null; + } else { + var10 = new MusicPatch(var11); + } + + var9 = var10; + if (var10 == null) { var5 = false; continue; } - this.musicPatches.put(var9, (long)var8); + this.musicPatches.put(var10, (long)var8); } - if (!var9.method3856(var3, var7.byteArray, var6)) { + if (!var9.method4034(var3, var7.byteArray, var6)) { var5 = false; } } @@ -183,10 +197,10 @@ public class MidiPcmStream extends PcmStream { return var5; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1194981634" + garbageValue = "893329353" ) @Export("clearAll") public synchronized void clearAll() { @@ -196,10 +210,10 @@ public class MidiPcmStream extends PcmStream { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1548831069" + garbageValue = "1692689357" ) @Export("removeAll") public synchronized void removeAll() { @@ -209,65 +223,65 @@ public class MidiPcmStream extends PcmStream { } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("firstSubStream") protected synchronized PcmStream firstSubStream() { return this.patchStream; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("nextSubStream") protected synchronized PcmStream nextSubStream() { return null; } - @ObfuscatedName("m") - protected synchronized int vmethod3882() { + @ObfuscatedName("o") + protected synchronized int vmethod4063() { return 0; } - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("fill") protected synchronized void fill(int[] var1, int var2, int var3) { if (this.midiFile.isReady()) { - int var4 = this.midiFile.division * this.field2394 * -727379968 / UrlRequest.PcmPlayer_sampleRate; + int var4 = this.midiFile.division * this.field2387 * 1000000 / (PcmPlayer.PcmPlayer_sampleRate * 22050); do { - long var5 = this.field2416 + (long)var4 * (long)var3; - if (this.field2417 - var5 >= 0L) { - this.field2416 = var5; + long var5 = this.field2410 + (long)var3 * (long)var4; + if (this.field2411 - var5 >= 0L) { + this.field2410 = var5; break; } - int var7 = (int)((this.field2417 - this.field2416 + (long)var4 - 1L) / (long)var4); - this.field2416 += (long)var7 * (long)var4; + int var7 = (int)(((long)var4 + (this.field2411 - this.field2410) - 1L) / (long)var4); + this.field2410 += (long)var4 * (long)var7; this.patchStream.fill(var1, var2, var7); var2 += var7; var3 -= var7; - this.method3740(); + this.method3945(); } while(this.midiFile.isReady()); } this.patchStream.fill(var1, var2, var3); } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(Lgh;ZI)V", - garbageValue = "1917268302" + signature = "(Lgb;ZI)V", + garbageValue = "-369065525" ) @Export("setMusicTrack") public synchronized void setMusicTrack(MusicTrack var1, boolean var2) { this.clear(); this.midiFile.parse(var1.midi); - this.field2413 = var2; - this.field2416 = 0L; + this.field2407 = var2; + this.field2410 = 0L; int var3 = this.midiFile.trackCount(); for (int var4 = 0; var4 < var3; ++var4) { @@ -278,248 +292,248 @@ public class MidiPcmStream extends PcmStream { this.track = this.midiFile.getPrioritizedTrack(); this.trackLength = this.midiFile.trackLengths[this.track]; - this.field2417 = this.midiFile.method3813(this.trackLength); + this.field2411 = this.midiFile.method3987(this.trackLength); } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("skip") protected synchronized void skip(int var1) { if (this.midiFile.isReady()) { - int var2 = this.midiFile.division * this.field2394 * -727379968 / UrlRequest.PcmPlayer_sampleRate; + int var2 = this.midiFile.division * this.field2387 * 1000000 / (PcmPlayer.PcmPlayer_sampleRate * 22050); do { - long var3 = this.field2416 + (long)var2 * (long)var1; - if (this.field2417 - var3 >= 0L) { - this.field2416 = var3; + long var3 = (long)var2 * (long)var1 + this.field2410; + if (this.field2411 - var3 >= 0L) { + this.field2410 = var3; break; } - int var5 = (int)((this.field2417 - this.field2416 + (long)var2 - 1L) / (long)var2); - this.field2416 += (long)var5 * (long)var2; + int var5 = (int)(((long)var2 + (this.field2411 - this.field2410) - 1L) / (long)var2); + this.field2410 += (long)var5 * (long)var2; this.patchStream.skip(var5); var1 -= var5; - this.method3740(); + this.method3945(); } while(this.midiFile.isReady()); } this.patchStream.skip(var1); } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-36" + garbageValue = "54" ) @Export("clear") public synchronized void clear() { this.midiFile.clear(); - this.method3690(); + this.method3866(); } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-842698736" + garbageValue = "-1270364746" ) @Export("isReady") public synchronized boolean isReady() { return this.midiFile.isReady(); } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "-50" + signature = "(III)V", + garbageValue = "1705668679" ) - public synchronized void method3746(int var1, int var2) { - this.method3747(var1, var2); - } - - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "14" - ) - void method3747(int var1, int var2) { - this.field2398[var1] = var2; - this.field2400[var1] = var2 & -128; - this.method3680(var1, var2); + public synchronized void method3899(int var1, int var2) { + this.method3856(var1, var2); } @ObfuscatedName("x") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "1745754026" + garbageValue = "1521021753" ) - void method3680(int var1, int var2) { - if (var2 != this.field2395[var1]) { - this.field2395[var1] = var2; + void method3856(int var1, int var2) { + this.field2391[var1] = var2; + this.field2393[var1] = var2 & -128; + this.method3968(var1, var2); + } + + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "1482867334" + ) + void method3968(int var1, int var2) { + if (var2 != this.field2413[var1]) { + this.field2413[var1] = var2; for (int var3 = 0; var3 < 128; ++var3) { - this.field2411[var1][var3] = null; + this.field2385[var1][var3] = null; } } } - @ObfuscatedName("h") + @ObfuscatedName("r") @ObfuscatedSignature( signature = "(IIII)V", - garbageValue = "828963250" + garbageValue = "-1390676014" ) - void method3738(int var1, int var2, int var3) { - this.method3683(var1, var2, 64); - if ((this.field2404[var1] & 2) != 0) { + void method3858(int var1, int var2, int var3) { + this.method3860(var1, var2, 64); + if ((this.field2386[var1] & 2) != 0) { for (MusicPatchNode var4 = (MusicPatchNode)this.patchStream.queue.first(); var4 != null; var4 = (MusicPatchNode)this.patchStream.queue.next()) { - if (var4.field2420 == var1 && var4.field2433 < 0) { - this.field2410[var1][var4.field2424] = null; - this.field2410[var1][var2] = var4; - int var5 = (var4.field2429 * var4.field2441 >> 12) + var4.field2427; - var4.field2427 += var2 - var4.field2424 << 8; - var4.field2441 = var5 - var4.field2427; - var4.field2429 = 4096; - var4.field2424 = var2; + if (var4.field2425 == var1 && var4.field2428 < 0) { + this.field2409[var1][var4.field2419] = null; + this.field2409[var1][var2] = var4; + int var5 = (var4.field2424 * var4.field2423 >> 12) + var4.field2416; + var4.field2416 += var2 - var4.field2419 << 8; + var4.field2423 = var5 - var4.field2416; + var4.field2424 = 4096; + var4.field2419 = var2; return; } } } - MusicPatch var9 = (MusicPatch)this.musicPatches.get((long)this.field2395[var1]); + MusicPatch var9 = (MusicPatch)this.musicPatches.get((long)this.field2413[var1]); if (var9 != null) { RawSound var8 = var9.rawSounds[var2]; if (var8 != null) { MusicPatchNode var6 = new MusicPatchNode(); - var6.field2420 = var1; + var6.field2425 = var1; var6.patch = var9; var6.rawSound = var8; - var6.field2435 = var9.field2462[var2]; - var6.field2423 = var9.field2460[var2]; - var6.field2424 = var2; - var6.field2425 = var3 * var3 * var9.field2459[var2] * var9.field2458 + 1024 >> 11; - var6.field2426 = var9.field2456[var2] & 255; - var6.field2427 = (var2 << 8) - (var9.field2457[var2] & 32767); - var6.field2428 = 0; + var6.field2417 = var9.field2458[var2]; + var6.field2422 = var9.field2459[var2]; + var6.field2419 = var2; + var6.field2430 = var3 * var3 * var9.field2453[var2] * var9.field2454 + 1024 >> 11; + var6.field2421 = var9.field2457[var2] & 255; + var6.field2416 = (var2 << 8) - (var9.field2460[var2] & 32767); + var6.field2420 = 0; var6.field2431 = 0; - var6.field2432 = 0; - var6.field2433 = -1; - var6.field2434 = 0; - if (this.field2408[var1] == 0) { - var6.stream = RawPcmStream.method2548(var8, this.method3695(var6), this.method3696(var6), this.method3751(var6)); + var6.field2427 = 0; + var6.field2428 = -1; + var6.field2429 = 0; + if (this.field2401[var1] == 0) { + var6.stream = RawPcmStream.method2767(var8, this.method3934(var6), this.method3875(var6), this.method3873(var6)); } else { - var6.stream = RawPcmStream.method2548(var8, this.method3695(var6), 0, this.method3751(var6)); - this.method3682(var6, var9.field2457[var2] < 0); + var6.stream = RawPcmStream.method2767(var8, this.method3934(var6), 0, this.method3873(var6)); + this.method3885(var6, var9.field2460[var2] < 0); } - if (var9.field2457[var2] < 0) { + if (var9.field2460[var2] < 0) { var6.stream.setNumLoops(-1); } - if (var6.field2423 >= 0) { - MusicPatchNode var7 = this.field2411[var1][var6.field2423]; - if (var7 != null && var7.field2433 < 0) { - this.field2410[var1][var7.field2424] = null; - var7.field2433 = 0; + if (var6.field2422 >= 0) { + MusicPatchNode var7 = this.field2385[var1][var6.field2422]; + if (var7 != null && var7.field2428 < 0) { + this.field2409[var1][var7.field2419] = null; + var7.field2428 = 0; } - this.field2411[var1][var6.field2423] = var6; + this.field2385[var1][var6.field2422] = var6; } this.patchStream.queue.addFirst(var6); - this.field2410[var1][var2] = var6; + this.field2409[var1][var2] = var6; } } } + @ObfuscatedName("e") + @ObfuscatedSignature( + signature = "(Lgq;ZI)V", + garbageValue = "-1702436335" + ) + void method3885(MusicPatchNode var1, boolean var2) { + int var3 = var1.rawSound.samples.length; + int var4; + if (var2 && var1.rawSound.field1363) { + int var5 = var3 + var3 - var1.rawSound.start; + var4 = (int)((long)var5 * (long)this.field2401[var1.field2425] >> 6); + var3 <<= 8; + if (var4 >= var3) { + var4 = var3 + var3 - 1 - var4; + var1.stream.method2708(); + } + } else { + var4 = (int)((long)this.field2401[var1.field2425] * (long)var3 >> 6); + } + + var1.stream.method2707(var4); + } + @ObfuscatedName("s") - @ObfuscatedSignature( - signature = "(Lgu;ZB)V", - garbageValue = "-87" - ) - void method3682(MusicPatchNode var1, boolean var2) { - int var3 = var1.rawSound.samples.length; - int var4; - if (var2 && var1.rawSound.field1369) { - int var5 = var3 + var3 - var1.rawSound.start; - var4 = (int)((long)this.field2408[var1.field2420] * (long)var5 >> 6); - var3 <<= 8; - if (var4 >= var3) { - var4 = var3 + var3 - 1 - var4; - var1.stream.method2525(); - } - } else { - var4 = (int)((long)var3 * (long)this.field2408[var1.field2420] >> 6); - } - - var1.stream.method2581(var4); - } - - @ObfuscatedName("f") @ObfuscatedSignature( signature = "(IIII)V", - garbageValue = "97221829" + garbageValue = "-493444967" ) - void method3683(int var1, int var2, int var3) { - MusicPatchNode var4 = this.field2410[var1][var2]; + void method3860(int var1, int var2, int var3) { + MusicPatchNode var4 = this.field2409[var1][var2]; if (var4 != null) { - this.field2410[var1][var2] = null; - if ((this.field2404[var1] & 2) != 0) { + this.field2409[var1][var2] = null; + if ((this.field2386[var1] & 2) != 0) { for (MusicPatchNode var5 = (MusicPatchNode)this.patchStream.queue.last(); var5 != null; var5 = (MusicPatchNode)this.patchStream.queue.previous()) { - if (var4.field2420 == var5.field2420 && var5.field2433 < 0 && var4 != var5) { - var4.field2433 = 0; + if (var4.field2425 == var5.field2425 && var5.field2428 < 0 && var4 != var5) { + var4.field2428 = 0; break; } } } else { - var4.field2433 = 0; + var4.field2428 = 0; } } } - @ObfuscatedName("j") + @ObfuscatedName("b") @ObfuscatedSignature( signature = "(IIII)V", - garbageValue = "-1518043222" + garbageValue = "1280416212" ) - void method3684(int var1, int var2, int var3) { + void method3943(int var1, int var2, int var3) { } - @ObfuscatedName("d") + @ObfuscatedName("w") + @ObfuscatedSignature( + signature = "(IIB)V", + garbageValue = "-122" + ) + void method3862(int var1, int var2) { + } + + @ObfuscatedName("u") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "-752934894" + garbageValue = "1364823347" ) - void method3788(int var1, int var2) { + void method3949(int var1, int var2) { + this.field2396[var1] = var2; } - @ObfuscatedName("l") - @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "896514567" - ) - void method3686(int var1, int var2) { - this.field2399[var1] = var2; - } - - @ObfuscatedName("k") + @ObfuscatedName("ad") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1124863656" + garbageValue = "948298750" ) - void method3687(int var1) { + void method3864(int var1) { for (MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { - if (var1 < 0 || var2.field2420 == var1) { + if (var1 < 0 || var2.field2425 == var1) { if (var2.stream != null) { - var2.stream.method2529(UrlRequest.PcmPlayer_sampleRate / 100); - if (var2.stream.method2533()) { + var2.stream.method2722(PcmPlayer.PcmPlayer_sampleRate * 22050 / 100); + if (var2.stream.method2716()) { this.patchStream.mixer.addSubStream(var2.stream); } - var2.method3794(); + var2.method3974(); } - if (var2.field2433 < 0) { - this.field2410[var2.field2420][var2.field2424] = null; + if (var2.field2428 < 0) { + this.field2409[var2.field2425][var2.field2419] = null; } var2.remove(); @@ -528,107 +542,107 @@ public class MidiPcmStream extends PcmStream { } - @ObfuscatedName("ai") + @ObfuscatedName("ah") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "-61" + signature = "(II)V", + garbageValue = "996018902" ) - void method3688(int var1) { + void method3865(int var1) { if (var1 >= 0) { - this.field2409[var1] = 12800; - this.field2405[var1] = 8192; - this.field2407[var1] = 16383; - this.field2399[var1] = 8192; - this.field2402[var1] = 0; - this.field2403[var1] = 8192; - this.method3691(var1); - this.method3692(var1); - this.field2404[var1] = 0; - this.field2392[var1] = 32767; - this.field2418[var1] = 256; - this.field2408[var1] = 0; - this.method3744(var1, 8192); + this.field2388[var1] = 12800; + this.field2398[var1] = 8192; + this.field2390[var1] = 16383; + this.field2396[var1] = 8192; + this.field2395[var1] = 0; + this.field2389[var1] = 8192; + this.method3898(var1); + this.method3868(var1); + this.field2386[var1] = 0; + this.field2394[var1] = 32767; + this.field2400[var1] = 256; + this.field2401[var1] = 0; + this.method3870(var1, 8192); } else { for (var1 = 0; var1 < 16; ++var1) { - this.method3688(var1); + this.method3865(var1); } } } - @ObfuscatedName("ak") + @ObfuscatedName("an") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "-91" + signature = "(II)V", + garbageValue = "-1405411261" ) - void method3785(int var1) { + void method3908(int var1) { for (MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { - if ((var1 < 0 || var2.field2420 == var1) && var2.field2433 < 0) { - this.field2410[var2.field2420][var2.field2424] = null; - var2.field2433 = 0; + if ((var1 < 0 || var2.field2425 == var1) && var2.field2428 < 0) { + this.field2409[var2.field2425][var2.field2419] = null; + var2.field2428 = 0; } } } - @ObfuscatedName("ae") + @ObfuscatedName("af") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "997152444" + garbageValue = "1685703107" ) - void method3690() { - this.method3687(-1); - this.method3688(-1); + void method3866() { + this.method3864(-1); + this.method3865(-1); int var1; for (var1 = 0; var1 < 16; ++var1) { - this.field2395[var1] = this.field2398[var1]; + this.field2413[var1] = this.field2391[var1]; } for (var1 = 0; var1 < 16; ++var1) { - this.field2400[var1] = this.field2398[var1] & -128; + this.field2393[var1] = this.field2391[var1] & -128; } } - @ObfuscatedName("av") + @ObfuscatedName("ai") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "91" + signature = "(II)V", + garbageValue = "-2123052342" ) - void method3691(int var1) { - if ((this.field2404[var1] & 2) != 0) { + void method3898(int var1) { + if ((this.field2386[var1] & 2) != 0) { for (MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { - if (var2.field2420 == var1 && this.field2410[var1][var2.field2424] == null && var2.field2433 < 0) { - var2.field2433 = 0; + if (var2.field2425 == var1 && this.field2409[var1][var2.field2419] == null && var2.field2428 < 0) { + var2.field2428 = 0; } } } } - @ObfuscatedName("ag") + @ObfuscatedName("ac") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-1884831875" + garbageValue = "1415970764" ) - void method3692(int var1) { - if ((this.field2404[var1] & 4) != 0) { + void method3868(int var1) { + if ((this.field2386[var1] & 4) != 0) { for (MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { - if (var2.field2420 == var1) { - var2.field2419 = 0; + if (var2.field2425 == var1) { + var2.field2434 = 0; } } } } - @ObfuscatedName("aj") + @ObfuscatedName("at") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-1837545367" + garbageValue = "-1364540347" ) - void method3768(int var1) { + void method3869(int var1) { int var2 = var1 & 240; int var3; int var4; @@ -637,289 +651,289 @@ public class MidiPcmStream extends PcmStream { var3 = var1 & 15; var4 = var1 >> 8 & 127; var5 = var1 >> 16 & 127; - this.method3683(var3, var4, var5); + this.method3860(var3, var4, var5); } else if (var2 == 144) { var3 = var1 & 15; var4 = var1 >> 8 & 127; var5 = var1 >> 16 & 127; if (var5 > 0) { - this.method3738(var3, var4, var5); + this.method3858(var3, var4, var5); } else { - this.method3683(var3, var4, 64); + this.method3860(var3, var4, 64); } } else if (var2 == 160) { var3 = var1 & 15; var4 = var1 >> 8 & 127; var5 = var1 >> 16 & 127; - this.method3684(var3, var4, var5); + this.method3943(var3, var4, var5); } else if (var2 == 176) { var3 = var1 & 15; var4 = var1 >> 8 & 127; var5 = var1 >> 16 & 127; if (var4 == 0) { - this.field2400[var3] = (var5 << 14) + (this.field2400[var3] & -2080769); + this.field2393[var3] = (var5 << 14) + (this.field2393[var3] & -2080769); } if (var4 == 32) { - this.field2400[var3] = (var5 << 7) + (this.field2400[var3] & -16257); + this.field2393[var3] = (var5 << 7) + (this.field2393[var3] & -16257); } if (var4 == 1) { - this.field2402[var3] = (var5 << 7) + (this.field2402[var3] & -16257); + this.field2395[var3] = (var5 << 7) + (this.field2395[var3] & -16257); } if (var4 == 33) { - this.field2402[var3] = var5 + (this.field2402[var3] & -128); + this.field2395[var3] = var5 + (this.field2395[var3] & -128); } if (var4 == 5) { - this.field2403[var3] = (var5 << 7) + (this.field2403[var3] & -16257); + this.field2389[var3] = (var5 << 7) + (this.field2389[var3] & -16257); } if (var4 == 37) { - this.field2403[var3] = var5 + (this.field2403[var3] & -128); + this.field2389[var3] = var5 + (this.field2389[var3] & -128); } if (var4 == 7) { - this.field2409[var3] = (var5 << 7) + (this.field2409[var3] & -16257); + this.field2388[var3] = (var5 << 7) + (this.field2388[var3] & -16257); } if (var4 == 39) { - this.field2409[var3] = var5 + (this.field2409[var3] & -128); + this.field2388[var3] = var5 + (this.field2388[var3] & -128); } if (var4 == 10) { - this.field2405[var3] = (var5 << 7) + (this.field2405[var3] & -16257); + this.field2398[var3] = (var5 << 7) + (this.field2398[var3] & -16257); } if (var4 == 42) { - this.field2405[var3] = var5 + (this.field2405[var3] & -128); + this.field2398[var3] = var5 + (this.field2398[var3] & -128); } if (var4 == 11) { - this.field2407[var3] = (var5 << 7) + (this.field2407[var3] & -16257); + this.field2390[var3] = (var5 << 7) + (this.field2390[var3] & -16257); } if (var4 == 43) { - this.field2407[var3] = var5 + (this.field2407[var3] & -128); + this.field2390[var3] = var5 + (this.field2390[var3] & -128); } int[] var10000; if (var4 == 64) { if (var5 >= 64) { - var10000 = this.field2404; + var10000 = this.field2386; var10000[var3] |= 1; } else { - var10000 = this.field2404; + var10000 = this.field2386; var10000[var3] &= -2; } } if (var4 == 65) { if (var5 >= 64) { - var10000 = this.field2404; + var10000 = this.field2386; var10000[var3] |= 2; } else { - this.method3691(var3); - var10000 = this.field2404; + this.method3898(var3); + var10000 = this.field2386; var10000[var3] &= -3; } } if (var4 == 99) { - this.field2392[var3] = (var5 << 7) + (this.field2392[var3] & 127); + this.field2394[var3] = (var5 << 7) + (this.field2394[var3] & 127); } if (var4 == 98) { - this.field2392[var3] = (this.field2392[var3] & 16256) + var5; + this.field2394[var3] = (this.field2394[var3] & 16256) + var5; } if (var4 == 101) { - this.field2392[var3] = (var5 << 7) + (this.field2392[var3] & 127) + 16384; + this.field2394[var3] = (var5 << 7) + (this.field2394[var3] & 127) + 16384; } if (var4 == 100) { - this.field2392[var3] = (this.field2392[var3] & 16256) + var5 + 16384; + this.field2394[var3] = (this.field2394[var3] & 16256) + var5 + 16384; } if (var4 == 120) { - this.method3687(var3); + this.method3864(var3); } if (var4 == 121) { - this.method3688(var3); + this.method3865(var3); } if (var4 == 123) { - this.method3785(var3); + this.method3908(var3); } int var6; if (var4 == 6) { - var6 = this.field2392[var3]; + var6 = this.field2394[var3]; if (var6 == 16384) { - this.field2418[var3] = (var5 << 7) + (this.field2418[var3] & -16257); + this.field2400[var3] = (var5 << 7) + (this.field2400[var3] & -16257); } } if (var4 == 38) { - var6 = this.field2392[var3]; + var6 = this.field2394[var3]; if (var6 == 16384) { - this.field2418[var3] = var5 + (this.field2418[var3] & -128); + this.field2400[var3] = var5 + (this.field2400[var3] & -128); } } if (var4 == 16) { - this.field2408[var3] = (var5 << 7) + (this.field2408[var3] & -16257); + this.field2401[var3] = (var5 << 7) + (this.field2401[var3] & -16257); } if (var4 == 48) { - this.field2408[var3] = var5 + (this.field2408[var3] & -128); + this.field2401[var3] = var5 + (this.field2401[var3] & -128); } if (var4 == 81) { if (var5 >= 64) { - var10000 = this.field2404; + var10000 = this.field2386; var10000[var3] |= 4; } else { - this.method3692(var3); - var10000 = this.field2404; + this.method3868(var3); + var10000 = this.field2386; var10000[var3] &= -5; } } if (var4 == 17) { - this.method3744(var3, (var5 << 7) + (this.field2406[var3] & -16257)); + this.method3870(var3, (var5 << 7) + (this.field2392[var3] & -16257)); } if (var4 == 49) { - this.method3744(var3, var5 + (this.field2406[var3] & -128)); + this.method3870(var3, var5 + (this.field2392[var3] & -128)); } } else if (var2 == 192) { var3 = var1 & 15; var4 = var1 >> 8 & 127; - this.method3680(var3, var4 + this.field2400[var3]); + this.method3968(var3, var4 + this.field2393[var3]); } else if (var2 == 208) { var3 = var1 & 15; var4 = var1 >> 8 & 127; - this.method3788(var3, var4); + this.method3862(var3, var4); } else if (var2 == 224) { var3 = var1 & 15; var4 = (var1 >> 8 & 127) + (var1 >> 9 & 16256); - this.method3686(var3, var4); + this.method3949(var3, var4); } else { var2 = var1 & 255; if (var2 == 255) { - this.method3690(); + this.method3866(); } } } - @ObfuscatedName("ay") + @ObfuscatedName("ba") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "-1166869867" + garbageValue = "-1849310694" ) - void method3744(int var1, int var2) { - this.field2406[var1] = var2; - this.field2401[var1] = (int)(2097152.0D * Math.pow(2.0D, 5.4931640625E-4D * (double)var2) + 0.5D); + void method3870(int var1, int var2) { + this.field2392[var1] = var2; + this.field2403[var1] = (int)(2097152.0D * Math.pow(2.0D, 5.4931640625E-4D * (double)var2) + 0.5D); } - @ObfuscatedName("au") + @ObfuscatedName("bg") @ObfuscatedSignature( - signature = "(Lgu;I)I", - garbageValue = "-1249853166" + signature = "(Lgq;I)I", + garbageValue = "-1843561" ) - int method3695(MusicPatchNode var1) { - int var2 = (var1.field2441 * var1.field2429 >> 12) + var1.field2427; - var2 += (this.field2399[var1.field2420] - 8192) * this.field2418[var1.field2420] >> 12; - MusicPatchNode2 var3 = var1.field2435; + int method3934(MusicPatchNode var1) { + int var2 = (var1.field2423 * var1.field2424 >> 12) + var1.field2416; + var2 += (this.field2396[var1.field2425] - 8192) * this.field2400[var1.field2425] >> 12; + MusicPatchNode2 var3 = var1.field2417; int var4; - if (var3.field2380 > 0 && (var3.field2379 > 0 || this.field2402[var1.field2420] > 0)) { - var4 = var3.field2379 << 2; - int var5 = var3.field2381 << 1; - if (var1.field2439 < var5) { - var4 = var4 * var1.field2439 / var5; + if (var3.field2367 > 0 && (var3.field2360 > 0 || this.field2395[var1.field2425] > 0)) { + var4 = var3.field2360 << 2; + int var5 = var3.field2368 << 1; + if (var1.field2426 < var5) { + var4 = var4 * var1.field2426 / var5; } - var4 += this.field2402[var1.field2420] >> 7; - double var6 = Math.sin((double)(var1.field2436 & 511) * 0.01227184630308513D); + var4 += this.field2395[var1.field2425] >> 7; + double var6 = Math.sin(0.01227184630308513D * (double)(var1.field2414 & 511)); var2 += (int)((double)var4 * var6); } - var4 = (int)((double)(var1.rawSound.sampleRate * 256) * Math.pow(2.0D, 3.255208333333333E-4D * (double)var2) / (double)UrlRequest.PcmPlayer_sampleRate + 0.5D); + var4 = (int)((double)(var1.rawSound.sampleRate * 256) * Math.pow(2.0D, (double)var2 * 3.255208333333333E-4D) / (double)(PcmPlayer.PcmPlayer_sampleRate * 22050) + 0.5D); return var4 < 1 ? 1 : var4; } - @ObfuscatedName("af") + @ObfuscatedName("bc") @ObfuscatedSignature( - signature = "(Lgu;I)I", - garbageValue = "8582462" + signature = "(Lgq;B)I", + garbageValue = "-86" ) - int method3696(MusicPatchNode var1) { - MusicPatchNode2 var2 = var1.field2435; - int var3 = this.field2409[var1.field2420] * this.field2407[var1.field2420] + 4096 >> 13; + int method3875(MusicPatchNode var1) { + MusicPatchNode2 var2 = var1.field2417; + int var3 = this.field2390[var1.field2425] * this.field2388[var1.field2425] + 4096 >> 13; var3 = var3 * var3 + 16384 >> 15; - var3 = var3 * var1.field2425 + 16384 >> 15; - var3 = var3 * this.field2393 + 128 >> 8; - if (var2.field2375 > 0) { - var3 = (int)((double)var3 * Math.pow(0.5D, (double)var1.field2428 * 1.953125E-5D * (double)var2.field2375) + 0.5D); + var3 = var3 * var1.field2430 + 16384 >> 15; + var3 = var3 * this.field2399 + 128 >> 8; + if (var2.field2371 > 0) { + var3 = (int)((double)var3 * Math.pow(0.5D, (double)var2.field2371 * (double)var1.field2420 * 1.953125E-5D) + 0.5D); } int var4; int var5; int var6; int var7; - if (var2.field2376 != null) { + if (var2.field2364 != null) { var4 = var1.field2431; - var5 = var2.field2376[var1.field2432 * 2 + 1]; - if (var1.field2432 * 2 < var2.field2376.length - 2) { - var6 = (var2.field2376[var1.field2432 * 2] & 255) << 8; - var7 = (var2.field2376[var1.field2432 * 2 + 2] & 255) << 8; - var5 += (var2.field2376[var1.field2432 * 2 + 3] - var5) * (var4 - var6) / (var7 - var6); - } - - var3 = var5 * var3 + 32 >> 6; - } - - if (var1.field2433 > 0 && var2.field2374 != null) { - var4 = var1.field2433; - var5 = var2.field2374[var1.field2434 * 4 + 1]; - if (var1.field2434 * 4 < var2.field2374.length - 2) { - var6 = (var2.field2374[var1.field2434 * 4] & 255) << 8; - var7 = (var2.field2374[var1.field2434 * 4 + 2] & 255) << 8; - var5 += (var2.field2374[var1.field2434 * 4 + 3] - var5) * (var4 - var6) / (var7 - var6); + var5 = var2.field2364[var1.field2427 * 4 + 1]; + if (var1.field2427 * 4 < var2.field2364.length - 2) { + var6 = (var2.field2364[var1.field2427 * 4] & 255) << 8; + var7 = (var2.field2364[var1.field2427 * 4 + 2] & 255) << 8; + var5 += (var2.field2364[var1.field2427 * 4 + 3] - var5) * (var4 - var6) / (var7 - var6); } var3 = var3 * var5 + 32 >> 6; } + if (var1.field2428 > 0 && var2.field2361 != null) { + var4 = var1.field2428; + var5 = var2.field2361[var1.field2429 * 4 + 1]; + if (var1.field2429 * 4 < var2.field2361.length - 2) { + var6 = (var2.field2361[var1.field2429 * 4] & 255) << 8; + var7 = (var2.field2361[var1.field2429 * 4 + 2] & 255) << 8; + var5 += (var2.field2361[var1.field2429 * 4 + 3] - var5) * (var4 - var6) / (var7 - var6); + } + + var3 = var5 * var3 + 32 >> 6; + } + return var3; } - @ObfuscatedName("at") + @ObfuscatedName("bd") @ObfuscatedSignature( - signature = "(Lgu;I)I", - garbageValue = "19850751" + signature = "(Lgq;B)I", + garbageValue = "22" ) - int method3751(MusicPatchNode var1) { - int var2 = this.field2405[var1.field2420]; - return var2 < 8192 ? var2 * var1.field2426 + 32 >> 6 : 16384 - ((128 - var1.field2426) * (16384 - var2) + 32 >> 6); + int method3873(MusicPatchNode var1) { + int var2 = this.field2398[var1.field2425]; + return var2 < 8192 ? var2 * var1.field2421 + 32 >> 6 : 16384 - ((128 - var1.field2421) * (16384 - var2) + 32 >> 6); } @ObfuscatedName("bx") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1542890504" + garbageValue = "-1715674660" ) - void method3740() { + void method3945() { int var1 = this.track; int var2 = this.trackLength; long var3; - for (var3 = this.field2417; var2 == this.trackLength; var3 = this.midiFile.method3813(var2)) { + for (var3 = this.field2411; var2 == this.trackLength; var3 = this.midiFile.method3987(var2)) { while (var2 == this.midiFile.trackLengths[var1]) { this.midiFile.gotoTrack(var1); int var5 = this.midiFile.readMessage(var1); @@ -927,8 +941,8 @@ public class MidiPcmStream extends PcmStream { this.midiFile.setTrackDone(); this.midiFile.markTrackPosition(var1); if (this.midiFile.isDone()) { - if (!this.field2413 || var2 == 0) { - this.method3690(); + if (!this.field2407 || var2 == 0) { + this.method3866(); this.midiFile.clear(); return; } @@ -939,7 +953,7 @@ public class MidiPcmStream extends PcmStream { } if ((var5 & 128) != 0) { - this.method3768(var5); + this.method3869(var5); } this.midiFile.readTrackLength(var1); @@ -952,20 +966,20 @@ public class MidiPcmStream extends PcmStream { this.track = var1; this.trackLength = var2; - this.field2417 = var3; + this.field2411 = var3; } - @ObfuscatedName("bh") + @ObfuscatedName("bl") @ObfuscatedSignature( - signature = "(Lgu;I)Z", - garbageValue = "1629954628" + signature = "(Lgq;I)Z", + garbageValue = "-1707560993" ) - boolean method3704(MusicPatchNode var1) { + boolean method3880(MusicPatchNode var1) { if (var1.stream == null) { - if (var1.field2433 >= 0) { + if (var1.field2428 >= 0) { var1.remove(); - if (var1.field2423 > 0 && var1 == this.field2411[var1.field2420][var1.field2423]) { - this.field2411[var1.field2420][var1.field2423] = null; + if (var1.field2422 > 0 && var1 == this.field2385[var1.field2425][var1.field2422]) { + this.field2385[var1.field2425][var1.field2422] = null; } } @@ -975,103 +989,164 @@ public class MidiPcmStream extends PcmStream { } } - @ObfuscatedName("bd") + @ObfuscatedName("bh") @ObfuscatedSignature( - signature = "(Lgu;[IIII)Z", - garbageValue = "-1178188591" + signature = "(Lgq;[IIII)Z", + garbageValue = "-1765185106" ) - boolean method3705(MusicPatchNode var1, int[] var2, int var3, int var4) { - var1.field2438 = UrlRequest.PcmPlayer_sampleRate / 100; - if (var1.field2433 < 0 || var1.stream != null && !var1.stream.method2532()) { - int var5 = var1.field2429; + boolean method3881(MusicPatchNode var1, int[] var2, int var3, int var4) { + var1.field2433 = PcmPlayer.PcmPlayer_sampleRate * 22050 / 100; + if (var1.field2428 < 0 || var1.stream != null && !var1.stream.method2789()) { + int var5 = var1.field2424; if (var5 > 0) { - var5 -= (int)(16.0D * Math.pow(2.0D, 4.921259842519685E-4D * (double)this.field2403[var1.field2420]) + 0.5D); + var5 -= (int)(16.0D * Math.pow(2.0D, (double)this.field2389[var1.field2425] * 4.921259842519685E-4D) + 0.5D); if (var5 < 0) { var5 = 0; } - var1.field2429 = var5; + var1.field2424 = var5; } - var1.stream.method2530(this.method3695(var1)); - MusicPatchNode2 var6 = var1.field2435; + var1.stream.method2743(this.method3934(var1)); + MusicPatchNode2 var6 = var1.field2417; boolean var7 = false; - ++var1.field2439; - var1.field2436 += var6.field2380; - double var8 = 5.086263020833333E-6D * (double)((var1.field2424 - 60 << 8) + (var1.field2441 * var1.field2429 >> 12)); - if (var6.field2375 > 0) { - if (var6.field2378 > 0) { - var1.field2428 += (int)(128.0D * Math.pow(2.0D, (double)var6.field2378 * var8) + 0.5D); + ++var1.field2426; + var1.field2414 += var6.field2367; + double var8 = 5.086263020833333E-6D * (double)((var1.field2419 - 60 << 8) + (var1.field2423 * var1.field2424 >> 12)); + if (var6.field2371 > 0) { + if (var6.field2365 > 0) { + var1.field2420 = var1.field2420 * -308789248 + (int)(128.0D * Math.pow(2.0D, var8 * (double)var6.field2365) + 0.5D) * -308789248; } else { - var1.field2428 += 128; + var1.field2420 = var1.field2420 * -308789248 + -870318080; } } - if (var6.field2376 != null) { - if (var6.field2373 > 0) { - var1.field2431 += (int)(128.0D * Math.pow(2.0D, (double)var6.field2373 * var8) + 0.5D); + if (var6.field2364 != null) { + if (var6.field2366 > 0) { + var1.field2431 += (int)(128.0D * Math.pow(2.0D, (double)var6.field2366 * var8) + 0.5D); } else { var1.field2431 += 128; } - while (var1.field2432 * 2 < var6.field2376.length - 2 && var1.field2431 > (var6.field2376[var1.field2432 * 2 + 2] & 255) << 8) { - var1.field2432 = var1.field2432 * 4 + 4; + while (var1.field2427 * 4 < var6.field2364.length - 2 && var1.field2431 > (var6.field2364[var1.field2427 * 4 + 2] & 255) << 8) { + var1.field2427 = var1.field2427 * 4 + 2; } - if (var1.field2432 * 2 == var6.field2376.length - 2 && var6.field2376[var1.field2432 * 2 + 1] == 0) { + if (var1.field2427 * 4 == var6.field2364.length - 2 && var6.field2364[var1.field2427 * 4 + 1] == 0) { var7 = true; } } - if (var1.field2433 >= 0 && var6.field2374 != null && (this.field2404[var1.field2420] & 1) == 0 && (var1.field2423 < 0 || var1 != this.field2411[var1.field2420][var1.field2423])) { - if (var6.field2377 > 0) { - var1.field2433 += (int)(128.0D * Math.pow(2.0D, (double)var6.field2377 * var8) + 0.5D); + if (var1.field2428 >= 0 && var6.field2361 != null && (this.field2386[var1.field2425] & 1) == 0 && (var1.field2422 < 0 || var1 != this.field2385[var1.field2425][var1.field2422])) { + if (var6.field2363 > 0) { + var1.field2428 += (int)(128.0D * Math.pow(2.0D, (double)var6.field2363 * var8) + 0.5D); } else { - var1.field2433 += 128; + var1.field2428 += 128; } - while (var1.field2434 * 4 < var6.field2374.length - 2 && var1.field2433 > (var6.field2374[var1.field2434 * 4 + 2] & 255) << 8) { - var1.field2434 = var1.field2434 * 4 + 2; + while (var1.field2429 * 4 < var6.field2361.length - 2 && var1.field2428 > (var6.field2361[var1.field2429 * 4 + 2] & 255) << 8) { + var1.field2429 = var1.field2429 * 4 + 2; } - if (var1.field2434 * 4 == var6.field2374.length - 2) { + if (var1.field2429 * 4 == var6.field2361.length - 2) { var7 = true; } } if (var7) { - var1.stream.method2529(var1.field2438); + var1.stream.method2722(var1.field2433); if (var2 != null) { var1.stream.fill(var2, var3, var4); } else { var1.stream.skip(var4); } - if (var1.stream.method2533()) { + if (var1.stream.method2716()) { this.patchStream.mixer.addSubStream(var1.stream); } - var1.method3794(); - if (var1.field2433 >= 0) { + var1.method3974(); + if (var1.field2428 >= 0) { var1.remove(); - if (var1.field2423 > 0 && var1 == this.field2411[var1.field2420][var1.field2423]) { - this.field2411[var1.field2420][var1.field2423] = null; + if (var1.field2422 > 0 && var1 == this.field2385[var1.field2425][var1.field2422]) { + this.field2385[var1.field2425][var1.field2422] = null; } } return true; } else { - var1.stream.method2528(var1.field2438, this.method3696(var1), this.method3751(var1)); + var1.stream.method2711(var1.field2433, this.method3875(var1), this.method3873(var1)); return false; } } else { - var1.method3794(); + var1.method3974(); var1.remove(); - if (var1.field2423 > 0 && var1 == this.field2411[var1.field2420][var1.field2423]) { - this.field2411[var1.field2420][var1.field2423] = null; + if (var1.field2422 > 0 && var1 == this.field2385[var1.field2425][var1.field2422]) { + this.field2385[var1.field2425][var1.field2422] = null; } return true; } } + + @ObfuscatedName("gk") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;B)V", + garbageValue = "-75" + ) + @Export("doCheat") + static final void doCheat(String var0) { + if (var0.equalsIgnoreCase("toggleroof")) { + ScriptEvent.clientPreferences.roofsHidden = !ScriptEvent.clientPreferences.roofsHidden; + HitSplatDefinition.savePreferences(); + if (ScriptEvent.clientPreferences.roofsHidden) { + class30.addGameMessage(99, "", "Roofs are now all hidden"); + } else { + class30.addGameMessage(99, "", "Roofs will only be removed selectively"); + } + } + + if (var0.equalsIgnoreCase("displayfps")) { + Client.displayFps = !Client.displayFps; + } + + if (var0.equalsIgnoreCase("renderself")) { + Client.renderSelf = !Client.renderSelf; + } + + if (var0.equalsIgnoreCase("mouseovertext")) { + Client.showMouseOverText = !Client.showMouseOverText; + } + + if (Client.staffModLevel >= 2) { + if (var0.equalsIgnoreCase("errortest")) { + throw new RuntimeException(); + } + + if (var0.equalsIgnoreCase("showcoord")) { + Login.worldMap.showCoord = !Login.worldMap.showCoord; + } + + if (var0.equalsIgnoreCase("fpson")) { + Client.displayFps = true; + } + + if (var0.equalsIgnoreCase("fpsoff")) { + Client.displayFps = false; + } + + if (var0.equalsIgnoreCase("gc")) { + System.gc(); + } + + if (var0.equalsIgnoreCase("clientdrop")) { + AbstractWorldMapIcon.method652(); + } + } + + PacketBufferNode var1 = SoundSystem.getPacketBufferNode(ClientPacket.field2213, Client.packetWriter.isaacCipher); + var1.packetBuffer.writeByte(var0.length() + 1); + var1.packetBuffer.writeStringCp1252NullTerminated(var0); + Client.packetWriter.addNode(var1); + } } diff --git a/runescape-client/src/main/java/MilliClock.java b/runescape-client/src/main/java/MilliClock.java index 70a166c3a4..06b93bc138 100644 --- a/runescape-client/src/main/java/MilliClock.java +++ b/runescape-client/src/main/java/MilliClock.java @@ -4,137 +4,128 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fc") +@ObfuscatedName("fg") @Implements("MilliClock") public class MilliClock extends Clock { - @ObfuscatedName("z") - long[] field1993; - @ObfuscatedName("n") + @ObfuscatedName("bi") + static String field1994; + @ObfuscatedName("a") + long[] field1998; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1174263325 - ) - int field1992; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = -133065269 - ) - int field1994; - @ObfuscatedName("u") - @ObfuscatedGetter( - longValue = 4855142476282651555L - ) - long field1997; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = -118742351 - ) - int field1996; - @ObfuscatedName("p") - @ObfuscatedGetter( - intValue = -432514755 + intValue = -1886190585 ) int field1995; + @ObfuscatedName("n") + @ObfuscatedGetter( + intValue = 741454683 + ) + int field1996; + @ObfuscatedName("q") + @ObfuscatedGetter( + longValue = 1567518656598544647L + ) + long field1997; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = -1704132259 + ) + int field1999; + @ObfuscatedName("l") + @ObfuscatedGetter( + intValue = -1589265453 + ) + int field2000; - MilliClock() { - this.field1993 = new long[10]; - this.field1992 = 256; - this.field1994 = 1; - this.field1996 = 0; - this.field1997 = class30.currentTimeMillis(); + public MilliClock() { + this.field1998 = new long[10]; + this.field1995 = 256; + this.field1996 = 1; + this.field1999 = 0; + this.field1997 = PlayerAppearance.currentTimeMillis(); for (int var1 = 0; var1 < 10; ++var1) { - this.field1993[var1] = this.field1997; + this.field1998[var1] = this.field1997; } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-54" + signature = "(I)V", + garbageValue = "1605126906" ) @Export("mark") public void mark() { for (int var1 = 0; var1 < 10; ++var1) { - this.field1993[var1] = 0L; + this.field1998[var1] = 0L; } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(III)I", - garbageValue = "569029249" + garbageValue = "432238723" ) @Export("wait") public int wait(int var1, int var2) { - int var3 = this.field1992; - int var4 = this.field1994; - this.field1992 = 300; - this.field1994 = 1; - this.field1997 = class30.currentTimeMillis(); - if (0L == this.field1993[this.field1995]) { - this.field1992 = var3; - this.field1994 = var4; - } else if (this.field1997 > this.field1993[this.field1995]) { - this.field1992 = (int)((long)(var1 * 2560) / (this.field1997 - this.field1993[this.field1995])); + int var3 = this.field1995; + int var4 = this.field1996; + this.field1995 = 300; + this.field1996 = 1; + this.field1997 = PlayerAppearance.currentTimeMillis(); + if (this.field1998[this.field2000] == 0L) { + this.field1995 = var3; + this.field1996 = var4; + } else if (this.field1997 > this.field1998[this.field2000]) { + this.field1995 = (int)((long)(var1 * 2560) / (this.field1997 - this.field1998[this.field2000])); } - if (this.field1992 < 25) { - this.field1992 = 25; + if (this.field1995 < 25) { + this.field1995 = 25; } - if (this.field1992 > 256) { - this.field1992 = 256; - this.field1994 = (int)((long)var1 - (this.field1997 - this.field1993[this.field1995]) / 10L); + if (this.field1995 > 256) { + this.field1995 = 256; + this.field1996 = (int)((long)var1 - (this.field1997 - this.field1998[this.field2000]) / 10L); } - if (this.field1994 > var1) { - this.field1994 = var1; + if (this.field1996 > var1) { + this.field1996 = var1; } - this.field1993[this.field1995] = this.field1997; - this.field1995 = (this.field1995 + 1) % 10; - if (this.field1994 > 1) { - for (int var5 = 0; var5 < 10; ++var5) { - if (0L != this.field1993[var5]) { - this.field1993[var5] += (long)this.field1994; + this.field1998[this.field2000] = this.field1997; + this.field2000 = (this.field2000 + 1) % 10; + int var5; + if (this.field1996 > 1) { + for (var5 = 0; var5 < 10; ++var5) { + if (this.field1998[var5] != 0L) { + this.field1998[var5] += (long)this.field1996; } } } - if (this.field1994 < var2) { - this.field1994 = var2; + if (this.field1996 < var2) { + this.field1996 = var2; } - long var10 = (long)this.field1994; - if (var10 > 0L) { - if (var10 % 10L == 0L) { - long var7 = var10 - 1L; + ClanChat.method5367((long)this.field1996); - try { - Thread.sleep(var7); - } catch (InterruptedException var16) { - } - - try { - Thread.sleep(1L); - } catch (InterruptedException var15) { - } - } else { - try { - Thread.sleep(var10); - } catch (InterruptedException var14) { - } - } + for (var5 = 0; this.field1999 < 256; this.field1999 += this.field1995) { + ++var5; } - int var13; - for (var13 = 0; this.field1996 < 256; this.field1996 += this.field1992) { - ++var13; - } + this.field1999 &= 255; + return var5; + } - this.field1996 &= 255; - return var13; + @ObfuscatedName("km") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "436263166" + ) + static final void method3604() { + Client.field824 = Client.cycleCntr; } } diff --git a/runescape-client/src/main/java/Model.java b/runescape-client/src/main/java/Model.java index 8667360186..5576d47112 100644 --- a/runescape-client/src/main/java/Model.java +++ b/runescape-client/src/main/java/Model.java @@ -3,180 +3,180 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dh") +@ObfuscatedName("dv") @Implements("Model") public class Model extends Entity { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ldh;" + signature = "Ldv;" ) @Export("Model_sharedSequenceModel") static Model Model_sharedSequenceModel; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("Model_sharedSequenceModelFaceAlphas") static byte[] Model_sharedSequenceModelFaceAlphas; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Ldh;" + signature = "Ldv;" ) @Export("Model_sharedSpotAnimationModel") static Model Model_sharedSpotAnimationModel; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("Model_sharedSpotAnimationModelFaceAlphas") static byte[] Model_sharedSpotAnimationModelFaceAlphas; - @ObfuscatedName("ai") - static boolean[] field1672; - @ObfuscatedName("ak") - static boolean[] field1673; - @ObfuscatedName("aq") + @ObfuscatedName("aj") + static boolean[] field1682; + @ObfuscatedName("ae") + static boolean[] field1683; + @ObfuscatedName("au") @Export("modelViewportXs") static int[] modelViewportXs; - @ObfuscatedName("am") + @ObfuscatedName("ah") @Export("modelViewportYs") static int[] modelViewportYs; - @ObfuscatedName("ae") - static int[] field1656; - @ObfuscatedName("av") - static int[] field1677; - @ObfuscatedName("ah") - static int[] field1652; - @ObfuscatedName("ag") - static int[] field1679; - @ObfuscatedName("ay") - static int[] field1681; - @ObfuscatedName("au") - static int[][] field1682; + @ObfuscatedName("an") + static int[] field1686; @ObfuscatedName("af") - static int[] field1683; + static int[] field1674; + @ObfuscatedName("ay") + static int[] field1702; + @ObfuscatedName("az") + static int[] field1689; + @ObfuscatedName("ai") + static int[] field1691; + @ObfuscatedName("ac") + static int[][] field1692; @ObfuscatedName("at") + static int[] field1693; + @ObfuscatedName("as") static int[][] field1645; - @ObfuscatedName("bx") + @ObfuscatedName("ba") + static int[] field1667; + @ObfuscatedName("bg") + static int[] field1696; + @ObfuscatedName("bc") static int[] field1697; - @ObfuscatedName("bh") - static int[] field1658; @ObfuscatedName("bd") - static int[] field1687; - @ObfuscatedName("bm") - static int[] field1688; - @ObfuscatedName("bv") - static int[] field1676; - @ObfuscatedName("bj") - static int[] field1690; - @ObfuscatedName("bs") + static int[] field1698; + @ObfuscatedName("bx") + static int[] field1699; + @ObfuscatedName("bl") + static int[] field1700; + @ObfuscatedName("bh") @Export("Model_transformTempX") static int Model_transformTempX; - @ObfuscatedName("bz") + @ObfuscatedName("bu") @Export("Model_transformTempY") static int Model_transformTempY; - @ObfuscatedName("bc") + @ObfuscatedName("br") @Export("Model_transformTempZ") static int Model_transformTempZ; - @ObfuscatedName("bk") - static boolean field1694; - @ObfuscatedName("be") + @ObfuscatedName("bq") + static boolean field1704; + @ObfuscatedName("bt") @Export("Model_sine") static int[] Model_sine; - @ObfuscatedName("bu") + @ObfuscatedName("bs") @Export("Model_cosine") static int[] Model_cosine; - @ObfuscatedName("bi") - static int[] field1699; - @ObfuscatedName("bb") - static int[] field1700; - @ObfuscatedName("r") + @ObfuscatedName("bj") + static int[] field1709; + @ObfuscatedName("bm") + static int[] field1688; + @ObfuscatedName("v") @Export("verticesCount") int verticesCount; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("verticesX") int[] verticesX; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("verticesY") int[] verticesY; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("verticesZ") int[] verticesZ; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("indicesCount") int indicesCount; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("indices1") int[] indices1; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("indices2") int[] indices2; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("indices3") int[] indices3; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("faceColors1") int[] faceColors1; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("faceColors2") int[] faceColors2; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("faceColors3") int[] faceColors3; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("faceRenderPriorities") byte[] faceRenderPriorities; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("faceAlphas") byte[] faceAlphas; - @ObfuscatedName("g") - byte[] field1639; - @ObfuscatedName("x") + @ObfuscatedName("e") + byte[] field1644; + @ObfuscatedName("s") @Export("faceTextures") short[] faceTextures; - @ObfuscatedName("h") - byte field1634; - @ObfuscatedName("s") - int field1685; + @ObfuscatedName("b") + byte field1662; + @ObfuscatedName("z") + int field1663; @ObfuscatedName("f") - int[] field1654; - @ObfuscatedName("j") - int[] field1655; - @ObfuscatedName("d") - int[] field1653; - @ObfuscatedName("l") + int[] field1664; + @ObfuscatedName("g") + int[] field1665; + @ObfuscatedName("w") + int[] field1666; + @ObfuscatedName("u") @Export("vertexLabels") int[][] vertexLabels; - @ObfuscatedName("k") + @ObfuscatedName("y") @Export("faceLabelsAlpha") int[][] faceLabelsAlpha; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @Export("isSingleTile") public boolean isSingleTile; - @ObfuscatedName("az") + @ObfuscatedName("aw") @Export("boundsType") int boundsType; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("bottomY") int bottomY; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @Export("xzRadius") int xzRadius; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @Export("diameter") int diameter; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @Export("radius") int radius; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("xMid") int xMid; - @ObfuscatedName("ax") + @ObfuscatedName("av") @Export("yMid") int yMid; - @ObfuscatedName("as") + @ObfuscatedName("am") @Export("zMid") int zMid; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @Export("xMidOffset") int xMidOffset; - @ObfuscatedName("al") + @ObfuscatedName("ax") @Export("yMidOffset") int yMidOffset; - @ObfuscatedName("ad") + @ObfuscatedName("al") @Export("zMidOffset") int zMidOffset; @@ -185,36 +185,36 @@ public class Model extends Entity { Model_sharedSequenceModelFaceAlphas = new byte[1]; Model_sharedSpotAnimationModel = new Model(); Model_sharedSpotAnimationModelFaceAlphas = new byte[1]; - field1672 = new boolean[4700]; - field1673 = new boolean[4700]; + field1682 = new boolean[4700]; + field1683 = new boolean[4700]; modelViewportXs = new int[4700]; modelViewportYs = new int[4700]; - field1656 = new int[4700]; - field1677 = new int[4700]; - field1652 = new int[4700]; - field1679 = new int[4700]; - field1681 = new int[1600]; - field1682 = new int[1600][512]; - field1683 = new int[12]; + field1686 = new int[4700]; + field1674 = new int[4700]; + field1702 = new int[4700]; + field1689 = new int[4700]; + field1691 = new int[1600]; + field1692 = new int[1600][512]; + field1693 = new int[12]; field1645 = new int[12][2000]; - field1697 = new int[2000]; - field1658 = new int[2000]; - field1687 = new int[12]; - field1688 = new int[10]; - field1676 = new int[10]; - field1690 = new int[10]; - field1694 = true; + field1667 = new int[2000]; + field1696 = new int[2000]; + field1697 = new int[12]; + field1698 = new int[10]; + field1699 = new int[10]; + field1700 = new int[10]; + field1704 = true; Model_sine = Rasterizer3D.Rasterizer3D_sine; Model_cosine = Rasterizer3D.Rasterizer3D_cosine; - field1699 = Rasterizer3D.Rasterizer3D_colorPalette; - field1700 = Rasterizer3D.field1753; + field1709 = Rasterizer3D.Rasterizer3D_colorPalette; + field1688 = Rasterizer3D.field1760; } Model() { this.verticesCount = 0; this.indicesCount = 0; - this.field1634 = 0; - this.field1685 = 0; + this.field1662 = 0; + this.field1663 = 0; this.isSingleTile = false; this.xMidOffset = -1; this.yMidOffset = -1; @@ -222,13 +222,13 @@ public class Model extends Entity { } @ObfuscatedSignature( - signature = "([Ldh;I)V" + signature = "([Ldv;I)V" ) public Model(Model[] var1, int var2) { this.verticesCount = 0; this.indicesCount = 0; - this.field1634 = 0; - this.field1685 = 0; + this.field1662 = 0; + this.field1663 = 0; this.isSingleTile = false; this.xMidOffset = -1; this.yMidOffset = -1; @@ -239,8 +239,8 @@ public class Model extends Entity { boolean var6 = false; this.verticesCount = 0; this.indicesCount = 0; - this.field1685 = 0; - this.field1634 = -1; + this.field1663 = 0; + this.field1662 = -1; int var7; Model var8; @@ -249,22 +249,22 @@ public class Model extends Entity { if (var8 != null) { this.verticesCount += var8.verticesCount; this.indicesCount += var8.indicesCount; - this.field1685 += var8.field1685; + this.field1663 += var8.field1663; if (var8.faceRenderPriorities != null) { var3 = true; } else { - if (this.field1634 == -1) { - this.field1634 = var8.field1634; + if (this.field1662 == -1) { + this.field1662 = var8.field1662; } - if (this.field1634 != var8.field1634) { + if (this.field1662 != var8.field1662) { var3 = true; } } var4 |= var8.faceAlphas != null; var5 |= var8.faceTextures != null; - var6 |= var8.field1639 != null; + var6 |= var8.field1644 != null; } } @@ -290,18 +290,18 @@ public class Model extends Entity { } if (var6) { - this.field1639 = new byte[this.indicesCount]; + this.field1644 = new byte[this.indicesCount]; } - if (this.field1685 > 0) { - this.field1654 = new int[this.field1685]; - this.field1655 = new int[this.field1685]; - this.field1653 = new int[this.field1685]; + if (this.field1663 > 0) { + this.field1664 = new int[this.field1663]; + this.field1665 = new int[this.field1663]; + this.field1666 = new int[this.field1663]; } this.verticesCount = 0; this.indicesCount = 0; - this.field1685 = 0; + this.field1663 = 0; for (var7 = 0; var7 < var2; ++var7) { var8 = var1[var7]; @@ -318,7 +318,7 @@ public class Model extends Entity { if (var8.faceRenderPriorities != null) { this.faceRenderPriorities[this.indicesCount] = var8.faceRenderPriorities[var9]; } else { - this.faceRenderPriorities[this.indicesCount] = var8.field1634; + this.faceRenderPriorities[this.indicesCount] = var8.field1662; } } @@ -335,21 +335,21 @@ public class Model extends Entity { } if (var6) { - if (var8.field1639 != null && var8.field1639[var9] != -1) { - this.field1639[this.indicesCount] = (byte)(this.field1685 + var8.field1639[var9]); + if (var8.field1644 != null && var8.field1644[var9] != -1) { + this.field1644[this.indicesCount] = (byte)(this.field1663 + var8.field1644[var9]); } else { - this.field1639[this.indicesCount] = -1; + this.field1644[this.indicesCount] = -1; } } ++this.indicesCount; } - for (var9 = 0; var9 < var8.field1685; ++var9) { - this.field1654[this.field1685] = this.verticesCount + var8.field1654[var9]; - this.field1655[this.field1685] = this.verticesCount + var8.field1655[var9]; - this.field1653[this.field1685] = this.verticesCount + var8.field1653[var9]; - ++this.field1685; + for (var9 = 0; var9 < var8.field1663; ++var9) { + this.field1664[this.field1663] = this.verticesCount + var8.field1664[var9]; + this.field1665[this.field1663] = this.verticesCount + var8.field1665[var9]; + this.field1666[this.field1663] = this.verticesCount + var8.field1666[var9]; + ++this.field1663; } for (var9 = 0; var9 < var8.verticesCount; ++var9) { @@ -363,9 +363,9 @@ public class Model extends Entity { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([[IIIIZI)Ldh;" + signature = "([[IIIIZI)Ldv;" ) @Export("contourGround") public Model contourGround(int[][] var1, int var2, int var3, int var4, boolean var5, int var6) { @@ -387,7 +387,7 @@ public class Model extends Entity { var11 = new Model(); var11.verticesCount = this.verticesCount; var11.indicesCount = this.indicesCount; - var11.field1685 = this.field1685; + var11.field1663 = this.field1663; var11.verticesX = this.verticesX; var11.verticesZ = this.verticesZ; var11.indices1 = this.indices1; @@ -398,12 +398,12 @@ public class Model extends Entity { var11.faceColors3 = this.faceColors3; var11.faceRenderPriorities = this.faceRenderPriorities; var11.faceAlphas = this.faceAlphas; - var11.field1639 = this.field1639; + var11.field1644 = this.field1644; var11.faceTextures = this.faceTextures; - var11.field1634 = this.field1634; - var11.field1654 = this.field1654; - var11.field1655 = this.field1655; - var11.field1653 = this.field1653; + var11.field1662 = this.field1662; + var11.field1664 = this.field1664; + var11.field1665 = this.field1665; + var11.field1666 = this.field1666; var11.vertexLabels = this.vertexLabels; var11.faceLabelsAlpha = this.faceLabelsAlpha; var11.isSingleTile = this.isSingleTile; @@ -461,9 +461,9 @@ public class Model extends Entity { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Z)Ldh;" + signature = "(Z)Ldv;" ) @Export("toSharedSequenceModel") public Model toSharedSequenceModel(boolean var1) { @@ -474,9 +474,9 @@ public class Model extends Entity { return this.buildSharedModel(var1, Model_sharedSequenceModel, Model_sharedSequenceModelFaceAlphas); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Z)Ldh;" + signature = "(Z)Ldv;" ) @Export("toSharedSpotAnimationModel") public Model toSharedSpotAnimationModel(boolean var1) { @@ -487,15 +487,15 @@ public class Model extends Entity { return this.buildSharedModel(var1, Model_sharedSpotAnimationModel, Model_sharedSpotAnimationModelFaceAlphas); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(ZLdh;[B)Ldh;" + signature = "(ZLdv;[B)Ldv;" ) @Export("buildSharedModel") Model buildSharedModel(boolean var1, Model var2, byte[] var3) { var2.verticesCount = this.verticesCount; var2.indicesCount = this.indicesCount; - var2.field1685 = this.field1685; + var2.field1663 = this.field1663; if (var2.verticesX == null || var2.verticesX.length < this.verticesCount) { var2.verticesX = new int[this.verticesCount + 100]; var2.verticesY = new int[this.verticesCount + 100]; @@ -531,12 +531,12 @@ public class Model extends Entity { var2.faceColors2 = this.faceColors2; var2.faceColors3 = this.faceColors3; var2.faceRenderPriorities = this.faceRenderPriorities; - var2.field1639 = this.field1639; + var2.field1644 = this.field1644; var2.faceTextures = this.faceTextures; - var2.field1634 = this.field1634; - var2.field1654 = this.field1654; - var2.field1655 = this.field1655; - var2.field1653 = this.field1653; + var2.field1662 = this.field1662; + var2.field1664 = this.field1664; + var2.field1665 = this.field1665; + var2.field1666 = this.field1666; var2.vertexLabels = this.vertexLabels; var2.faceLabelsAlpha = this.faceLabelsAlpha; var2.isSingleTile = this.isSingleTile; @@ -544,7 +544,7 @@ public class Model extends Entity { return var2; } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("calculateBoundingBox") void calculateBoundingBox(int var1) { if (this.xMidOffset == -1) { @@ -558,9 +558,9 @@ public class Model extends Entity { int var9 = Model_sine[var1]; for (int var10 = 0; var10 < this.verticesCount; ++var10) { - int var11 = Rasterizer3D.method2982(this.verticesX[var10], this.verticesZ[var10], var8, var9); + int var11 = Rasterizer3D.method3141(this.verticesX[var10], this.verticesZ[var10], var8, var9); int var12 = this.verticesY[var10]; - int var13 = Rasterizer3D.method2983(this.verticesX[var10], this.verticesZ[var10], var8, var9); + int var13 = Rasterizer3D.method3142(this.verticesX[var10], this.verticesZ[var10], var8, var9); if (var11 < var2) { var2 = var11; } @@ -608,7 +608,7 @@ public class Model extends Entity { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("calculateBoundsCylinder") public void calculateBoundsCylinder() { if (this.boundsType != 1) { @@ -641,8 +641,8 @@ public class Model extends Entity { } } - @ObfuscatedName("q") - void method2858() { + @ObfuscatedName("c") + void method3032() { if (this.boundsType != 2) { this.boundsType = 2; this.xzRadius = 0; @@ -663,22 +663,22 @@ public class Model extends Entity { } } - @ObfuscatedName("m") - public int method2859() { + @ObfuscatedName("o") + public int method3027() { this.calculateBoundsCylinder(); return this.xzRadius; } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("resetBounds") void resetBounds() { this.boundsType = 0; this.xMidOffset = -1; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(Lep;I)V" + signature = "(Lem;I)V" ) @Export("animate") public void animate(Frames var1, int var2) { @@ -700,9 +700,9 @@ public class Model extends Entity { } } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(Lep;ILep;I[I)V" + signature = "(Lem;ILem;I[I)V" ) @Export("animate2") public void animate2(Frames var1, int var2, Frames var3, int var4, int[] var5) { @@ -752,7 +752,7 @@ public class Model extends Entity { } } - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("transform") void transform(int var1, int[] var2, int var3, int var4, int var5) { int var6 = var2.length; @@ -920,7 +920,7 @@ public class Model extends Entity { } } - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("rotateY90Ccw") public void rotateY90Ccw() { for (int var1 = 0; var1 < this.verticesCount; ++var1) { @@ -932,7 +932,7 @@ public class Model extends Entity { this.resetBounds(); } - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("rotateY180") public void rotateY180() { for (int var1 = 0; var1 < this.verticesCount; ++var1) { @@ -943,7 +943,7 @@ public class Model extends Entity { this.resetBounds(); } - @ObfuscatedName("x") + @ObfuscatedName("j") @Export("rotateY270Ccw") public void rotateY270Ccw() { for (int var1 = 0; var1 < this.verticesCount; ++var1) { @@ -955,7 +955,7 @@ public class Model extends Entity { this.resetBounds(); } - @ObfuscatedName("h") + @ObfuscatedName("r") @Export("rotateZ") public void rotateZ(int var1) { int var2 = Model_sine[var1]; @@ -970,7 +970,7 @@ public class Model extends Entity { this.resetBounds(); } - @ObfuscatedName("s") + @ObfuscatedName("e") @Export("offsetBy") public void offsetBy(int var1, int var2, int var3) { for (int var4 = 0; var4 < this.verticesCount; ++var4) { @@ -985,7 +985,7 @@ public class Model extends Entity { this.resetBounds(); } - @ObfuscatedName("f") + @ObfuscatedName("s") @Export("scale") public void scale(int var1, int var2, int var3) { for (int var4 = 0; var4 < this.verticesCount; ++var4) { @@ -997,11 +997,11 @@ public class Model extends Entity { this.resetBounds(); } - @ObfuscatedName("j") - public final void method2870(int var1, int var2, int var3, int var4, int var5, int var6, int var7) { - field1681[0] = -1; + @ObfuscatedName("b") + public final void method3044(int var1, int var2, int var3, int var4, int var5, int var6, int var7) { + field1691[0] = -1; if (this.boundsType != 2 && this.boundsType != 1) { - this.method2858(); + this.method3032(); } int var8 = Rasterizer3D.Rasterizer3D_clipMidX; @@ -1044,13 +1044,13 @@ public class Model extends Entity { var22 += var7; var23 = var21 * var17 - var22 * var16 >> 16; var22 = var21 * var16 + var22 * var17 >> 16; - field1656[var19] = var22 - var18; + field1686[var19] = var22 - var18; modelViewportXs[var19] = var20 * Rasterizer3D.Rasterizer3D_zoom / var22 + var8; modelViewportYs[var19] = var23 * Rasterizer3D.Rasterizer3D_zoom / var22 + var9; - if (this.field1685 > 0) { - field1677[var19] = var20; - field1652[var19] = var23; - field1679[var19] = var22; + if (this.field1663 > 0) { + field1674[var19] = var20; + field1702[var19] = var23; + field1689[var19] = var22; } } @@ -1061,11 +1061,11 @@ public class Model extends Entity { } - @ObfuscatedName("d") - public final void method2871(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { - field1681[0] = -1; + @ObfuscatedName("w") + public final void method3046(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { + field1691[0] = -1; if (this.boundsType != 2 && this.boundsType != 1) { - this.method2858(); + this.method3032(); } int var9 = Rasterizer3D.Rasterizer3D_clipMidX; @@ -1108,13 +1108,13 @@ public class Model extends Entity { var23 += var7; var24 = var22 * var18 - var23 * var17 >> 16; var23 = var22 * var17 + var23 * var18 >> 16; - field1656[var20] = var23 - var19; + field1686[var20] = var23 - var19; modelViewportXs[var20] = var9 + var21 * Rasterizer3D.Rasterizer3D_zoom / var8; modelViewportYs[var20] = var10 + var24 * Rasterizer3D.Rasterizer3D_zoom / var8; - if (this.field1685 > 0) { - field1677[var20] = var21; - field1652[var20] = var24; - field1679[var20] = var23; + if (this.field1663 > 0) { + field1674[var20] = var21; + field1702[var20] = var24; + field1689[var20] = var23; } } @@ -1125,13 +1125,13 @@ public class Model extends Entity { } - @ObfuscatedName("l") + @ObfuscatedName("u") @Export("draw0") final void draw0(boolean var1, boolean var2, boolean var3, long var4) { if (this.diameter < 1600) { int var6; for (var6 = 0; var6 < this.diameter; ++var6) { - field1681[var6] = 0; + field1691[var6] = 0; } var6 = var3 ? 20 : 5; @@ -1154,76 +1154,76 @@ public class Model extends Entity { var11 = modelViewportXs[var8]; var12 = modelViewportXs[var27]; var13 = modelViewportXs[var10]; + int var14; int var17; - int var34; - if (var1 && (var11 == -5000 || var12 == -5000 || var13 == -5000)) { - var34 = field1677[var8]; - var15 = field1677[var27]; - var16 = field1677[var10]; - var17 = field1652[var8]; - var18 = field1652[var27]; - int var19 = field1652[var10]; - int var20 = field1679[var8]; - int var21 = field1679[var27]; - int var22 = field1679[var10]; - var34 -= var15; - var16 -= var15; - var17 -= var18; - var19 -= var18; - var20 -= var21; - var22 -= var21; - int var23 = var17 * var22 - var20 * var19; - int var24 = var20 * var16 - var34 * var22; - int var25 = var34 * var19 - var17 * var16; - if (var15 * var23 + var18 * var24 + var21 * var25 > 0) { - field1673[var7] = true; - int var26 = (field1656[var8] + field1656[var27] + field1656[var10]) / 3 + this.radius; - field1682[var26][field1681[var26]++] = var7; - } - } else { + if (!var1 || var11 != -5000 && var12 != -5000 && var13 != -5000) { if (var2) { var15 = modelViewportYs[var8]; var16 = modelViewportYs[var27]; var17 = modelViewportYs[var10]; var18 = var6 + ViewportMouse.ViewportMouse_y; - boolean var14; + boolean var34; if (var18 < var15 && var18 < var16 && var18 < var17) { - var14 = false; + var34 = false; } else { var18 = ViewportMouse.ViewportMouse_y - var6; if (var18 > var15 && var18 > var16 && var18 > var17) { - var14 = false; + var34 = false; } else { var18 = var6 + ViewportMouse.ViewportMouse_x; if (var18 < var11 && var18 < var12 && var18 < var13) { - var14 = false; + var34 = false; } else { var18 = ViewportMouse.ViewportMouse_x - var6; if (var18 > var11 && var18 > var12 && var18 > var13) { - var14 = false; + var34 = false; } else { - var14 = true; + var34 = true; } } } } - if (var14) { + if (var34) { ViewportMouse.ViewportMouse_entityTags[++ViewportMouse.ViewportMouse_entityCount - 1] = var4; var2 = false; } } if ((var11 - var12) * (modelViewportYs[var10] - modelViewportYs[var27]) - (var13 - var12) * (modelViewportYs[var8] - modelViewportYs[var27]) > 0) { - field1673[var7] = false; + field1683[var7] = false; if (var11 >= 0 && var12 >= 0 && var13 >= 0 && var11 <= Rasterizer3D.Rasterizer3D_clipWidth && var12 <= Rasterizer3D.Rasterizer3D_clipWidth && var13 <= Rasterizer3D.Rasterizer3D_clipWidth) { - field1672[var7] = false; + field1682[var7] = false; } else { - field1672[var7] = true; + field1682[var7] = true; } - var34 = (field1656[var8] + field1656[var27] + field1656[var10]) / 3 + this.radius; - field1682[var34][field1681[var34]++] = var7; + var14 = (field1686[var8] + field1686[var27] + field1686[var10]) / 3 + this.radius; + field1692[var14][field1691[var14]++] = var7; + } + } else { + var14 = field1674[var8]; + var15 = field1674[var27]; + var16 = field1674[var10]; + var17 = field1702[var8]; + var18 = field1702[var27]; + int var19 = field1702[var10]; + int var20 = field1689[var8]; + int var21 = field1689[var27]; + int var22 = field1689[var10]; + var14 -= var15; + var16 -= var15; + var17 -= var18; + var19 -= var18; + var20 -= var21; + var22 -= var21; + int var23 = var17 * var22 - var20 * var19; + int var24 = var20 * var16 - var14 * var22; + int var25 = var14 * var19 - var17 * var16; + if (var15 * var23 + var18 * var24 + var21 * var25 > 0) { + field1683[var7] = true; + int var26 = (field1686[var8] + field1686[var27] + field1686[var10]) / 3 + this.radius; + field1692[var26][field1691[var26]++] = var7; } } } @@ -1232,68 +1232,68 @@ public class Model extends Entity { int[] var9; if (this.faceRenderPriorities == null) { for (var7 = this.diameter - 1; var7 >= 0; --var7) { - var8 = field1681[var7]; + var8 = field1691[var7]; if (var8 > 0) { - var9 = field1682[var7]; + var9 = field1692[var7]; for (var10 = 0; var10 < var8; ++var10) { - this.method2874(var9[var10]); + this.method3048(var9[var10]); } } } } else { for (var7 = 0; var7 < 12; ++var7) { - field1683[var7] = 0; - field1687[var7] = 0; + field1693[var7] = 0; + field1697[var7] = 0; } for (var7 = this.diameter - 1; var7 >= 0; --var7) { - var8 = field1681[var7]; + var8 = field1691[var7]; if (var8 > 0) { - var9 = field1682[var7]; + var9 = field1692[var7]; for (var10 = 0; var10 < var8; ++var10) { var11 = var9[var10]; byte var33 = this.faceRenderPriorities[var11]; - var13 = field1683[var33]++; + var13 = field1693[var33]++; field1645[var33][var13] = var11; if (var33 < 10) { - int[] var10000 = field1687; + int[] var10000 = field1697; var10000[var33] += var7; } else if (var33 == 10) { - field1697[var13] = var7; + field1667[var13] = var7; } else { - field1658[var13] = var7; + field1696[var13] = var7; } } } } var7 = 0; - if (field1683[1] > 0 || field1683[2] > 0) { - var7 = (field1687[1] + field1687[2]) / (field1683[1] + field1683[2]); + if (field1693[1] > 0 || field1693[2] > 0) { + var7 = (field1697[1] + field1697[2]) / (field1693[1] + field1693[2]); } var8 = 0; - if (field1683[3] > 0 || field1683[4] > 0) { - var8 = (field1687[3] + field1687[4]) / (field1683[3] + field1683[4]); + if (field1693[3] > 0 || field1693[4] > 0) { + var8 = (field1697[3] + field1697[4]) / (field1693[3] + field1693[4]); } var27 = 0; - if (field1683[6] > 0 || field1683[8] > 0) { - var27 = (field1687[8] + field1687[6]) / (field1683[8] + field1683[6]); + if (field1693[6] > 0 || field1693[8] > 0) { + var27 = (field1697[8] + field1697[6]) / (field1693[8] + field1693[6]); } var11 = 0; - var12 = field1683[10]; + var12 = field1693[10]; int[] var30 = field1645[10]; - int[] var31 = field1697; + int[] var31 = field1667; if (var11 == var12) { var11 = 0; - var12 = field1683[11]; + var12 = field1693[11]; var30 = field1645[11]; - var31 = field1658; + var31 = field1696; } if (var11 < var12) { @@ -1304,12 +1304,12 @@ public class Model extends Entity { for (var15 = 0; var15 < 10; ++var15) { while (var15 == 0 && var10 > var7) { - this.method2874(var30[var11++]); + this.method3048(var30[var11++]); if (var11 == var12 && var30 != field1645[11]) { var11 = 0; - var12 = field1683[11]; + var12 = field1693[11]; var30 = field1645[11]; - var31 = field1658; + var31 = field1696; } if (var11 < var12) { @@ -1320,12 +1320,12 @@ public class Model extends Entity { } while (var15 == 3 && var10 > var8) { - this.method2874(var30[var11++]); + this.method3048(var30[var11++]); if (var11 == var12 && var30 != field1645[11]) { var11 = 0; - var12 = field1683[11]; + var12 = field1693[11]; var30 = field1645[11]; - var31 = field1658; + var31 = field1696; } if (var11 < var12) { @@ -1336,12 +1336,12 @@ public class Model extends Entity { } while (var15 == 5 && var10 > var27) { - this.method2874(var30[var11++]); + this.method3048(var30[var11++]); if (var11 == var12 && var30 != field1645[11]) { var11 = 0; - var12 = field1683[11]; + var12 = field1693[11]; var30 = field1645[11]; - var31 = field1658; + var31 = field1696; } if (var11 < var12) { @@ -1351,21 +1351,21 @@ public class Model extends Entity { } } - var16 = field1683[var15]; + var16 = field1693[var15]; int[] var32 = field1645[var15]; for (var18 = 0; var18 < var16; ++var18) { - this.method2874(var32[var18]); + this.method3048(var32[var18]); } } while (var10 != -1000) { - this.method2874(var30[var11++]); + this.method3048(var30[var11++]); if (var11 == var12 && var30 != field1645[11]) { var11 = 0; var30 = field1645[11]; - var12 = field1683[11]; - var31 = field1658; + var12 = field1693[11]; + var31 = field1696; } if (var11 < var12) { @@ -1379,15 +1379,15 @@ public class Model extends Entity { } } - @ObfuscatedName("k") - final void method2874(int var1) { - if (field1673[var1]) { - this.method2875(var1); + @ObfuscatedName("ad") + final void method3048(int var1) { + if (field1683[var1]) { + this.method3049(var1); } else { int var2 = this.indices1[var1]; int var3 = this.indices2[var1]; int var4 = this.indices3[var1]; - Rasterizer3D.field1733 = field1672[var1]; + Rasterizer3D.field1745 = field1682[var1]; if (this.faceAlphas == null) { Rasterizer3D.Rasterizer3D_alpha = 0; } else { @@ -1398,11 +1398,11 @@ public class Model extends Entity { int var5; int var6; int var7; - if (this.field1639 != null && this.field1639[var1] != -1) { - int var8 = this.field1639[var1] & 255; - var5 = this.field1654[var8]; - var6 = this.field1655[var8]; - var7 = this.field1653[var8]; + if (this.field1644 != null && this.field1644[var1] != -1) { + int var8 = this.field1644[var1] & 255; + var5 = this.field1664[var8]; + var6 = this.field1665[var8]; + var7 = this.field1666[var8]; } else { var5 = var2; var6 = var3; @@ -1410,30 +1410,30 @@ public class Model extends Entity { } if (this.faceColors3[var1] == -1) { - Rasterizer3D.method2977(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1677[var5], field1677[var6], field1677[var7], field1652[var5], field1652[var6], field1652[var7], field1679[var5], field1679[var6], field1679[var7], this.faceTextures[var1]); + Rasterizer3D.method3187(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1674[var5], field1674[var6], field1674[var7], field1702[var5], field1702[var6], field1702[var7], field1689[var5], field1689[var6], field1689[var7], this.faceTextures[var1]); } else { - Rasterizer3D.method2977(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors2[var1], this.faceColors3[var1], field1677[var5], field1677[var6], field1677[var7], field1652[var5], field1652[var6], field1652[var7], field1679[var5], field1679[var6], field1679[var7], this.faceTextures[var1]); + Rasterizer3D.method3187(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors2[var1], this.faceColors3[var1], field1674[var5], field1674[var6], field1674[var7], field1702[var5], field1702[var6], field1702[var7], field1689[var5], field1689[var6], field1689[var7], this.faceTextures[var1]); } } else if (this.faceColors3[var1] == -1) { - Rasterizer3D.method2975(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], field1699[this.faceColors1[var1]]); + Rasterizer3D.method3134(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], field1709[this.faceColors1[var1]]); } else { - Rasterizer3D.method2973(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors2[var1], this.faceColors3[var1]); + Rasterizer3D.method3132(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors2[var1], this.faceColors3[var1]); } } } - @ObfuscatedName("ac") - final void method2875(int var1) { + @ObfuscatedName("ag") + final void method3049(int var1) { int var2 = Rasterizer3D.Rasterizer3D_clipMidX; int var3 = Rasterizer3D.Rasterizer3D_clipMidY; int var4 = 0; int var5 = this.indices1[var1]; int var6 = this.indices2[var1]; int var7 = this.indices3[var1]; - int var8 = field1679[var5]; - int var9 = field1679[var6]; - int var10 = field1679[var7]; + int var8 = field1689[var5]; + int var9 = field1689[var6]; + int var10 = field1689[var7]; if (this.faceAlphas == null) { Rasterizer3D.Rasterizer3D_alpha = 0; } else { @@ -1445,96 +1445,96 @@ public class Model extends Entity { int var13; int var14; if (var8 >= 50) { - field1688[var4] = modelViewportXs[var5]; - field1676[var4] = modelViewportYs[var5]; - field1690[var4++] = this.faceColors1[var1]; + field1698[var4] = modelViewportXs[var5]; + field1699[var4] = modelViewportYs[var5]; + field1700[var4++] = this.faceColors1[var1]; } else { - var11 = field1677[var5]; - var12 = field1652[var5]; + var11 = field1674[var5]; + var12 = field1702[var5]; var13 = this.faceColors1[var1]; if (var10 >= 50) { - var14 = field1700[var10 - var8] * (50 - var8); - field1688[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1677[var7] - var11) * var14 >> 16)) / 50; - field1676[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1652[var7] - var12) * var14 >> 16)) / 50; - field1690[var4++] = var13 + ((this.faceColors3[var1] - var13) * var14 >> 16); + var14 = field1688[var10 - var8] * (50 - var8); + field1698[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1674[var7] - var11) * var14 >> 16)) / 50; + field1699[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1702[var7] - var12) * var14 >> 16)) / 50; + field1700[var4++] = var13 + ((this.faceColors3[var1] - var13) * var14 >> 16); } if (var9 >= 50) { - var14 = field1700[var9 - var8] * (50 - var8); - field1688[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1677[var6] - var11) * var14 >> 16)) / 50; - field1676[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1652[var6] - var12) * var14 >> 16)) / 50; - field1690[var4++] = var13 + ((this.faceColors2[var1] - var13) * var14 >> 16); + var14 = field1688[var9 - var8] * (50 - var8); + field1698[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1674[var6] - var11) * var14 >> 16)) / 50; + field1699[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1702[var6] - var12) * var14 >> 16)) / 50; + field1700[var4++] = var13 + ((this.faceColors2[var1] - var13) * var14 >> 16); } } if (var9 >= 50) { - field1688[var4] = modelViewportXs[var6]; - field1676[var4] = modelViewportYs[var6]; - field1690[var4++] = this.faceColors2[var1]; + field1698[var4] = modelViewportXs[var6]; + field1699[var4] = modelViewportYs[var6]; + field1700[var4++] = this.faceColors2[var1]; } else { - var11 = field1677[var6]; - var12 = field1652[var6]; + var11 = field1674[var6]; + var12 = field1702[var6]; var13 = this.faceColors2[var1]; if (var8 >= 50) { - var14 = field1700[var8 - var9] * (50 - var9); - field1688[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1677[var5] - var11) * var14 >> 16)) / 50; - field1676[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1652[var5] - var12) * var14 >> 16)) / 50; - field1690[var4++] = var13 + ((this.faceColors1[var1] - var13) * var14 >> 16); + var14 = field1688[var8 - var9] * (50 - var9); + field1698[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1674[var5] - var11) * var14 >> 16)) / 50; + field1699[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1702[var5] - var12) * var14 >> 16)) / 50; + field1700[var4++] = var13 + ((this.faceColors1[var1] - var13) * var14 >> 16); } if (var10 >= 50) { - var14 = field1700[var10 - var9] * (50 - var9); - field1688[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1677[var7] - var11) * var14 >> 16)) / 50; - field1676[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1652[var7] - var12) * var14 >> 16)) / 50; - field1690[var4++] = var13 + ((this.faceColors3[var1] - var13) * var14 >> 16); + var14 = field1688[var10 - var9] * (50 - var9); + field1698[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1674[var7] - var11) * var14 >> 16)) / 50; + field1699[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1702[var7] - var12) * var14 >> 16)) / 50; + field1700[var4++] = var13 + ((this.faceColors3[var1] - var13) * var14 >> 16); } } if (var10 >= 50) { - field1688[var4] = modelViewportXs[var7]; - field1676[var4] = modelViewportYs[var7]; - field1690[var4++] = this.faceColors3[var1]; + field1698[var4] = modelViewportXs[var7]; + field1699[var4] = modelViewportYs[var7]; + field1700[var4++] = this.faceColors3[var1]; } else { - var11 = field1677[var7]; - var12 = field1652[var7]; + var11 = field1674[var7]; + var12 = field1702[var7]; var13 = this.faceColors3[var1]; if (var9 >= 50) { - var14 = field1700[var9 - var10] * (50 - var10); - field1688[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1677[var6] - var11) * var14 >> 16)) / 50; - field1676[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1652[var6] - var12) * var14 >> 16)) / 50; - field1690[var4++] = var13 + ((this.faceColors2[var1] - var13) * var14 >> 16); + var14 = field1688[var9 - var10] * (50 - var10); + field1698[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1674[var6] - var11) * var14 >> 16)) / 50; + field1699[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1702[var6] - var12) * var14 >> 16)) / 50; + field1700[var4++] = var13 + ((this.faceColors2[var1] - var13) * var14 >> 16); } if (var8 >= 50) { - var14 = field1700[var8 - var10] * (50 - var10); - field1688[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1677[var5] - var11) * var14 >> 16)) / 50; - field1676[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1652[var5] - var12) * var14 >> 16)) / 50; - field1690[var4++] = var13 + ((this.faceColors1[var1] - var13) * var14 >> 16); + var14 = field1688[var8 - var10] * (50 - var10); + field1698[var4] = var2 + Rasterizer3D.Rasterizer3D_zoom * (var11 + ((field1674[var5] - var11) * var14 >> 16)) / 50; + field1699[var4] = var3 + Rasterizer3D.Rasterizer3D_zoom * (var12 + ((field1702[var5] - var12) * var14 >> 16)) / 50; + field1700[var4++] = var13 + ((this.faceColors1[var1] - var13) * var14 >> 16); } } - var11 = field1688[0]; - var12 = field1688[1]; - var13 = field1688[2]; - var14 = field1676[0]; - int var15 = field1676[1]; - int var16 = field1676[2]; - Rasterizer3D.field1733 = false; + var11 = field1698[0]; + var12 = field1698[1]; + var13 = field1698[2]; + var14 = field1699[0]; + int var15 = field1699[1]; + int var16 = field1699[2]; + Rasterizer3D.field1745 = false; int var17; int var18; int var19; int var20; if (var4 == 3) { if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > Rasterizer3D.Rasterizer3D_clipWidth || var12 > Rasterizer3D.Rasterizer3D_clipWidth || var13 > Rasterizer3D.Rasterizer3D_clipWidth) { - Rasterizer3D.field1733 = true; + Rasterizer3D.field1745 = true; } if (this.faceTextures != null && this.faceTextures[var1] != -1) { - if (this.field1639 != null && this.field1639[var1] != -1) { - var20 = this.field1639[var1] & 255; - var17 = this.field1654[var20]; - var18 = this.field1655[var20]; - var19 = this.field1653[var20]; + if (this.field1644 != null && this.field1644[var1] != -1) { + var20 = this.field1644[var1] & 255; + var17 = this.field1664[var20]; + var18 = this.field1665[var20]; + var19 = this.field1666[var20]; } else { var17 = var5; var18 = var6; @@ -1542,28 +1542,28 @@ public class Model extends Entity { } if (this.faceColors3[var1] == -1) { - Rasterizer3D.method2977(var14, var15, var16, var11, var12, var13, this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1677[var17], field1677[var18], field1677[var19], field1652[var17], field1652[var18], field1652[var19], field1679[var17], field1679[var18], field1679[var19], this.faceTextures[var1]); + Rasterizer3D.method3187(var14, var15, var16, var11, var12, var13, this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1674[var17], field1674[var18], field1674[var19], field1702[var17], field1702[var18], field1702[var19], field1689[var17], field1689[var18], field1689[var19], this.faceTextures[var1]); } else { - Rasterizer3D.method2977(var14, var15, var16, var11, var12, var13, field1690[0], field1690[1], field1690[2], field1677[var17], field1677[var18], field1677[var19], field1652[var17], field1652[var18], field1652[var19], field1679[var17], field1679[var18], field1679[var19], this.faceTextures[var1]); + Rasterizer3D.method3187(var14, var15, var16, var11, var12, var13, field1700[0], field1700[1], field1700[2], field1674[var17], field1674[var18], field1674[var19], field1702[var17], field1702[var18], field1702[var19], field1689[var17], field1689[var18], field1689[var19], this.faceTextures[var1]); } } else if (this.faceColors3[var1] == -1) { - Rasterizer3D.method2975(var14, var15, var16, var11, var12, var13, field1699[this.faceColors1[var1]]); + Rasterizer3D.method3134(var14, var15, var16, var11, var12, var13, field1709[this.faceColors1[var1]]); } else { - Rasterizer3D.method2973(var14, var15, var16, var11, var12, var13, field1690[0], field1690[1], field1690[2]); + Rasterizer3D.method3132(var14, var15, var16, var11, var12, var13, field1700[0], field1700[1], field1700[2]); } } if (var4 == 4) { - if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > Rasterizer3D.Rasterizer3D_clipWidth || var12 > Rasterizer3D.Rasterizer3D_clipWidth || var13 > Rasterizer3D.Rasterizer3D_clipWidth || field1688[3] < 0 || field1688[3] > Rasterizer3D.Rasterizer3D_clipWidth) { - Rasterizer3D.field1733 = true; + if (var11 < 0 || var12 < 0 || var13 < 0 || var11 > Rasterizer3D.Rasterizer3D_clipWidth || var12 > Rasterizer3D.Rasterizer3D_clipWidth || var13 > Rasterizer3D.Rasterizer3D_clipWidth || field1698[3] < 0 || field1698[3] > Rasterizer3D.Rasterizer3D_clipWidth) { + Rasterizer3D.field1745 = true; } if (this.faceTextures != null && this.faceTextures[var1] != -1) { - if (this.field1639 != null && this.field1639[var1] != -1) { - var20 = this.field1639[var1] & 255; - var17 = this.field1654[var20]; - var18 = this.field1655[var20]; - var19 = this.field1653[var20]; + if (this.field1644 != null && this.field1644[var1] != -1) { + var20 = this.field1644[var1] & 255; + var17 = this.field1664[var20]; + var18 = this.field1665[var20]; + var19 = this.field1666[var20]; } else { var17 = var5; var18 = var6; @@ -1572,28 +1572,28 @@ public class Model extends Entity { short var21 = this.faceTextures[var1]; if (this.faceColors3[var1] == -1) { - Rasterizer3D.method2977(var14, var15, var16, var11, var12, var13, this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1677[var17], field1677[var18], field1677[var19], field1652[var17], field1652[var18], field1652[var19], field1679[var17], field1679[var18], field1679[var19], var21); - Rasterizer3D.method2977(var14, var16, field1676[3], var11, var13, field1688[3], this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1677[var17], field1677[var18], field1677[var19], field1652[var17], field1652[var18], field1652[var19], field1679[var17], field1679[var18], field1679[var19], var21); + Rasterizer3D.method3187(var14, var15, var16, var11, var12, var13, this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1674[var17], field1674[var18], field1674[var19], field1702[var17], field1702[var18], field1702[var19], field1689[var17], field1689[var18], field1689[var19], var21); + Rasterizer3D.method3187(var14, var16, field1699[3], var11, var13, field1698[3], this.faceColors1[var1], this.faceColors1[var1], this.faceColors1[var1], field1674[var17], field1674[var18], field1674[var19], field1702[var17], field1702[var18], field1702[var19], field1689[var17], field1689[var18], field1689[var19], var21); } else { - Rasterizer3D.method2977(var14, var15, var16, var11, var12, var13, field1690[0], field1690[1], field1690[2], field1677[var17], field1677[var18], field1677[var19], field1652[var17], field1652[var18], field1652[var19], field1679[var17], field1679[var18], field1679[var19], var21); - Rasterizer3D.method2977(var14, var16, field1676[3], var11, var13, field1688[3], field1690[0], field1690[2], field1690[3], field1677[var17], field1677[var18], field1677[var19], field1652[var17], field1652[var18], field1652[var19], field1679[var17], field1679[var18], field1679[var19], var21); + Rasterizer3D.method3187(var14, var15, var16, var11, var12, var13, field1700[0], field1700[1], field1700[2], field1674[var17], field1674[var18], field1674[var19], field1702[var17], field1702[var18], field1702[var19], field1689[var17], field1689[var18], field1689[var19], var21); + Rasterizer3D.method3187(var14, var16, field1699[3], var11, var13, field1698[3], field1700[0], field1700[2], field1700[3], field1674[var17], field1674[var18], field1674[var19], field1702[var17], field1702[var18], field1702[var19], field1689[var17], field1689[var18], field1689[var19], var21); } } else if (this.faceColors3[var1] == -1) { - var17 = field1699[this.faceColors1[var1]]; - Rasterizer3D.method2975(var14, var15, var16, var11, var12, var13, var17); - Rasterizer3D.method2975(var14, var16, field1676[3], var11, var13, field1688[3], var17); + var17 = field1709[this.faceColors1[var1]]; + Rasterizer3D.method3134(var14, var15, var16, var11, var12, var13, var17); + Rasterizer3D.method3134(var14, var16, field1699[3], var11, var13, field1698[3], var17); } else { - Rasterizer3D.method2973(var14, var15, var16, var11, var12, var13, field1690[0], field1690[1], field1690[2]); - Rasterizer3D.method2973(var14, var16, field1676[3], var11, var13, field1688[3], field1690[0], field1690[2], field1690[3]); + Rasterizer3D.method3132(var14, var15, var16, var11, var12, var13, field1700[0], field1700[1], field1700[2]); + Rasterizer3D.method3132(var14, var16, field1699[3], var11, var13, field1698[3], field1700[0], field1700[2], field1700[3]); } } } - @ObfuscatedName("cb") + @ObfuscatedName("ci") @Export("draw") void draw(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, long var9) { - field1681[0] = -1; + field1691[0] = -1; if (this.boundsType != 1) { this.calculateBoundsCylinder(); } @@ -1623,104 +1623,174 @@ public class Model extends Entity { var25 = true; } - boolean var26 = var25 || this.field1685 > 0; - int var27 = Clock.method3463(); + boolean var26 = var25 || this.field1663 > 0; + int var27 = Calendar.method4102(); int var28 = ViewportMouse.ViewportMouse_y; - boolean var30 = ViewportMouse.ViewportMouse_isInViewport; - boolean var32 = Language.method3635(var9); - boolean var33 = false; - int var35; + boolean var30 = GrandExchangeOfferOwnWorldComparator.method1376(); + boolean var31 = GraphicsObject.method2155(var9); + boolean var32 = false; int var36; int var37; - if (var32 && var30) { - boolean var34 = false; - if (field1694) { - var34 = SecureRandomCallable.method1163(this, var6, var7, var8); + int var38; + int var39; + int var47; + int var53; + int var54; + int var55; + if (var31 && var30) { + boolean var33 = false; + if (field1704) { + boolean var34; + if (!GrandExchangeOfferOwnWorldComparator.method1376()) { + var34 = false; + } else { + int var42; + int var43; + int var44; + if (!ViewportMouse.ViewportMouse_false0) { + var36 = Scene.Scene_cameraPitchSine; + var37 = Scene.Scene_cameraPitchCosine; + var38 = Scene.Scene_cameraYawSine; + var39 = Scene.Scene_cameraYawCosine; + byte var40 = 50; + short var41 = 3500; + var42 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * var40 / Rasterizer3D.Rasterizer3D_zoom; + var43 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * var40 / Rasterizer3D.Rasterizer3D_zoom; + var44 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * var41 / Rasterizer3D.Rasterizer3D_zoom; + int var45 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * var41 / Rasterizer3D.Rasterizer3D_zoom; + int var46 = Rasterizer3D.method3145(var43, var40, var37, var36); + var54 = Rasterizer3D.method3122(var43, var40, var37, var36); + var43 = var46; + var46 = Rasterizer3D.method3145(var45, var41, var37, var36); + var55 = Rasterizer3D.method3122(var45, var41, var37, var36); + var45 = var46; + var46 = Rasterizer3D.method3148(var42, var54, var39, var38); + var54 = Rasterizer3D.method3144(var42, var54, var39, var38); + var42 = var46; + var46 = Rasterizer3D.method3148(var44, var55, var39, var38); + var55 = Rasterizer3D.method3144(var44, var55, var39, var38); + ViewportMouse.field1717 = (var42 + var46) / 2; + ViewportMouse.field1718 = (var43 + var45) / 2; + ArchiveDiskActionHandler.field3133 = (var55 + var54) / 2; + ViewportMouse.field1719 = (var46 - var42) / 2; + WorldMapID.field260 = (var45 - var43) / 2; + Interpreter.field1063 = (var55 - var54) / 2; + JagexCache.field2030 = Math.abs(ViewportMouse.field1719); + class83.field1146 = Math.abs(WorldMapID.field260); + ViewportMouse.field1720 = Math.abs(Interpreter.field1063); + } + + var36 = this.xMid + var6; + var37 = var7 + this.yMid; + var38 = var8 + this.zMid; + var39 = this.xMidOffset; + var54 = this.yMidOffset; + var55 = this.zMidOffset; + var42 = ViewportMouse.field1717 - var36; + var43 = ViewportMouse.field1718 - var37; + var44 = ArchiveDiskActionHandler.field3133 - var38; + if (Math.abs(var42) > var39 + JagexCache.field2030) { + var34 = false; + } else if (Math.abs(var43) > var54 + class83.field1146) { + var34 = false; + } else if (Math.abs(var44) > var55 + ViewportMouse.field1720) { + var34 = false; + } else if (Math.abs(var44 * WorldMapID.field260 - var43 * Interpreter.field1063) > var54 * ViewportMouse.field1720 + var55 * class83.field1146) { + var34 = false; + } else if (Math.abs(var42 * Interpreter.field1063 - var44 * ViewportMouse.field1719) > var39 * ViewportMouse.field1720 + var55 * JagexCache.field2030) { + var34 = false; + } else if (Math.abs(var43 * ViewportMouse.field1719 - var42 * WorldMapID.field260) > var39 * class83.field1146 + var54 * JagexCache.field2030) { + var34 = false; + } else { + var34 = true; + } + } + + var33 = var34; } else { - var35 = var12 - var13; - if (var35 <= 50) { - var35 = 50; + var53 = var12 - var13; + if (var53 <= 50) { + var53 = 50; } if (var15 > 0) { var16 /= var14; - var17 /= var35; + var17 /= var53; } else { var17 /= var14; - var16 /= var35; + var16 /= var53; } if (var18 > 0) { var22 /= var14; - var20 /= var35; + var20 /= var53; } else { var20 /= var14; - var22 /= var35; + var22 /= var53; } - var36 = var27 - Rasterizer3D.Rasterizer3D_clipMidX; - var37 = var28 - Rasterizer3D.Rasterizer3D_clipMidY; - if (var36 > var16 && var36 < var17 && var37 > var22 && var37 < var20) { - var34 = true; - } - } - - if (var34) { - if (this.isSingleTile) { - ViewportMouse.ViewportMouse_entityTags[++ViewportMouse.ViewportMouse_entityCount - 1] = var9; - } else { + var47 = var27 - Rasterizer3D.Rasterizer3D_clipMidX; + var36 = var28 - Rasterizer3D.Rasterizer3D_clipMidY; + if (var47 > var16 && var47 < var17 && var36 > var22 && var36 < var20) { var33 = true; } } + + if (var33) { + if (this.isSingleTile) { + ViewportMouse.ViewportMouse_entityTags[++ViewportMouse.ViewportMouse_entityCount - 1] = var9; + } else { + var32 = true; + } + } } - int var47 = Rasterizer3D.Rasterizer3D_clipMidX; - var35 = Rasterizer3D.Rasterizer3D_clipMidY; + int var52 = Rasterizer3D.Rasterizer3D_clipMidX; + var53 = Rasterizer3D.Rasterizer3D_clipMidY; + var47 = 0; var36 = 0; - var37 = 0; if (var1 != 0) { - var36 = Model_sine[var1]; - var37 = Model_cosine[var1]; + var47 = Model_sine[var1]; + var36 = Model_cosine[var1]; } - for (int var38 = 0; var38 < this.verticesCount; ++var38) { - int var39 = this.verticesX[var38]; - int var40 = this.verticesY[var38]; - int var41 = this.verticesZ[var38]; - int var42; + for (var37 = 0; var37 < this.verticesCount; ++var37) { + var38 = this.verticesX[var37]; + var39 = this.verticesY[var37]; + var54 = this.verticesZ[var37]; if (var1 != 0) { - var42 = var41 * var36 + var39 * var37 >> 16; - var41 = var41 * var37 - var39 * var36 >> 16; - var39 = var42; + var55 = var54 * var47 + var38 * var36 >> 16; + var54 = var54 * var36 - var38 * var47 >> 16; + var38 = var55; } - var39 += var6; - var40 += var7; - var41 += var8; - var42 = var41 * var4 + var5 * var39 >> 16; - var41 = var5 * var41 - var39 * var4 >> 16; - var39 = var42; - var42 = var3 * var40 - var41 * var2 >> 16; - var41 = var40 * var2 + var3 * var41 >> 16; - field1656[var38] = var41 - var12; - if (var41 >= 50) { - modelViewportXs[var38] = var39 * Rasterizer3D.Rasterizer3D_zoom / var41 + var47; - modelViewportYs[var38] = var42 * Rasterizer3D.Rasterizer3D_zoom / var41 + var35; + var38 += var6; + var39 += var7; + var54 += var8; + var55 = var54 * var4 + var5 * var38 >> 16; + var54 = var5 * var54 - var38 * var4 >> 16; + var38 = var55; + var55 = var3 * var39 - var54 * var2 >> 16; + var54 = var39 * var2 + var3 * var54 >> 16; + field1686[var37] = var54 - var12; + if (var54 >= 50) { + modelViewportXs[var37] = var38 * Rasterizer3D.Rasterizer3D_zoom / var54 + var52; + modelViewportYs[var37] = var55 * Rasterizer3D.Rasterizer3D_zoom / var54 + var53; } else { - modelViewportXs[var38] = -5000; + modelViewportXs[var37] = -5000; var24 = true; } if (var26) { - field1677[var38] = var39; - field1652[var38] = var42; - field1679[var38] = var41; + field1674[var37] = var38; + field1702[var37] = var55; + field1689[var37] = var54; } } try { - this.draw0(var24, var33, this.isSingleTile, var9); - } catch (Exception var46) { + this.draw0(var24, var32, this.isSingleTile, var9); + } catch (Exception var51) { } } diff --git a/runescape-client/src/main/java/ModelData.java b/runescape-client/src/main/java/ModelData.java index 4b45a6561b..0b90e31efd 100644 --- a/runescape-client/src/main/java/ModelData.java +++ b/runescape-client/src/main/java/ModelData.java @@ -3,134 +3,134 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dw") +@ObfuscatedName("du") @Implements("ModelData") public class ModelData extends Entity { - @ObfuscatedName("ao") - static int[] field1548; + @ObfuscatedName("ab") + static int[] field1557; + @ObfuscatedName("ax") + static int[] field1558; @ObfuscatedName("al") - static int[] field1549; - @ObfuscatedName("ad") - static int field1550; - @ObfuscatedName("an") + static int field1522; + @ObfuscatedName("ap") @Export("ModelData_sine") static int[] ModelData_sine; - @ObfuscatedName("ai") + @ObfuscatedName("aj") @Export("ModelData_cosine") static int[] ModelData_cosine; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("verticesCount") int verticesCount; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("verticesX") int[] verticesX; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("verticesY") int[] verticesY; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("verticesZ") int[] verticesZ; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("faceCount") int faceCount; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("indices1") int[] indices1; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("indices2") int[] indices2; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("indices3") int[] indices3; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("faceRenderTypes") byte[] faceRenderTypes; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("faceRenderPriorities") byte[] faceRenderPriorities; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("faceAlphas") byte[] faceAlphas; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("textureCoords") byte[] textureCoords; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("faceColors") short[] faceColors; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("faceTextures") short[] faceTextures; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("priority") byte priority; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("textureTriangleCount") int textureTriangleCount; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("textureRenderTypes") byte[] textureRenderTypes; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("texTriangleX") short[] texTriangleX; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("texTriangleY") short[] texTriangleY; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("texTriangleZ") short[] texTriangleZ; - @ObfuscatedName("s") + @ObfuscatedName("z") @Export("vertexSkins") int[] vertexSkins; @ObfuscatedName("f") @Export("faceSkins") int[] faceSkins; - @ObfuscatedName("j") + @ObfuscatedName("g") @Export("vertexLabels") int[][] vertexLabels; - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("faceLabelsAlpha") int[][] faceLabelsAlpha; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "[Lee;" + signature = "[Leq;" ) @Export("faceNormals") FaceNormal[] faceNormals; - @ObfuscatedName("k") + @ObfuscatedName("y") @ObfuscatedSignature( - signature = "[Ldp;" + signature = "[Lde;" ) @Export("vertexNormals") VertexNormal[] vertexNormals; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @ObfuscatedSignature( - signature = "[Ldp;" + signature = "[Lde;" ) - VertexNormal[] field1545; - @ObfuscatedName("az") + VertexNormal[] field1524; + @ObfuscatedName("aw") @Export("ambient") public short ambient; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("contrast") public short contrast; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @Export("isBoundsCalculated") boolean isBoundsCalculated; - @ObfuscatedName("ap") - int field1543; - @ObfuscatedName("ar") - int field1544; - @ObfuscatedName("ab") - int field1513; - @ObfuscatedName("ax") - int field1546; - @ObfuscatedName("as") - int field1551; + @ObfuscatedName("ad") + int field1545; + @ObfuscatedName("ag") + int field1553; + @ObfuscatedName("ak") + int field1554; + @ObfuscatedName("av") + int field1555; + @ObfuscatedName("am") + int field1556; static { - field1548 = new int[10000]; - field1549 = new int[10000]; - field1550 = 0; + field1557 = new int[10000]; + field1558 = new int[10000]; + field1522 = 0; ModelData_sine = Rasterizer3D.Rasterizer3D_sine; ModelData_cosine = Rasterizer3D.Rasterizer3D_cosine; } @@ -143,7 +143,7 @@ public class ModelData extends Entity { } @ObfuscatedSignature( - signature = "([Ldw;I)V" + signature = "([Ldu;I)V" ) public ModelData(ModelData[] var1, int var2) { this.verticesCount = 0; @@ -274,18 +274,18 @@ public class ModelData extends Entity { } this.faceColors[this.faceCount] = var10.faceColors[var11]; - this.indices1[this.faceCount] = this.method2763(var10, var10.indices1[var11]); - this.indices2[this.faceCount] = this.method2763(var10, var10.indices2[var11]); - this.indices3[this.faceCount] = this.method2763(var10, var10.indices3[var11]); + this.indices1[this.faceCount] = this.method2944(var10, var10.indices1[var11]); + this.indices2[this.faceCount] = this.method2944(var10, var10.indices2[var11]); + this.indices3[this.faceCount] = this.method2944(var10, var10.indices3[var11]); ++this.faceCount; } for (var11 = 0; var11 < var10.textureTriangleCount; ++var11) { byte var12 = this.textureRenderTypes[this.textureTriangleCount] = var10.textureRenderTypes[var11]; if (var12 == 0) { - this.texTriangleX[this.textureTriangleCount] = (short)this.method2763(var10, var10.texTriangleX[var11]); - this.texTriangleY[this.textureTriangleCount] = (short)this.method2763(var10, var10.texTriangleY[var11]); - this.texTriangleZ[this.textureTriangleCount] = (short)this.method2763(var10, var10.texTriangleZ[var11]); + this.texTriangleX[this.textureTriangleCount] = (short)this.method2944(var10, var10.texTriangleX[var11]); + this.texTriangleY[this.textureTriangleCount] = (short)this.method2944(var10, var10.texTriangleY[var11]); + this.texTriangleZ[this.textureTriangleCount] = (short)this.method2944(var10, var10.texTriangleZ[var11]); } ++this.textureTriangleCount; @@ -301,15 +301,15 @@ public class ModelData extends Entity { this.priority = 0; this.isBoundsCalculated = false; if (var1[var1.length - 1] == -1 && var1[var1.length - 2] == -1) { - this.method2820(var1); + this.method2938(var1); } else { - this.method2762(var1); + this.method2954(var1); } } @ObfuscatedSignature( - signature = "(Ldw;ZZZZ)V", + signature = "(Ldu;ZZZZ)V", garbageValue = "1" ) public ModelData(ModelData var1, boolean var2, boolean var3, boolean var4, boolean var5) { @@ -375,13 +375,13 @@ public class ModelData extends Entity { this.faceLabelsAlpha = var1.faceLabelsAlpha; this.vertexNormals = var1.vertexNormals; this.faceNormals = var1.faceNormals; - this.field1545 = var1.field1545; + this.field1524 = var1.field1524; this.ambient = var1.ambient; this.contrast = var1.contrast; } - @ObfuscatedName("n") - void method2820(byte[] var1) { + @ObfuscatedName("t") + void method2938(byte[] var1) { Buffer var2 = new Buffer(var1); Buffer var3 = new Buffer(var1); Buffer var4 = new Buffer(var1); @@ -686,8 +686,8 @@ public class ModelData extends Entity { } - @ObfuscatedName("v") - void method2762(byte[] var1) { + @ObfuscatedName("n") + void method2954(byte[] var1) { boolean var2 = false; boolean var3 = false; Buffer var4 = new Buffer(var1); @@ -963,11 +963,11 @@ public class ModelData extends Entity { } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Ldw;I)I" + signature = "(Ldu;I)I" ) - final int method2763(ModelData var1, int var2) { + final int method2944(ModelData var1, int var2) { int var3 = -1; int var4 = var1.verticesX[var2]; int var5 = var1.verticesY[var2]; @@ -994,11 +994,11 @@ public class ModelData extends Entity { return var3; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "()Ldw;" + signature = "()Ldu;" ) - public ModelData method2764() { + public ModelData method2942() { ModelData var1 = new ModelData(); if (this.faceRenderTypes != null) { var1.faceRenderTypes = new byte[this.faceCount]; @@ -1038,16 +1038,16 @@ public class ModelData extends Entity { return var1; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "([[IIIIZI)Ldw;" + signature = "([[IIIIZI)Ldu;" ) - public ModelData method2765(int[][] var1, int var2, int var3, int var4, boolean var5, int var6) { + public ModelData method2943(int[][] var1, int var2, int var3, int var4, boolean var5, int var6) { this.calculateBounds(); - int var7 = var2 + this.field1544; - int var8 = var2 + this.field1513; - int var9 = var4 + this.field1551; - int var10 = var4 + this.field1546; + int var7 = var2 + this.field1553; + int var8 = var2 + this.field1554; + int var9 = var4 + this.field1556; + int var10 = var4 + this.field1555; if (var7 >= 0 && var8 + 128 >> 7 < var1.length && var9 >= 0 && var10 + 128 >> 7 < var1[0].length) { var7 >>= 7; var8 = var8 + 127 >> 7; @@ -1132,8 +1132,8 @@ public class ModelData extends Entity { } } - @ObfuscatedName("q") - void method2766() { + @ObfuscatedName("c") + void method2939() { int[] var1; int var2; int var10002; @@ -1193,8 +1193,8 @@ public class ModelData extends Entity { } - @ObfuscatedName("m") - public void method2835() { + @ObfuscatedName("o") + public void method2940() { for (int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesX[var1]; this.verticesX[var1] = this.verticesZ[var1]; @@ -1204,8 +1204,8 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("i") - public void method2761() { + @ObfuscatedName("d") + public void method2946() { for (int var1 = 0; var1 < this.verticesCount; ++var1) { this.verticesX[var1] = -this.verticesX[var1]; this.verticesZ[var1] = -this.verticesZ[var1]; @@ -1214,8 +1214,8 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("c") - public void method2800() { + @ObfuscatedName("m") + public void method2947() { for (int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesZ[var1]; this.verticesZ[var1] = this.verticesX[var1]; @@ -1225,8 +1225,8 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("b") - public void method2767(int var1) { + @ObfuscatedName("p") + public void method2948(int var1) { int var2 = ModelData_sine[var1]; int var3 = ModelData_cosine[var1]; @@ -1239,7 +1239,7 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("changeOffset") public void changeOffset(int var1, int var2, int var3) { for (int var4 = 0; var4 < this.verticesCount; ++var4) { @@ -1254,7 +1254,7 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("recolor") public void recolor(short var1, short var2) { for (int var3 = 0; var3 < this.faceCount; ++var3) { @@ -1265,7 +1265,7 @@ public class ModelData extends Entity { } - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("retexture") public void retexture(short var1, short var2) { if (this.faceTextures != null) { @@ -1278,8 +1278,8 @@ public class ModelData extends Entity { } } - @ObfuscatedName("x") - public void method2774() { + @ObfuscatedName("j") + public void method2951() { int var1; for (var1 = 0; var1 < this.verticesCount; ++var1) { this.verticesZ[var1] = -this.verticesZ[var1]; @@ -1294,7 +1294,7 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("h") + @ObfuscatedName("r") @Export("resize") public void resize(int var1, int var2, int var3) { for (int var4 = 0; var4 < this.verticesCount; ++var4) { @@ -1306,7 +1306,7 @@ public class ModelData extends Entity { this.invalidate(); } - @ObfuscatedName("s") + @ObfuscatedName("e") @Export("calculateVertexNormals") public void calculateVertexNormals() { if (this.vertexNormals == null) { @@ -1382,52 +1382,52 @@ public class ModelData extends Entity { } } - @ObfuscatedName("f") + @ObfuscatedName("s") @Export("invalidate") void invalidate() { this.vertexNormals = null; - this.field1545 = null; + this.field1524 = null; this.faceNormals = null; this.isBoundsCalculated = false; } - @ObfuscatedName("j") + @ObfuscatedName("b") @Export("calculateBounds") void calculateBounds() { if (!this.isBoundsCalculated) { super.height = 0; - this.field1543 = 0; - this.field1544 = 999999; - this.field1513 = -999999; - this.field1546 = -99999; - this.field1551 = 99999; + this.field1545 = 0; + this.field1553 = 999999; + this.field1554 = -999999; + this.field1555 = -99999; + this.field1556 = 99999; for (int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesX[var1]; int var3 = this.verticesY[var1]; int var4 = this.verticesZ[var1]; - if (var2 < this.field1544) { - this.field1544 = var2; + if (var2 < this.field1553) { + this.field1553 = var2; } - if (var2 > this.field1513) { - this.field1513 = var2; + if (var2 > this.field1554) { + this.field1554 = var2; } - if (var4 < this.field1551) { - this.field1551 = var4; + if (var4 < this.field1556) { + this.field1556 = var4; } - if (var4 > this.field1546) { - this.field1546 = var4; + if (var4 > this.field1555) { + this.field1555 = var4; } if (-var3 > super.height) { super.height = -var3; } - if (var3 > this.field1543) { - this.field1543 = var3; + if (var3 > this.field1545) { + this.field1545 = var3; } } @@ -1435,9 +1435,9 @@ public class ModelData extends Entity { } } - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "(IIIII)Ldh;" + signature = "(IIIII)Ldv;" ) @Export("toModel") public final Model toModel(int var1, int var2, int var3, int var4, int var5) { @@ -1458,38 +1458,38 @@ public class ModelData extends Entity { } } - var8.field1685 = 0; + var8.field1663 = 0; for (var10 = 0; var10 < this.textureTriangleCount; ++var10) { if (var9[var10] > 0 && this.textureRenderTypes[var10] == 0) { - ++var8.field1685; + ++var8.field1663; } } - var8.field1654 = new int[var8.field1685]; - var8.field1655 = new int[var8.field1685]; - var8.field1653 = new int[var8.field1685]; + var8.field1664 = new int[var8.field1663]; + var8.field1665 = new int[var8.field1663]; + var8.field1666 = new int[var8.field1663]; var10 = 0; int var11; for (var11 = 0; var11 < this.textureTriangleCount; ++var11) { if (var9[var11] > 0 && this.textureRenderTypes[var11] == 0) { - var8.field1654[var10] = this.texTriangleX[var11] & '\uffff'; - var8.field1655[var10] = this.texTriangleY[var11] & '\uffff'; - var8.field1653[var10] = this.texTriangleZ[var11] & '\uffff'; + var8.field1664[var10] = this.texTriangleX[var11] & '\uffff'; + var8.field1665[var10] = this.texTriangleY[var11] & '\uffff'; + var8.field1666[var10] = this.texTriangleZ[var11] & '\uffff'; var9[var11] = var10++; } else { var9[var11] = -1; } } - var8.field1639 = new byte[this.faceCount]; + var8.field1644 = new byte[this.faceCount]; for (var11 = 0; var11 < this.faceCount; ++var11) { if (this.textureCoords[var11] != -1) { - var8.field1639[var11] = (byte)var9[this.textureCoords[var11] & 255]; + var8.field1644[var11] = (byte)var9[this.textureCoords[var11] & 255]; } else { - var8.field1639[var11] = -1; + var8.field1644[var11] = -1; } } } @@ -1532,7 +1532,7 @@ public class ModelData extends Entity { if (var17 == 1) { var19 = this.faceNormals[var16]; var14 = (var4 * var19.y + var5 * var19.z + var3 * var19.x) / (var7 / 2 + var7) + var1; - var8.faceColors1[var16] = method2781(this.faceColors[var16] & '\uffff', var14); + var8.faceColors1[var16] = method2996(this.faceColors[var16] & '\uffff', var14); var8.faceColors3[var16] = -1; } else if (var17 == 3) { var8.faceColors1[var16] = 128; @@ -1542,69 +1542,69 @@ public class ModelData extends Entity { } } else { int var15 = this.faceColors[var16] & '\uffff'; - if (this.field1545 != null && this.field1545[this.indices1[var16]] != null) { - var13 = this.field1545[this.indices1[var16]]; + if (this.field1524 != null && this.field1524[this.indices1[var16]] != null) { + var13 = this.field1524[this.indices1[var16]]; } else { var13 = this.vertexNormals[this.indices1[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; - var8.faceColors1[var16] = method2781(var15, var14); - if (this.field1545 != null && this.field1545[this.indices2[var16]] != null) { - var13 = this.field1545[this.indices2[var16]]; + var8.faceColors1[var16] = method2996(var15, var14); + if (this.field1524 != null && this.field1524[this.indices2[var16]] != null) { + var13 = this.field1524[this.indices2[var16]]; } else { var13 = this.vertexNormals[this.indices2[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; - var8.faceColors2[var16] = method2781(var15, var14); - if (this.field1545 != null && this.field1545[this.indices3[var16]] != null) { - var13 = this.field1545[this.indices3[var16]]; + var8.faceColors2[var16] = method2996(var15, var14); + if (this.field1524 != null && this.field1524[this.indices3[var16]] != null) { + var13 = this.field1524[this.indices3[var16]]; } else { var13 = this.vertexNormals[this.indices3[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; - var8.faceColors3[var16] = method2781(var15, var14); + var8.faceColors3[var16] = method2996(var15, var14); } } else if (var17 != 0) { if (var17 == 1) { var19 = this.faceNormals[var16]; var14 = (var4 * var19.y + var5 * var19.z + var3 * var19.x) / (var7 / 2 + var7) + var1; - var8.faceColors1[var16] = method2771(var14); + var8.faceColors1[var16] = method2985(var14); var8.faceColors3[var16] = -1; } else { var8.faceColors3[var16] = -2; } } else { - if (this.field1545 != null && this.field1545[this.indices1[var16]] != null) { - var13 = this.field1545[this.indices1[var16]]; + if (this.field1524 != null && this.field1524[this.indices1[var16]] != null) { + var13 = this.field1524[this.indices1[var16]]; } else { var13 = this.vertexNormals[this.indices1[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; - var8.faceColors1[var16] = method2771(var14); - if (this.field1545 != null && this.field1545[this.indices2[var16]] != null) { - var13 = this.field1545[this.indices2[var16]]; + var8.faceColors1[var16] = method2985(var14); + if (this.field1524 != null && this.field1524[this.indices2[var16]] != null) { + var13 = this.field1524[this.indices2[var16]]; } else { var13 = this.vertexNormals[this.indices2[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; - var8.faceColors2[var16] = method2771(var14); - if (this.field1545 != null && this.field1545[this.indices3[var16]] != null) { - var13 = this.field1545[this.indices3[var16]]; + var8.faceColors2[var16] = method2985(var14); + if (this.field1524 != null && this.field1524[this.indices3[var16]] != null) { + var13 = this.field1524[this.indices3[var16]]; } else { var13 = this.vertexNormals[this.indices3[var16]]; } var14 = (var4 * var13.y + var5 * var13.z + var3 * var13.x) / (var7 * var13.magnitude) + var1; - var8.faceColors3[var16] = method2771(var14); + var8.faceColors3[var16] = method2985(var14); } } - this.method2766(); + this.method2939(); var8.verticesCount = this.verticesCount; var8.verticesX = this.verticesX; var8.verticesY = this.verticesY; @@ -1615,16 +1615,16 @@ public class ModelData extends Entity { var8.indices3 = this.indices3; var8.faceRenderPriorities = this.faceRenderPriorities; var8.faceAlphas = this.faceAlphas; - var8.field1634 = this.priority; + var8.field1662 = this.priority; var8.vertexLabels = this.vertexLabels; var8.faceLabelsAlpha = this.faceLabelsAlpha; var8.faceTextures = this.faceTextures; return var8; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;II)Ldw;" + signature = "(Lhq;II)Ldu;" ) @Export("ModelData_get") public static ModelData ModelData_get(AbstractArchive var0, int var1, int var2) { @@ -1632,16 +1632,16 @@ public class ModelData extends Entity { return var3 == null ? null : new ModelData(var3); } - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(Ldw;Ldw;IIIZ)V" + signature = "(Ldu;Ldu;IIIZ)V" ) - static void method2779(ModelData var0, ModelData var1, int var2, int var3, int var4, boolean var5) { + static void method2956(ModelData var0, ModelData var1, int var2, int var3, int var4, boolean var5) { var0.calculateBounds(); var0.calculateVertexNormals(); var1.calculateBounds(); var1.calculateVertexNormals(); - ++field1550; + ++field1522; int var6 = 0; int[] var7 = var1.verticesX; int var8 = var1.verticesCount; @@ -1651,30 +1651,30 @@ public class ModelData extends Entity { VertexNormal var10 = var0.vertexNormals[var9]; if (var10.magnitude != 0) { int var11 = var0.verticesY[var9] - var3; - if (var11 <= var1.field1543) { + if (var11 <= var1.field1545) { int var12 = var0.verticesX[var9] - var2; - if (var12 >= var1.field1544 && var12 <= var1.field1513) { + if (var12 >= var1.field1553 && var12 <= var1.field1554) { int var13 = var0.verticesZ[var9] - var4; - if (var13 >= var1.field1551 && var13 <= var1.field1546) { + if (var13 >= var1.field1556 && var13 <= var1.field1555) { for (int var14 = 0; var14 < var8; ++var14) { VertexNormal var15 = var1.vertexNormals[var14]; if (var12 == var7[var14] && var13 == var1.verticesZ[var14] && var11 == var1.verticesY[var14] && var15.magnitude != 0) { - if (var0.field1545 == null) { - var0.field1545 = new VertexNormal[var0.verticesCount]; + if (var0.field1524 == null) { + var0.field1524 = new VertexNormal[var0.verticesCount]; } - if (var1.field1545 == null) { - var1.field1545 = new VertexNormal[var8]; + if (var1.field1524 == null) { + var1.field1524 = new VertexNormal[var8]; } - VertexNormal var16 = var0.field1545[var9]; + VertexNormal var16 = var0.field1524[var9]; if (var16 == null) { - var16 = var0.field1545[var9] = new VertexNormal(var10); + var16 = var0.field1524[var9] = new VertexNormal(var10); } - VertexNormal var17 = var1.field1545[var14]; + VertexNormal var17 = var1.field1524[var14]; if (var17 == null) { - var17 = var1.field1545[var14] = new VertexNormal(var15); + var17 = var1.field1524[var14] = new VertexNormal(var15); } var16.x += var15.x; @@ -1686,8 +1686,8 @@ public class ModelData extends Entity { var17.z += var10.z; var17.magnitude += var10.magnitude; ++var6; - field1548[var9] = field1550; - field1549[var14] = field1550; + field1557[var9] = field1522; + field1558[var14] = field1522; } } } @@ -1698,7 +1698,7 @@ public class ModelData extends Entity { if (var6 >= 3 && var5) { for (var9 = 0; var9 < var0.faceCount; ++var9) { - if (field1548[var0.indices1[var9]] == field1550 && field1548[var0.indices2[var9]] == field1550 && field1548[var0.indices3[var9]] == field1550) { + if (field1557[var0.indices1[var9]] == field1522 && field1557[var0.indices2[var9]] == field1522 && field1557[var0.indices3[var9]] == field1522) { if (var0.faceRenderTypes == null) { var0.faceRenderTypes = new byte[var0.faceCount]; } @@ -1708,7 +1708,7 @@ public class ModelData extends Entity { } for (var9 = 0; var9 < var1.faceCount; ++var9) { - if (field1550 == field1549[var1.indices1[var9]] && field1550 == field1549[var1.indices2[var9]] && field1550 == field1549[var1.indices3[var9]]) { + if (field1522 == field1558[var1.indices1[var9]] && field1522 == field1558[var1.indices2[var9]] && field1522 == field1558[var1.indices3[var9]]) { if (var1.faceRenderTypes == null) { var1.faceRenderTypes = new byte[var1.faceCount]; } @@ -1720,8 +1720,8 @@ public class ModelData extends Entity { } } - @ObfuscatedName("k") - static final int method2781(int var0, int var1) { + @ObfuscatedName("ad") + static final int method2996(int var0, int var1) { var1 = (var0 & 127) * var1 >> 7; if (var1 < 2) { var1 = 2; @@ -1732,8 +1732,8 @@ public class ModelData extends Entity { return (var0 & 65408) + var1; } - @ObfuscatedName("ac") - static final int method2771(int var0) { + @ObfuscatedName("ag") + static final int method2985(int var0) { if (var0 < 2) { var0 = 2; } else if (var0 > 126) { diff --git a/runescape-client/src/main/java/ModelData0.java b/runescape-client/src/main/java/ModelData0.java index 592c3f6910..3ca5ef0604 100644 --- a/runescape-client/src/main/java/ModelData0.java +++ b/runescape-client/src/main/java/ModelData0.java @@ -1,56 +1,266 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("eq") +@ObfuscatedName("ef") @Implements("ModelData0") public class ModelData0 { - @ObfuscatedName("ha") - @ObfuscatedGetter( - intValue = -1351160427 + @ObfuscatedName("fl") + @ObfuscatedSignature( + signature = "Lko;" ) - static int field1840; + @Export("WorldMapElement_fonts") + static Fonts WorldMapElement_fonts; ModelData0() { } - @ObfuscatedName("u") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "1264128253" + signature = "(III)Z", + garbageValue = "1770861677" ) - public static boolean method3215(int var0) { - return (var0 >> 28 & 1) != 0; + public static boolean method3379(int var0, int var1) { + return (var0 >> var1 + 1 & 1) != 0; } - @ObfuscatedName("m") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(B)Lbo;", - garbageValue = "0" + signature = "(IIIZIZI)V", + garbageValue = "1985291940" ) - @Export("worldListStart") - static World worldListStart() { - World.World_listCount = 0; - return AbstractByteArrayCopier.getNextWorldListWorld(); + @Export("doWorldSorting") + static void doWorldSorting(int var0, int var1, int var2, boolean var3, int var4, boolean var5) { + if (var0 < var1) { + int var6 = (var0 + var1) / 2; + int var7 = var0; + World var8 = Username.World_worlds[var6]; + Username.World_worlds[var6] = Username.World_worlds[var1]; + Username.World_worlds[var1] = var8; + + for (int var9 = var0; var9 < var1; ++var9) { + World var11 = Username.World_worlds[var9]; + int var12 = ScriptFrame.compareWorlds(var11, var8, var2, var3); + int var10; + if (var12 != 0) { + if (var3) { + var10 = -var12; + } else { + var10 = var12; + } + } else if (var4 == -1) { + var10 = 0; + } else { + int var13 = ScriptFrame.compareWorlds(var11, var8, var4, var5); + if (var5) { + var10 = -var13; + } else { + var10 = var13; + } + } + + if (var10 <= 0) { + World var14 = Username.World_worlds[var9]; + Username.World_worlds[var9] = Username.World_worlds[var7]; + Username.World_worlds[var7++] = var14; + } + } + + Username.World_worlds[var1] = Username.World_worlds[var7]; + Username.World_worlds[var7] = var8; + doWorldSorting(var0, var7 - 1, var2, var3, var4, var5); + doWorldSorting(var7 + 1, var1, var2, var3, var4, var5); + } + } - @ObfuscatedName("hn") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1738289394" + signature = "(I)V", + garbageValue = "1344492505" ) - @Export("clickMenuIndex") - static final void clickMenuIndex(int var0) { - if (var0 >= 0) { - int var1 = Client.menuArguments1[var0]; - int var2 = Client.menuArguments2[var0]; - int var3 = Client.menuOpcodes[var0]; - int var4 = Client.menuIdentifiers[var0]; - String var5 = Client.menuActions[var0]; - String var6 = Client.menuTargets[var0]; - InvDefinition.menuAction(var1, var2, var3, var4, var5, var6, MouseHandler.MouseHandler_lastPressedX, MouseHandler.MouseHandler_lastPressedY); + static final void method3380() { + Object var10000 = null; + String var0 = "Your ignore list is full. Max of 100 for free users, and 400 for members"; + class30.addGameMessage(30, "", var0); + } + + @ObfuscatedName("gx") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "-39" + ) + static final void method3378() { + if (Ignored.ClanChat_inClanChat) { + if (class4.clanChat != null) { + class4.clanChat.sort(); + } + + WorldMapSectionType.method294(); + Ignored.ClanChat_inClanChat = false; + } + + } + + @ObfuscatedName("gm") + @ObfuscatedSignature( + signature = "(Lbz;I)V", + garbageValue = "-1736230875" + ) + static final void method3377(Actor var0) { + var0.movementSequence = var0.readySequence; + if (var0.pathLength == 0) { + var0.field982 = 0; + } else { + if (var0.sequence != -1 && var0.sequenceDelay == 0) { + SequenceDefinition var1 = PlayerType.SequenceDefinition_get(var0.sequence); + if (var0.field983 > 0 && var1.field3504 == 0) { + ++var0.field982; + return; + } + + if (var0.field983 <= 0 && var1.field3513 == 0) { + ++var0.field982; + return; + } + } + + int var10 = var0.x; + int var2 = var0.y; + int var3 = var0.pathX[var0.pathLength - 1] * 128 + var0.field927 * 64; + int var4 = var0.pathY[var0.pathLength - 1] * 128 + var0.field927 * 64; + if (var10 < var3) { + if (var2 < var4) { + var0.orientation = 1280; + } else if (var2 > var4) { + var0.orientation = 1792; + } else { + var0.orientation = 1536; + } + } else if (var10 > var3) { + if (var2 < var4) { + var0.orientation = 768; + } else if (var2 > var4) { + var0.orientation = 256; + } else { + var0.orientation = 512; + } + } else if (var2 < var4) { + var0.orientation = 1024; + } else if (var2 > var4) { + var0.orientation = 0; + } + + byte var5 = var0.pathTraversed[var0.pathLength - 1]; + if (var3 - var10 <= 256 && var3 - var10 >= -256 && var4 - var2 <= 256 && var4 - var2 >= -256) { + int var6 = var0.orientation - var0.rotation & 2047; + if (var6 > 1024) { + var6 -= 2048; + } + + int var7 = var0.walkBackSequence; + if (var6 >= -256 && var6 <= 256) { + var7 = var0.walkSequence; + } else if (var6 >= 256 && var6 < 768) { + var7 = var0.walkRightSequence; + } else if (var6 >= -768 && var6 <= -256) { + var7 = var0.walkLeftSequence; + } + + if (var7 == -1) { + var7 = var0.walkSequence; + } + + var0.movementSequence = var7; + int var8 = 4; + boolean var9 = true; + if (var0 instanceof NPC) { + var9 = ((NPC)var0).definition.isClickable; + } + + if (var9) { + if (var0.orientation != var0.rotation && var0.targetIndex == -1 && var0.field977 != 0) { + var8 = 2; + } + + if (var0.pathLength > 2) { + var8 = 6; + } + + if (var0.pathLength > 3) { + var8 = 8; + } + + if (var0.field982 > 0 && var0.pathLength > 1) { + var8 = 8; + --var0.field982; + } + } else { + if (var0.pathLength > 1) { + var8 = 6; + } + + if (var0.pathLength > 2) { + var8 = 8; + } + + if (var0.field982 > 0 && var0.pathLength > 1) { + var8 = 8; + --var0.field982; + } + } + + if (var5 == 2) { + var8 <<= 1; + } + + if (var8 >= 8 && var0.movementSequence == var0.walkSequence && var0.runSequence != -1) { + var0.movementSequence = var0.runSequence; + } + + if (var10 != var3 || var4 != var2) { + if (var10 < var3) { + var0.x += var8; + if (var0.x > var3) { + var0.x = var3; + } + } else if (var10 > var3) { + var0.x -= var8; + if (var0.x < var3) { + var0.x = var3; + } + } + + if (var2 < var4) { + var0.y += var8; + if (var0.y > var4) { + var0.y = var4; + } + } else if (var2 > var4) { + var0.y -= var8; + if (var0.y < var4) { + var0.y = var4; + } + } + } + + if (var3 == var0.x && var4 == var0.y) { + --var0.pathLength; + if (var0.field983 > 0) { + --var0.field983; + } + } + + } else { + var0.x = var3; + var0.y = var4; + --var0.pathLength; + if (var0.field983 > 0) { + --var0.field983; + } + + } } } } diff --git a/runescape-client/src/main/java/MouseHandler.java b/runescape-client/src/main/java/MouseHandler.java index e69852f024..8d8c1c4003 100644 --- a/runescape-client/src/main/java/MouseHandler.java +++ b/runescape-client/src/main/java/MouseHandler.java @@ -8,121 +8,130 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bd") +@ObfuscatedName("bc") @Implements("MouseHandler") public class MouseHandler implements MouseListener, MouseMotionListener, FocusListener { - @ObfuscatedName("u") + @ObfuscatedName("sz") + @ObfuscatedGetter( + intValue = 1607868689 + ) + @Export("foundItemIdCount") + static int foundItemIdCount; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lbd;" + signature = "Lbc;" ) @Export("MouseHandler_instance") - static MouseHandler MouseHandler_instance; - @ObfuscatedName("r") + public static MouseHandler MouseHandler_instance; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1294175143 + intValue = -1338190935 ) @Export("MouseHandler_idleCycles") public static volatile int MouseHandler_idleCycles; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -528827615 + intValue = 252420693 ) @Export("MouseHandler_currentButtonVolatile") - static volatile int MouseHandler_currentButtonVolatile; - @ObfuscatedName("q") - @ObfuscatedGetter( - intValue = 965678779 - ) - @Export("MouseHandler_xVolatile") - static volatile int MouseHandler_xVolatile; - @ObfuscatedName("m") - @ObfuscatedGetter( - intValue = 1390089149 - ) - @Export("MouseHandler_yVolatile") - static volatile int MouseHandler_yVolatile; - @ObfuscatedName("y") - @ObfuscatedGetter( - longValue = -6736454451996007549L - ) - @Export("MouseHandler_millis") - public static long MouseHandler_millis; - @ObfuscatedName("i") - @ObfuscatedGetter( - longValue = -1086707197767215489L - ) - @Export("MouseHandler_lastMovedVolatile") - static volatile long MouseHandler_lastMovedVolatile; + public static volatile int MouseHandler_currentButtonVolatile; @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1174248655 + intValue = -1728347419 + ) + @Export("MouseHandler_xVolatile") + public static volatile int MouseHandler_xVolatile; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 890239403 + ) + @Export("MouseHandler_yVolatile") + public static volatile int MouseHandler_yVolatile; + @ObfuscatedName("i") + @ObfuscatedGetter( + longValue = 3750789225615290729L + ) + @Export("MouseHandler_lastMovedVolatile") + public static volatile long MouseHandler_lastMovedVolatile; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = -1269401967 ) @Export("MouseHandler_currentButton") public static int MouseHandler_currentButton; - @ObfuscatedName("b") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -180428827 + intValue = 811280401 ) @Export("MouseHandler_x") public static int MouseHandler_x; - @ObfuscatedName("o") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 97221829 + intValue = 1526824115 ) @Export("MouseHandler_y") public static int MouseHandler_y; - @ObfuscatedName("a") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -1906360683 + longValue = -8173787367368651405L + ) + @Export("MouseHandler_millis") + public static long MouseHandler_millis; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = -2004292417 ) @Export("MouseHandler_lastButtonVolatile") - static volatile int MouseHandler_lastButtonVolatile; - @ObfuscatedName("e") + public static volatile int MouseHandler_lastButtonVolatile; + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = -1404319225 + intValue = 587328271 ) @Export("MouseHandler_lastPressedXVolatile") - static volatile int MouseHandler_lastPressedXVolatile; - @ObfuscatedName("w") + public static volatile int MouseHandler_lastPressedXVolatile; + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 955503415 + intValue = -1352074073 ) @Export("MouseHandler_lastPressedYVolatile") - static volatile int MouseHandler_lastPressedYVolatile; - @ObfuscatedName("t") + public static volatile int MouseHandler_lastPressedYVolatile; + @ObfuscatedName("r") @ObfuscatedGetter( - longValue = -1390704279211599925L + longValue = -4279926973257874399L ) @Export("MouseHandler_lastPressedTimeMillisVolatile") - static volatile long MouseHandler_lastPressedTimeMillisVolatile; - @ObfuscatedName("g") + public static volatile long MouseHandler_lastPressedTimeMillisVolatile; + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 1367970229 + intValue = 268486097 ) @Export("MouseHandler_lastButton") public static int MouseHandler_lastButton; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = 371149673 + intValue = -209058807 ) @Export("MouseHandler_lastPressedX") public static int MouseHandler_lastPressedX; - @ObfuscatedName("h") + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = -1499115361 + intValue = -775281431 ) @Export("MouseHandler_lastPressedY") public static int MouseHandler_lastPressedY; - @ObfuscatedName("s") + @ObfuscatedName("z") @ObfuscatedGetter( - longValue = -6248133867474392459L + longValue = -7966461350873745939L ) @Export("MouseHandler_lastPressedTimeMillis") public static long MouseHandler_lastPressedTimeMillis; - @ObfuscatedName("ge") - @Export("regions") - static int[] regions; + @ObfuscatedName("bx") + @ObfuscatedSignature( + signature = "Lhp;" + ) + static StudioGame field458; static { MouseHandler_instance = new MouseHandler(); @@ -148,10 +157,10 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi MouseHandler() { } - @ObfuscatedName("p") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Ljava/awt/event/MouseEvent;I)I", - garbageValue = "1818791609" + signature = "(Ljava/awt/event/MouseEvent;B)I", + garbageValue = "-1" ) @Export("getButton") final int getButton(MouseEvent var1) { @@ -173,6 +182,28 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi } + public final synchronized void mouseDragged(MouseEvent var1) { + this.mouseMoved(var1); + } + + public final synchronized void mousePressed(MouseEvent var1) { + if (MouseHandler_instance != null) { + MouseHandler_idleCycles = 0; + MouseHandler_lastPressedXVolatile = var1.getX(); + MouseHandler_lastPressedYVolatile = var1.getY(); + MouseHandler_lastPressedTimeMillisVolatile = PlayerAppearance.currentTimeMillis(); + MouseHandler_lastButtonVolatile = this.getButton(var1); + if (MouseHandler_lastButtonVolatile != 0) { + MouseHandler_currentButtonVolatile = MouseHandler_lastButtonVolatile; + } + } + + if (var1.isPopupTrigger()) { + var1.consume(); + } + + } + public final synchronized void mouseReleased(MouseEvent var1) { if (MouseHandler_instance != null) { MouseHandler_idleCycles = 0; @@ -185,14 +216,7 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi } - public final void mouseClicked(MouseEvent var1) { - if (var1.isPopupTrigger()) { - var1.consume(); - } - - } - - public final synchronized void mouseDragged(MouseEvent var1) { + public final synchronized void mouseEntered(MouseEvent var1) { this.mouseMoved(var1); } @@ -206,10 +230,6 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi } - public final synchronized void mouseEntered(MouseEvent var1) { - this.mouseMoved(var1); - } - public final synchronized void mouseExited(MouseEvent var1) { if (MouseHandler_instance != null) { MouseHandler_idleCycles = 0; @@ -220,21 +240,145 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi } - public final synchronized void mousePressed(MouseEvent var1) { - if (MouseHandler_instance != null) { - MouseHandler_idleCycles = 0; - MouseHandler_lastPressedXVolatile = var1.getX(); - MouseHandler_lastPressedYVolatile = var1.getY(); - MouseHandler_lastPressedTimeMillisVolatile = class30.currentTimeMillis(); - MouseHandler_lastButtonVolatile = this.getButton(var1); - if (MouseHandler_lastButtonVolatile != 0) { - MouseHandler_currentButtonVolatile = MouseHandler_lastButtonVolatile; - } - } - + public final void mouseClicked(MouseEvent var1) { if (var1.isPopupTrigger()) { var1.consume(); } } + + @ObfuscatedName("af") + @ObfuscatedSignature( + signature = "(ILcj;ZB)I", + garbageValue = "-21" + ) + static int method1176(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.VIEWPORT_SETFOV) { + Interpreter.Interpreter_intStackSize -= 2; + Client.field881 = (short)Buddy.method5298(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]); + if (Client.field881 <= 0) { + Client.field881 = 256; + } + + Client.field882 = (short)Buddy.method5298(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + if (Client.field882 <= 0) { + Client.field882 = 256; + } + + return 1; + } else if (var0 == ScriptOpcodes.VIEWPORT_SETZOOM) { + Interpreter.Interpreter_intStackSize -= 2; + Client.zoomHeight = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + if (Client.zoomHeight <= 0) { + Client.zoomHeight = 256; + } + + Client.zoomWidth = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + if (Client.zoomWidth <= 0) { + Client.zoomWidth = 320; + } + + return 1; + } else if (var0 == ScriptOpcodes.VIEWPORT_CLAMPFOV) { + Interpreter.Interpreter_intStackSize -= 4; + Client.field885 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + if (Client.field885 <= 0) { + Client.field885 = 1; + } + + Client.field886 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + if (Client.field886 <= 0) { + Client.field886 = 32767; + } else if (Client.field886 < Client.field885) { + Client.field886 = Client.field885; + } + + Client.field844 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + if (Client.field844 <= 0) { + Client.field844 = 1; + } + + Client.field888 = (short)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + if (Client.field888 <= 0) { + Client.field888 = 32767; + } else if (Client.field888 < Client.field844) { + Client.field888 = Client.field844; + } + + return 1; + } else if (var0 == ScriptOpcodes.VIEWPORT_GETEFFECTIVESIZE) { + if (Client.viewportWidget != null) { + Calendar.setViewportShape(0, 0, Client.viewportWidget.width, Client.viewportWidget.height, false); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.viewportWidth; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.viewportHeight; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } + + return 1; + } else if (var0 == ScriptOpcodes.VIEWPORT_GETZOOM) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.zoomHeight; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.zoomWidth; + return 1; + } else if (var0 == ScriptOpcodes.VIEWPORT_GETFOV) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class30.method608(Client.field881); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class30.method608(Client.field882); + return 1; + } else if (var0 == 6220) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 6221) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 6222) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class286.canvasWidth; + return 1; + } else if (var0 == 6223) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = FloorUnderlayDefinition.canvasHeight; + return 1; + } else { + return 2; + } + } + + @ObfuscatedName("hx") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "790198016" + ) + static final void method1172() { + for (Projectile var0 = (Projectile)Client.projectiles.last(); var0 != null; var0 = (Projectile)Client.projectiles.previous()) { + if (var0.plane == Player.Scene_plane && Client.cycle <= var0.cycleEnd) { + if (Client.cycle >= var0.cycleStart) { + if (var0.targetIndex > 0) { + NPC var1 = Client.npcs[var0.targetIndex - 1]; + if (var1 != null && var1.x >= 0 && var1.x < 13312 && var1.y >= 0 && var1.y < 13312) { + var0.setDestination(var1.x, var1.y, GraphicsObject.getTileHeight(var1.x, var1.y, var0.plane) - var0.endHeight, Client.cycle); + } + } + + if (var0.targetIndex < 0) { + int var2 = -var0.targetIndex - 1; + Player var3; + if (var2 == Client.localPlayerIndex) { + var3 = class215.localPlayer; + } else { + var3 = Client.players[var2]; + } + + if (var3 != null && var3.x >= 0 && var3.x < 13312 && var3.y >= 0 && var3.y < 13312) { + var0.setDestination(var3.x, var3.y, GraphicsObject.getTileHeight(var3.x, var3.y, var0.plane) - var0.endHeight, Client.cycle); + } + } + + var0.advance(Client.field693); + WorldMapArea.scene.drawEntity(Player.Scene_plane, (int)var0.x, (int)var0.y, (int)var0.z, 60, var0, var0.yaw, -1L, false); + } + } else { + var0.remove(); + } + } + + } } diff --git a/runescape-client/src/main/java/MouseRecorder.java b/runescape-client/src/main/java/MouseRecorder.java index 27b34c85d8..7a6756f10f 100644 --- a/runescape-client/src/main/java/MouseRecorder.java +++ b/runescape-client/src/main/java/MouseRecorder.java @@ -4,33 +4,34 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bn") +@ObfuscatedName("be") @Implements("MouseRecorder") public class MouseRecorder implements Runnable { - @ObfuscatedName("qc") + @ObfuscatedName("le") @ObfuscatedGetter( - intValue = -749855997 + intValue = 640967809 ) - static int field572; - @ObfuscatedName("z") + @Export("selectedItemSlot") + static int selectedItemSlot; + @ObfuscatedName("a") @Export("isRunning") boolean isRunning; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("lock") Object lock; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -395886809 + intValue = -1581840103 ) @Export("index") int index; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("xs") int[] xs; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("ys") int[] ys; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("millis") long[] millis; @@ -44,7 +45,7 @@ public class MouseRecorder implements Runnable { } public void run() { - while (this.isRunning) { + for (; this.isRunning; ClanChat.method5367(50L)) { synchronized(this.lock) { if (this.index < 500) { this.xs[this.index] = MouseHandler.MouseHandler_x; @@ -53,231 +54,60 @@ public class MouseRecorder implements Runnable { ++this.index; } } - - long var4 = 49L; - - try { - Thread.sleep(var4); - } catch (InterruptedException var7) { - } - - try { - Thread.sleep(1L); - } catch (InterruptedException var6) { - } } } - @ObfuscatedName("z") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(Lhp;Lhp;Lhp;Lhp;I)V", - garbageValue = "757656787" + signature = "(Lbk;I)V", + garbageValue = "1813919369" ) - @Export("Widget_setArchives") - public static void Widget_setArchives(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2, AbstractArchive var3) { - Widget.Widget_archive = var0; - TaskHandler.Widget_modelsArchive = var1; - ClientPreferences.Widget_spritesArchive = var2; - class2.Widget_fontsArchive = var3; - UserComparator5.Widget_interfaceComponents = new Widget[Widget.Widget_archive.getGroupCount()][]; - ViewportMouse.Widget_loadedInterfaces = new boolean[Widget.Widget_archive.getGroupCount()]; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;IZI)Z", - garbageValue = "1781175129" - ) - static boolean method1209(CharSequence var0, int var1, boolean var2) { - if (var1 >= 2 && var1 <= 36) { - boolean var3 = false; - boolean var4 = false; - int var5 = 0; - int var6 = var0.length(); - - for (int var7 = 0; var7 < var6; ++var7) { - char var8 = var0.charAt(var7); - if (var7 == 0) { - if (var8 == '-') { - var3 = true; - continue; - } - - if (var8 == '+') { - continue; - } - } - - int var10; - if (var8 >= '0' && var8 <= '9') { - var10 = var8 - '0'; - } else if (var8 >= 'A' && var8 <= 'Z') { - var10 = var8 - '7'; - } else { - if (var8 < 'a' || var8 > 'z') { - return false; - } - - var10 = var8 - 'W'; - } - - if (var10 >= var1) { - return false; - } - - if (var3) { - var10 = -var10; - } - - int var9 = var10 + var5 * var1; - if (var9 / var1 != var5) { - return false; - } - - var5 = var9; - var4 = true; + @Export("changeWorld") + static void changeWorld(World var0) { + if (var0.isMembersOnly() != Client.isMembersWorld) { + Client.isMembersWorld = var0.isMembersOnly(); + boolean var1 = var0.isMembersOnly(); + if (var1 != ItemDefinition.ItemDefinition_inMembersWorld) { + FriendSystem.method2038(); + ItemDefinition.ItemDefinition_inMembersWorld = var1; } - - return var4; - } else { - throw new IllegalArgumentException("" + var1); } + + WorldMapAreaData.worldHost = var0.host; + Client.worldId = var0.id; + Client.worldProperties = var0.properties; + class222.port1 = Client.gameBuild == 0 ? 43594 : var0.id + 40000; + Decimator.port2 = Client.gameBuild == 0 ? 443 : var0.id + 50000; + GrandExchangeOfferUnitPriceComparator.port3 = class222.port1; } - @ObfuscatedName("ej") + @ObfuscatedName("go") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-1180818017" + signature = "(Lbj;IIB)V", + garbageValue = "-6" ) - @Export("updateGameState") - static void updateGameState(int var0) { - if (var0 != Client.gameState) { - if (Client.gameState == 0) { - ViewportMouse.client.method1024(); + @Export("performPlayerAnimation") + static void performPlayerAnimation(Player var0, int var1, int var2) { + if (var0.sequence == var1 && var1 != -1) { + int var3 = PlayerType.SequenceDefinition_get(var1).field3521; + if (var3 == 1) { + var0.sequenceFrame = 0; + var0.sequenceFrameCycle = 0; + var0.sequenceDelay = var2; + var0.field960 = 0; } - if (var0 == 20 || var0 == 40 || var0 == 45) { - Client.loginState = 0; - Client.field669 = 0; - Client.field670 = 0; - Client.timer.method4938(var0); - if (var0 != 20) { - PlayerType.method4104(false); - } - } - - if (var0 != 20 && var0 != 40 && class30.field251 != null) { - class30.field251.close(); - class30.field251 = null; - } - - if (Client.gameState == 25) { - Client.field693 = 0; - Client.field689 = 0; - Client.field690 = 1; - Client.field691 = 0; - Client.field692 = 1; - } - - if (var0 != 5 && var0 != 10) { - if (var0 == 20) { - WorldMapSprite.method435(Client.archive10, GrandExchangeOfferAgeComparator.archive8, true, Client.gameState == 11 ? 4 : 0); - } else if (var0 == 11) { - WorldMapSprite.method435(Client.archive10, GrandExchangeOfferAgeComparator.archive8, false, 4); - } else if (Login.field1160) { - class32.titleboxSprite = null; - AbstractRasterProvider.titlebuttonSprite = null; - Login.runesSprite = null; - WorldMapID.leftTitleSprite = null; - class51.rightTitleSprite = null; - FontName.logoSprite = null; - UserComparator7.title_muteSprite = null; - class195.options_buttons_0Sprite = null; - class42.options_buttons_2Sprite = null; - ArchiveLoader.worldSelectBackSprites = null; - Language.worldSelectFlagSprites = null; - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows = null; - Frames.worldSelectStars = null; - Skeleton.field1767 = null; - BufferedSink.loginScreenRunesAnimation.method1821(); - class197.field2386 = 1; - class197.musicTrackArchive = null; - class188.musicTrackGroupId = -1; - class49.musicTrackFileId = -1; - TileItem.field1223 = 0; - WorldMapSectionType.musicTrackBoolean = false; - MusicPatchNode2.field2382 = 2; - DirectByteArrayCopier.method3924(true); - Login.field1160 = false; - } - } else { - WorldMapSprite.method435(Client.archive10, GrandExchangeOfferAgeComparator.archive8, true, 0); - } - - Client.gameState = var0; - } - } - - @ObfuscatedName("fb") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "861469651" - ) - static final void method1213() { - if (Client.logoutTimer > 0) { - DynamicObject.logOut(); - } else { - Client.timer.method4937(); - updateGameState(40); - class30.field251 = Client.packetWriter.getSocket(); - Client.packetWriter.removeSocket(); - } - } - - @ObfuscatedName("jv") - @ObfuscatedSignature( - signature = "([Lho;II)V", - garbageValue = "-1695750792" - ) - @Export("runComponentCloseListeners") - static final void runComponentCloseListeners(Widget[] var0, int var1) { - for (int var2 = 0; var2 < var0.length; ++var2) { - Widget var3 = var0[var2]; - if (var3 != null) { - if (var3.type == 0) { - if (var3.children != null) { - runComponentCloseListeners(var3.children, var1); - } - - InterfaceParent var4 = (InterfaceParent)Client.interfaceParents.get((long)var3.id); - if (var4 != null) { - class40.runIntfCloseListeners(var4.group, var1); - } - } - - ScriptEvent var5; - if (var1 == 0 && var3.onDialogAbort != null) { - var5 = new ScriptEvent(); - var5.widget = var3; - var5.args = var3.onDialogAbort; - ParamDefinition.runScriptEvent(var5); - } - - if (var1 == 1 && var3.onSubChange != null) { - if (var3.childIndex >= 0) { - Widget var6 = Canvas.getWidget(var3.id); - if (var6 == null || var6.children == null || var3.childIndex >= var6.children.length || var3 != var6.children[var3.childIndex]) { - continue; - } - } - - var5 = new ScriptEvent(); - var5.widget = var3; - var5.args = var3.onSubChange; - ParamDefinition.runScriptEvent(var5); - } + if (var3 == 2) { + var0.field960 = 0; } + } else if (var1 == -1 || var0.sequence == -1 || PlayerType.SequenceDefinition_get(var1).field3519 >= PlayerType.SequenceDefinition_get(var0.sequence).field3519) { + var0.sequence = var1; + var0.sequenceFrame = 0; + var0.sequenceFrameCycle = 0; + var0.sequenceDelay = var2; + var0.field960 = 0; + var0.field983 = var0.pathLength; } } diff --git a/runescape-client/src/main/java/MouseWheel.java b/runescape-client/src/main/java/MouseWheel.java index 5c0b6a9911..4fc958281b 100644 --- a/runescape-client/src/main/java/MouseWheel.java +++ b/runescape-client/src/main/java/MouseWheel.java @@ -3,13 +3,13 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ft") +@ObfuscatedName("fl") @Implements("MouseWheel") public interface MouseWheel { - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-125" + signature = "(I)I", + garbageValue = "888914952" ) @Export("useRotation") int useRotation(); diff --git a/runescape-client/src/main/java/MouseWheelHandler.java b/runescape-client/src/main/java/MouseWheelHandler.java index 49760d453b..3baf588175 100644 --- a/runescape-client/src/main/java/MouseWheelHandler.java +++ b/runescape-client/src/main/java/MouseWheelHandler.java @@ -7,12 +7,12 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("av") +@ObfuscatedName("af") @Implements("MouseWheelHandler") public final class MouseWheelHandler implements MouseWheel, MouseWheelListener { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -2136851861 + intValue = -834317935 ) @Export("rotation") int rotation; @@ -21,30 +21,30 @@ public final class MouseWheelHandler implements MouseWheel, MouseWheelListener { this.rotation = 0; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/awt/Component;B)V", - garbageValue = "39" + signature = "(Ljava/awt/Component;I)V", + garbageValue = "1303554661" ) @Export("addTo") void addTo(Component var1) { var1.addMouseWheelListener(this); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ljava/awt/Component;I)V", - garbageValue = "-2135806748" + signature = "(Ljava/awt/Component;B)V", + garbageValue = "31" ) @Export("removeFrom") void removeFrom(Component var1) { var1.removeMouseWheelListener(this); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-125" + signature = "(I)I", + garbageValue = "888914952" ) @Export("useRotation") public synchronized int useRotation() { diff --git a/runescape-client/src/main/java/MusicPatch.java b/runescape-client/src/main/java/MusicPatch.java index e93859b899..0d486c5be9 100644 --- a/runescape-client/src/main/java/MusicPatch.java +++ b/runescape-client/src/main/java/MusicPatch.java @@ -4,44 +4,44 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gk") +@ObfuscatedName("gz") @Implements("MusicPatch") public class MusicPatch extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -779735103 + intValue = -741608303 ) - int field2458; - @ObfuscatedName("n") + int field2454; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "[Lch;" + signature = "[Lca;" ) @Export("rawSounds") RawSound[] rawSounds; - @ObfuscatedName("v") - short[] field2457; - @ObfuscatedName("u") - byte[] field2459; - @ObfuscatedName("r") - byte[] field2456; - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "[Lgf;" - ) - MusicPatchNode2[] field2462; + @ObfuscatedName("n") + short[] field2460; @ObfuscatedName("q") - byte[] field2460; - @ObfuscatedName("m") - int[] field2463; + byte[] field2453; + @ObfuscatedName("v") + byte[] field2457; + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "[Lgp;" + ) + MusicPatchNode2[] field2458; + @ObfuscatedName("c") + byte[] field2459; + @ObfuscatedName("o") + int[] field2455; MusicPatch(byte[] var1) { this.rawSounds = new RawSound[128]; - this.field2457 = new short[128]; + this.field2460 = new short[128]; + this.field2453 = new byte[128]; + this.field2457 = new byte[128]; + this.field2458 = new MusicPatchNode2[128]; this.field2459 = new byte[128]; - this.field2456 = new byte[128]; - this.field2462 = new MusicPatchNode2[128]; - this.field2460 = new byte[128]; - this.field2463 = new int[128]; + this.field2455 = new int[128]; Buffer var2 = new Buffer(var1); int var3; @@ -88,11 +88,11 @@ public class MusicPatch extends Node { ++var2.offset; ++var9; - byte[] var36 = new byte[var9]; + byte[] var38 = new byte[var9]; int var12; int var14; if (var9 > 1) { - var36[1] = 1; + var38[1] = 1; int var13 = 1; var12 = 2; @@ -108,33 +108,33 @@ public class MusicPatch extends Node { var13 = var15; } - var36[var14] = (byte)var13; + var38[var14] = (byte)var13; } } else { var12 = var9; } - MusicPatchNode2[] var37 = new MusicPatchNode2[var12]; + MusicPatchNode2[] var39 = new MusicPatchNode2[var12]; - MusicPatchNode2 var38; - for (var14 = 0; var14 < var37.length; ++var14) { - var38 = var37[var14] = new MusicPatchNode2(); + MusicPatchNode2 var40; + for (var14 = 0; var14 < var39.length; ++var14) { + var40 = var39[var14] = new MusicPatchNode2(); int var16 = var2.readUnsignedByte(); if (var16 > 0) { - var38.field2376 = new byte[var16 * 2]; + var40.field2364 = new byte[var16 * 2]; } var16 = var2.readUnsignedByte(); if (var16 > 0) { - var38.field2374 = new byte[var16 * 2 + 2]; - var38.field2374[1] = 64; + var40.field2361 = new byte[var16 * 2 + 2]; + var40.field2361[1] = 64; } } var14 = var2.readUnsignedByte(); - byte[] var45 = var14 > 0 ? new byte[var14 * 2] : null; + byte[] var47 = var14 > 0 ? new byte[var14 * 2] : null; var14 = var2.readUnsignedByte(); - byte[] var39 = var14 > 0 ? new byte[var14 * 2] : null; + byte[] var41 = var14 > 0 ? new byte[var14 * 2] : null; int var17; for (var17 = 0; var2.array[var17 + var2.offset] != 0; ++var17) { @@ -154,16 +154,16 @@ public class MusicPatch extends Node { int var20; for (var20 = 0; var20 < 128; ++var20) { var19 += var2.readUnsignedByte(); - this.field2457[var20] = (short)var19; + this.field2460[var20] = (short)var19; } var19 = 0; - short[] var48; + short[] var50; for (var20 = 0; var20 < 128; ++var20) { var19 += var2.readUnsignedByte(); - var48 = this.field2457; - var48[var20] = (short)(var48[var20] + (var19 << 8)); + var50 = this.field2460; + var50[var20] = (short)(var50[var20] + (var19 << 8)); } var20 = 0; @@ -182,9 +182,9 @@ public class MusicPatch extends Node { var22 = var2.readVarInt(); } - var48 = this.field2457; - var48[var23] = (short)(var48[var23] + ((var22 - 1 & 2) << 14)); - this.field2463[var23] = var22; + var50 = this.field2460; + var50[var23] = (short)(var50[var23] + ((var22 - 1 & 2) << 14)); + this.field2455[var23] = var22; --var20; } @@ -194,7 +194,7 @@ public class MusicPatch extends Node { int var24; for (var24 = 0; var24 < 128; ++var24) { - if (this.field2463[var24] != 0) { + if (this.field2455[var24] != 0) { if (var20 == 0) { if (var21 < var4.length) { var20 = var4[var21++]; @@ -205,7 +205,7 @@ public class MusicPatch extends Node { var23 = var2.array[var5++] - 1; } - this.field2460[var24] = (byte)var23; + this.field2459[var24] = (byte)var23; --var20; } } @@ -215,7 +215,7 @@ public class MusicPatch extends Node { var24 = 0; for (int var25 = 0; var25 < 128; ++var25) { - if (this.field2463[var25] != 0) { + if (this.field2455[var25] != 0) { if (var20 == 0) { if (var21 < var7.length) { var20 = var7[var21++]; @@ -226,20 +226,20 @@ public class MusicPatch extends Node { var24 = var2.array[var8++] + 16 << 2; } - this.field2456[var25] = (byte)var24; + this.field2457[var25] = (byte)var24; --var20; } } var20 = 0; var21 = 0; - MusicPatchNode2 var40 = null; + MusicPatchNode2 var42 = null; int var26; for (var26 = 0; var26 < 128; ++var26) { - if (this.field2463[var26] != 0) { + if (this.field2455[var26] != 0) { if (var20 == 0) { - var40 = var37[var36[var21]]; + var42 = var39[var38[var21]]; if (var21 < var10.length) { var20 = var10[var21++]; } else { @@ -247,7 +247,7 @@ public class MusicPatch extends Node { } } - this.field2462[var26] = var40; + this.field2458[var26] = var42; --var20; } } @@ -265,66 +265,66 @@ public class MusicPatch extends Node { var20 = -1; } - if (this.field2463[var27] > 0) { + if (this.field2455[var27] > 0) { var26 = var2.readUnsignedByte() + 1; } } - this.field2459[var27] = (byte)var26; + this.field2453[var27] = (byte)var26; --var20; } - this.field2458 = var2.readUnsignedByte() + 1; + this.field2454 = var2.readUnsignedByte() + 1; MusicPatchNode2 var28; int var29; for (var27 = 0; var27 < var12; ++var27) { - var28 = var37[var27]; - if (var28.field2376 != null) { - for (var29 = 1; var29 < var28.field2376.length; var29 += 2) { - var28.field2376[var29] = var2.readByte(); + var28 = var39[var27]; + if (var28.field2364 != null) { + for (var29 = 1; var29 < var28.field2364.length; var29 += 2) { + var28.field2364[var29] = var2.readByte(); } } - if (var28.field2374 != null) { - for (var29 = 3; var29 < var28.field2374.length - 2; var29 += 2) { - var28.field2374[var29] = var2.readByte(); + if (var28.field2361 != null) { + for (var29 = 3; var29 < var28.field2361.length - 2; var29 += 2) { + var28.field2361[var29] = var2.readByte(); } } } - if (var45 != null) { - for (var27 = 1; var27 < var45.length; var27 += 2) { - var45[var27] = var2.readByte(); + if (var47 != null) { + for (var27 = 1; var27 < var47.length; var27 += 2) { + var47[var27] = var2.readByte(); } } - if (var39 != null) { - for (var27 = 1; var27 < var39.length; var27 += 2) { - var39[var27] = var2.readByte(); + if (var41 != null) { + for (var27 = 1; var27 < var41.length; var27 += 2) { + var41[var27] = var2.readByte(); } } for (var27 = 0; var27 < var12; ++var27) { - var28 = var37[var27]; - if (var28.field2374 != null) { + var28 = var39[var27]; + if (var28.field2361 != null) { var19 = 0; - for (var29 = 2; var29 < var28.field2374.length; var29 += 2) { + for (var29 = 2; var29 < var28.field2361.length; var29 += 2) { var19 = 1 + var19 + var2.readUnsignedByte(); - var28.field2374[var29] = (byte)var19; + var28.field2361[var29] = (byte)var19; } } } for (var27 = 0; var27 < var12; ++var27) { - var28 = var37[var27]; - if (var28.field2376 != null) { + var28 = var39[var27]; + if (var28.field2364 != null) { var19 = 0; - for (var29 = 2; var29 < var28.field2376.length; var29 += 2) { + for (var29 = 2; var29 < var28.field2364.length; var29 += 2) { var19 = 1 + var19 + var2.readUnsignedByte(); - var28.field2376[var29] = (byte)var19; + var28.field2364[var29] = (byte)var19; } } } @@ -333,166 +333,172 @@ public class MusicPatch extends Node { int var32; int var33; int var34; - int var42; - byte var44; - if (var45 != null) { + int var35; + int var36; + int var44; + byte var46; + if (var47 != null) { var19 = var2.readUnsignedByte(); - var45[0] = (byte)var19; + var47[0] = (byte)var19; - for (var27 = 2; var27 < var45.length; var27 += 2) { - var19 = var19 + 1 + var2.readUnsignedByte(); - var45[var27] = (byte)var19; + for (var27 = 2; var27 < var47.length; var27 += 2) { + var19 = 1 + var19 + var2.readUnsignedByte(); + var47[var27] = (byte)var19; } - var44 = var45[0]; - byte var41 = var45[1]; + var46 = var47[0]; + byte var43 = var47[1]; - for (var29 = 0; var29 < var44; ++var29) { - this.field2459[var29] = (byte)(var41 * this.field2459[var29] + 32 >> 6); + for (var29 = 0; var29 < var46; ++var29) { + this.field2453[var29] = (byte)(var43 * this.field2453[var29] + 32 >> 6); } - for (var29 = 2; var29 < var45.length; var29 += 2) { - var30 = var45[var29]; - byte var31 = var45[var29 + 1]; - var32 = var41 * (var30 - var44) + (var30 - var44) / 2; + for (var29 = 2; var29 < var47.length; var29 += 2) { + var30 = var47[var29]; + byte var31 = var47[var29 + 1]; + var32 = var43 * (var30 - var46) + (var30 - var46) / 2; - for (var33 = var44; var33 < var30; ++var33) { - var34 = World.method1814(var32, var30 - var44); - this.field2459[var33] = (byte)(var34 * this.field2459[var33] + 32 >> 6); - var32 += var31 - var41; + for (var33 = var46; var33 < var30; ++var33) { + var35 = var30 - var46; + var36 = var32 >>> 31; + var34 = (var32 + var36) / var35 - var36; + this.field2453[var33] = (byte)(var34 * this.field2453[var33] + 32 >> 6); + var32 += var31 - var43; } - var44 = var30; - var41 = var31; + var46 = var30; + var43 = var31; } - for (var42 = var44; var42 < 128; ++var42) { - this.field2459[var42] = (byte)(var41 * this.field2459[var42] + 32 >> 6); + for (var44 = var46; var44 < 128; ++var44) { + this.field2453[var44] = (byte)(var43 * this.field2453[var44] + 32 >> 6); } - var38 = null; + var40 = null; } - if (var39 != null) { + if (var41 != null) { var19 = var2.readUnsignedByte(); - var39[0] = (byte)var19; + var41[0] = (byte)var19; - for (var27 = 2; var27 < var39.length; var27 += 2) { - var19 = var19 + 1 + var2.readUnsignedByte(); - var39[var27] = (byte)var19; + for (var27 = 2; var27 < var41.length; var27 += 2) { + var19 = 1 + var19 + var2.readUnsignedByte(); + var41[var27] = (byte)var19; } - var44 = var39[0]; - int var47 = var39[1] << 1; + var46 = var41[0]; + int var49 = var41[1] << 1; - for (var29 = 0; var29 < var44; ++var29) { - var42 = var47 + (this.field2456[var29] & 255); - if (var42 < 0) { - var42 = 0; + for (var29 = 0; var29 < var46; ++var29) { + var44 = var49 + (this.field2457[var29] & 255); + if (var44 < 0) { + var44 = 0; } - if (var42 > 128) { - var42 = 128; + if (var44 > 128) { + var44 = 128; } - this.field2456[var29] = (byte)var42; + this.field2457[var29] = (byte)var44; } - int var43; - for (var29 = 2; var29 < var39.length; var29 += 2) { - var30 = var39[var29]; - var43 = var39[var29 + 1] << 1; - var32 = var47 * (var30 - var44) + (var30 - var44) / 2; + int var45; + for (var29 = 2; var29 < var41.length; var29 += 2) { + var30 = var41[var29]; + var45 = var41[var29 + 1] << 1; + var32 = var49 * (var30 - var46) + (var30 - var46) / 2; - for (var33 = var44; var33 < var30; ++var33) { - var34 = World.method1814(var32, var30 - var44); - int var35 = var34 + (this.field2456[var33] & 255); - if (var35 < 0) { - var35 = 0; + for (var33 = var46; var33 < var30; ++var33) { + var35 = var30 - var46; + var36 = var32 >>> 31; + var34 = (var32 + var36) / var35 - var36; + int var37 = var34 + (this.field2457[var33] & 255); + if (var37 < 0) { + var37 = 0; } - if (var35 > 128) { - var35 = 128; + if (var37 > 128) { + var37 = 128; } - this.field2456[var33] = (byte)var35; - var32 += var43 - var47; + this.field2457[var33] = (byte)var37; + var32 += var45 - var49; } - var44 = var30; - var47 = var43; + var46 = var30; + var49 = var45; } - for (var42 = var44; var42 < 128; ++var42) { - var43 = var47 + (this.field2456[var42] & 255); - if (var43 < 0) { - var43 = 0; + for (var44 = var46; var44 < 128; ++var44) { + var45 = var49 + (this.field2457[var44] & 255); + if (var45 < 0) { + var45 = 0; } - if (var43 > 128) { - var43 = 128; + if (var45 > 128) { + var45 = 128; } - this.field2456[var42] = (byte)var43; + this.field2457[var44] = (byte)var45; } - Object var46 = null; + Object var48 = null; } for (var27 = 0; var27 < var12; ++var27) { - var37[var27].field2375 = var2.readUnsignedByte(); + var39[var27].field2371 = var2.readUnsignedByte(); } for (var27 = 0; var27 < var12; ++var27) { - var28 = var37[var27]; - if (var28.field2376 != null) { - var28.field2373 = var2.readUnsignedByte(); + var28 = var39[var27]; + if (var28.field2364 != null) { + var28.field2366 = var2.readUnsignedByte(); } - if (var28.field2374 != null) { - var28.field2377 = var2.readUnsignedByte(); + if (var28.field2361 != null) { + var28.field2363 = var2.readUnsignedByte(); } - if (var28.field2375 > 0) { - var28.field2378 = var2.readUnsignedByte(); + if (var28.field2371 > 0) { + var28.field2365 = var2.readUnsignedByte(); } } for (var27 = 0; var27 < var12; ++var27) { - var37[var27].field2380 = var2.readUnsignedByte(); + var39[var27].field2367 = var2.readUnsignedByte(); } for (var27 = 0; var27 < var12; ++var27) { - var28 = var37[var27]; - if (var28.field2380 > 0) { - var28.field2379 = var2.readUnsignedByte(); + var28 = var39[var27]; + if (var28.field2367 > 0) { + var28.field2360 = var2.readUnsignedByte(); } } for (var27 = 0; var27 < var12; ++var27) { - var28 = var37[var27]; - if (var28.field2379 > 0) { - var28.field2381 = var2.readUnsignedByte(); + var28 = var39[var27]; + if (var28.field2360 > 0) { + var28.field2368 = var2.readUnsignedByte(); } } } - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ldq;[B[IB)Z", - garbageValue = "43" + signature = "(Ldm;[B[II)Z", + garbageValue = "1918163087" ) - boolean method3856(SoundCache var1, byte[] var2, int[] var3) { + boolean method4034(SoundCache var1, byte[] var2, int[] var3) { boolean var4 = true; int var5 = 0; RawSound var6 = null; for (int var7 = 0; var7 < 128; ++var7) { if (var2 == null || var2[var7] != 0) { - int var8 = this.field2463[var7]; + int var8 = this.field2455[var7]; if (var8 != 0) { - if (var5 != var8) { + if (var8 != var5) { var5 = var8--; if ((var8 & 1) == 0) { var6 = var1.getSoundEffect(var8 >> 2, var3); @@ -507,7 +513,7 @@ public class MusicPatch extends Node { if (var6 != null) { this.rawSounds[var7] = var6; - this.field2463[var7] = 0; + this.field2455[var7] = 0; } } } @@ -516,55 +522,22 @@ public class MusicPatch extends Node { return var4; } - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-38" + signature = "(I)V", + garbageValue = "21882100" ) @Export("clear") void clear() { - this.field2463 = null; + this.field2455 = null; } - @ObfuscatedName("u") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "10" + signature = "(S)I", + garbageValue = "13081" ) - public static void method3868() { - VarpDefinition.VarpDefinition_cached.clear(); - } - - @ObfuscatedName("ax") - @ObfuscatedSignature( - signature = "([BI)[B", - garbageValue = "-2143377471" - ) - @Export("decompressBytes") - static final byte[] decompressBytes(byte[] var0) { - Buffer var1 = new Buffer(var0); - int var2 = var1.readUnsignedByte(); - int var3 = var1.readInt(); - if (var3 < 0 || AbstractArchive.field3122 != 0 && var3 > AbstractArchive.field3122) { - throw new RuntimeException(); - } else if (var2 == 0) { - byte[] var4 = new byte[var3]; - var1.readBytes(var4, 0, var3); - return var4; - } else { - int var6 = var1.readInt(); - if (var6 < 0 || AbstractArchive.field3122 != 0 && var6 > AbstractArchive.field3122) { - throw new RuntimeException(); - } else { - byte[] var5 = new byte[var6]; - if (var2 == 1) { - BZip2Decompressor.BZip2Decompressor_decompress(var5, var6, var0, var3, 9); - } else { - AbstractArchive.gzipDecompressor.decompress(var1, var5); - } - - return var5; - } - } + static int method4037() { + return 12; } } diff --git a/runescape-client/src/main/java/MusicPatchNode.java b/runescape-client/src/main/java/MusicPatchNode.java index 4a50938d26..fb5ef126ff 100644 --- a/runescape-client/src/main/java/MusicPatchNode.java +++ b/runescape-client/src/main/java/MusicPatchNode.java @@ -4,899 +4,145 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gu") +@ObfuscatedName("gq") @Implements("MusicPatchNode") public class MusicPatchNode extends Node { - @ObfuscatedName("fs") + @ObfuscatedName("kl") @ObfuscatedGetter( - intValue = 327716875 + intValue = -1634536661 ) - static int field2422; - @ObfuscatedName("z") + @Export("menuX") + static int menuX; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -517286067 + intValue = 830928495 ) - int field2420; - @ObfuscatedName("n") + int field2425; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lgk;" + signature = "Lgz;" ) @Export("patch") MusicPatch patch; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lch;" + signature = "Lca;" ) @Export("rawSound") RawSound rawSound; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lgf;" - ) - MusicPatchNode2 field2435; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = -1862096009 - ) - int field2423; - @ObfuscatedName("p") - @ObfuscatedGetter( - intValue = 1854182163 - ) - int field2424; @ObfuscatedName("q") - @ObfuscatedGetter( - intValue = 1256664635 + @ObfuscatedSignature( + signature = "Lgp;" ) - int field2425; - @ObfuscatedName("m") + MusicPatchNode2 field2417; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 137135897 + intValue = -1191451859 ) - int field2426; - @ObfuscatedName("y") + int field2422; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -24850439 + intValue = 157095745 ) - int field2427; - @ObfuscatedName("i") - @ObfuscatedGetter( - intValue = -1793031461 - ) - int field2441; + int field2419; @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 625260661 + intValue = -1068242143 ) - int field2429; - @ObfuscatedName("b") - @ObfuscatedGetter( - intValue = -2120695939 - ) - int field2428; + int field2430; @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -641551353 + intValue = 747760665 + ) + int field2421; + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = 2032697643 + ) + int field2416; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = 910822609 + ) + int field2423; + @ObfuscatedName("m") + @ObfuscatedGetter( + intValue = -233419885 + ) + int field2424; + @ObfuscatedName("p") + @ObfuscatedGetter( + intValue = 1986379776 + ) + int field2420; + @ObfuscatedName("h") + @ObfuscatedGetter( + intValue = -1890707239 ) int field2431; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = -1163841633 + intValue = -1386699845 ) - int field2432; + int field2427; + @ObfuscatedName("x") + @ObfuscatedGetter( + intValue = -1121905843 + ) + int field2428; + @ObfuscatedName("j") + @ObfuscatedGetter( + intValue = 40924709 + ) + int field2429; + @ObfuscatedName("r") + @ObfuscatedGetter( + intValue = -141158297 + ) + int field2426; @ObfuscatedName("e") @ObfuscatedGetter( - intValue = -1406869545 + intValue = -964518569 ) - int field2433; - @ObfuscatedName("w") - @ObfuscatedGetter( - intValue = 641640947 - ) - int field2434; - @ObfuscatedName("t") - @ObfuscatedGetter( - intValue = 1726198003 - ) - int field2439; - @ObfuscatedName("g") - @ObfuscatedGetter( - intValue = -417116593 - ) - int field2436; - @ObfuscatedName("x") + int field2414; + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "Ldu;" + signature = "Lds;" ) @Export("stream") RawPcmStream stream; - @ObfuscatedName("h") + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = 41547951 + intValue = -312260617 ) - int field2438; + int field2433; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = 1840443907 + intValue = -2047299569 ) - int field2419; + int field2434; MusicPatchNode() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "2" + signature = "(I)V", + garbageValue = "1779627042" ) - void method3794() { + void method3974() { this.patch = null; this.rawSound = null; - this.field2435 = null; + this.field2417 = null; this.stream = null; } - @ObfuscatedName("u") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(CLgt;I)I", - garbageValue = "888672970" + signature = "(I)V", + garbageValue = "428887942" ) - @Export("lowercaseChar") - static int lowercaseChar(char var0, Language var1) { - int var2 = var0 << 4; - if (Character.isUpperCase(var0) || Character.isTitleCase(var0)) { - var0 = Character.toLowerCase(var0); - var2 = (var0 << 4) + 1; - } - - if (var0 == 241 && var1 == Language.Language_ES) { - var2 = 1762; - } - - return var2; - } - - @ObfuscatedName("iz") - @ObfuscatedSignature( - signature = "(Lho;III)V", - garbageValue = "1345950027" - ) - static final void method3798(Widget var0, int var1, int var2) { - if (var0.buttonType == 1) { - WorldMapData_1.insertMenuItemNoShift(var0.buttonText, "", 24, 0, 0, var0.id); - } - - String var3; - if (var0.buttonType == 2 && !Client.isSpellSelected) { - var3 = VerticalAlignment.method4321(var0); - if (var3 != null) { - WorldMapData_1.insertMenuItemNoShift(var3, World.colorStartTag(65280) + var0.spellName, 25, 0, -1, var0.id); - } - } - - if (var0.buttonType == 3) { - WorldMapData_1.insertMenuItemNoShift("Close", "", 26, 0, 0, var0.id); - } - - if (var0.buttonType == 4) { - WorldMapData_1.insertMenuItemNoShift(var0.buttonText, "", 28, 0, 0, var0.id); - } - - if (var0.buttonType == 5) { - WorldMapData_1.insertMenuItemNoShift(var0.buttonText, "", 29, 0, 0, var0.id); - } - - if (var0.buttonType == 6 && Client.meslayerContinueWidget == null) { - WorldMapData_1.insertMenuItemNoShift(var0.buttonText, "", 30, 0, -1, var0.id); - } - - int var4; - int var5; - int var19; - if (var0.type == 2) { - var19 = 0; - - for (var4 = 0; var4 < var0.height; ++var4) { - for (var5 = 0; var5 < var0.width; ++var5) { - int var6 = (var0.paddingX + 32) * var5; - int var7 = (var0.paddingY + 32) * var4; - if (var19 < 20) { - var6 += var0.inventoryXOffsets[var19]; - var7 += var0.inventoryYOffsets[var19]; - } - - if (var1 >= var6 && var2 >= var7 && var1 < var6 + 32 && var2 < var7 + 32) { - Client.dragItemSlotDestination = var19; - DevicePcmPlayerProvider.field391 = var0; - if (var0.itemIds[var19] > 0) { - label331: { - ItemDefinition var8 = Occluder.ItemDefinition_get(var0.itemIds[var19] - 1); - boolean var9; - int var10; - if (Client.isItemSelected == 1) { - var10 = class2.getWidgetClickMask(var0); - var9 = (var10 >> 30 & 1) != 0; - if (var9) { - if (var0.id != class2.selectedItemWidget || var19 != DevicePcmPlayerProvider.selectedItemSlot) { - WorldMapData_1.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + World.colorStartTag(16748608) + var8.name, 31, var8.id, var19, var0.id); - } - break label331; - } - } - - if (Client.isSpellSelected) { - var10 = class2.getWidgetClickMask(var0); - var9 = (var10 >> 30 & 1) != 0; - if (var9) { - if ((ItemContainer.selectedSpellFlags & 16) == 16) { - WorldMapData_1.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + World.colorStartTag(16748608) + var8.name, 32, var8.id, var19, var0.id); - } - break label331; - } - } - - String[] var20 = var8.inventoryActions; - var10 = -1; - if (Client.shiftClickDrop && class14.method174()) { - var10 = var8.getShiftClickIndex(); - } - - int var12 = class2.getWidgetClickMask(var0); - boolean var11 = (var12 >> 30 & 1) != 0; - if (var11) { - for (int var13 = 4; var13 >= 3; --var13) { - if (var13 != var10) { - UrlRequest.addWidgetItemMenuItem(var0, var8, var19, var13, false); - } - } - } - - int var14 = class2.getWidgetClickMask(var0); - boolean var24 = (var14 >> 31 & 1) != 0; - if (var24) { - WorldMapData_1.insertMenuItemNoShift("Use", World.colorStartTag(16748608) + var8.name, 38, var8.id, var19, var0.id); - } - - int var16 = class2.getWidgetClickMask(var0); - boolean var15 = (var16 >> 30 & 1) != 0; - int var17; - if (var15) { - for (var17 = 2; var17 >= 0; --var17) { - if (var10 != var17) { - UrlRequest.addWidgetItemMenuItem(var0, var8, var19, var17, false); - } - } - - if (var10 >= 0) { - UrlRequest.addWidgetItemMenuItem(var0, var8, var19, var10, true); - } - } - - var20 = var0.itemActions; - if (var20 != null) { - for (var17 = 4; var17 >= 0; --var17) { - if (var20[var17] != null) { - byte var18 = 0; - if (var17 == 0) { - var18 = 39; - } - - if (var17 == 1) { - var18 = 40; - } - - if (var17 == 2) { - var18 = 41; - } - - if (var17 == 3) { - var18 = 42; - } - - if (var17 == 4) { - var18 = 43; - } - - WorldMapData_1.insertMenuItemNoShift(var20[var17], World.colorStartTag(16748608) + var8.name, var18, var8.id, var19, var0.id); - } - } - } - - WorldMapData_1.insertMenuItemNoShift("Examine", World.colorStartTag(16748608) + var8.name, 1005, var8.id, var19, var0.id); - } - } - } - - ++var19; - } - } - } - - if (var0.isIf3) { - if (Client.isSpellSelected) { - var4 = class2.getWidgetClickMask(var0); - boolean var25 = (var4 >> 21 & 1) != 0; - if (var25 && (ItemContainer.selectedSpellFlags & 32) == 32) { - WorldMapData_1.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + var0.dataText, 58, 0, var0.childIndex, var0.id); - } - } else { - for (var19 = 9; var19 >= 5; --var19) { - String var21 = FaceNormal.method3228(var0, var19); - if (var21 != null) { - WorldMapData_1.insertMenuItemNoShift(var21, var0.dataText, 1007, var19 + 1, var0.childIndex, var0.id); - } - } - - var3 = VerticalAlignment.method4321(var0); - if (var3 != null) { - WorldMapData_1.insertMenuItemNoShift(var3, var0.dataText, 25, 0, var0.childIndex, var0.id); - } - - for (var4 = 4; var4 >= 0; --var4) { - String var22 = FaceNormal.method3228(var0, var4); - if (var22 != null) { - AttackOption.insertMenuItem(var22, var0.dataText, 57, var4 + 1, var0.childIndex, var0.id, var0.field2687); - } - } - - var5 = class2.getWidgetClickMask(var0); - boolean var23 = (var5 & 1) != 0; - if (var23) { - WorldMapData_1.insertMenuItemNoShift("Continue", "", 30, 0, var0.childIndex, var0.id); - } - } - } - - } - - @ObfuscatedName("ix") - @ObfuscatedSignature( - signature = "([Lho;IIIIIIIB)V", - garbageValue = "-61" - ) - @Export("updateInterface") - static final void updateInterface(Widget[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { - for (int var8 = 0; var8 < var0.length; ++var8) { - Widget var9 = var0[var8]; - if (var9 != null && var9.parentId == var1 && (!var9.isIf3 || var9.type == 0 || var9.hasListener || class2.getWidgetClickMask(var9) != 0 || var9 == Client.clickedWidgetParent || var9.contentType == 1338)) { - if (var9.isIf3) { - if (WorldMapSectionType.isComponentHidden(var9)) { - continue; - } - } else if (var9.type == 0 && var9 != NetSocket.mousedOverWidgetIf1 && WorldMapSectionType.isComponentHidden(var9)) { - continue; - } - - int var10 = var9.x + var6; - int var11 = var7 + var9.y; - int var12; - int var13; - int var14; - int var15; - int var17; - int var18; - if (var9.type == 2) { - var12 = var2; - var13 = var3; - var14 = var4; - var15 = var5; - } else { - int var16; - if (var9.type == 9) { - var16 = var10; - var17 = var11; - var18 = var10 + var9.width; - int var19 = var11 + var9.height; - if (var18 < var10) { - var16 = var18; - var18 = var10; - } - - if (var19 < var11) { - var17 = var19; - var19 = var11; - } - - ++var18; - ++var19; - var12 = var16 > var2 ? var16 : var2; - var13 = var17 > var3 ? var17 : var3; - var14 = var18 < var4 ? var18 : var4; - var15 = var19 < var5 ? var19 : var5; - } else { - var16 = var10 + var9.width; - var17 = var11 + var9.height; - var12 = var10 > var2 ? var10 : var2; - var13 = var11 > var3 ? var11 : var3; - var14 = var16 < var4 ? var16 : var4; - var15 = var17 < var5 ? var17 : var5; - } - } - - if (var9 == Client.clickedWidget) { - Client.field817 = true; - Client.field818 = var10; - Client.field819 = var11; - } - - boolean var32 = false; - if (var9.field2619) { - switch(Client.field798) { - case 0: - var32 = true; - case 1: - default: - break; - case 2: - if (Client.field824 == var9.id >>> 16) { - var32 = true; - } - break; - case 3: - if (var9.id == Client.field824) { - var32 = true; - } - } - } - - if (var32 || !var9.isIf3 || var12 < var14 && var13 < var15) { - if (var9.isIf3) { - ScriptEvent var26; - if (var9.noClickThrough) { - if (MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { - for (var26 = (ScriptEvent)Client.scriptEvents.last(); var26 != null; var26 = (ScriptEvent)Client.scriptEvents.previous()) { - if (var26.isMouseInputEvent) { - var26.remove(); - var26.widget.containsMouse = false; - } - } - - if (ViewportMouse.widgetDragDuration == 0) { - Client.clickedWidget = null; - Client.clickedWidgetParent = null; - } - - if (!Client.isMenuOpen) { - KeyHandler.addCancelMenuEntry(); - } - } - } else if (var9.noScrollThrough && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { - for (var26 = (ScriptEvent)Client.scriptEvents.last(); var26 != null; var26 = (ScriptEvent)Client.scriptEvents.previous()) { - if (var26.isMouseInputEvent && var26.widget.onScroll == var26.args) { - var26.remove(); - } - } - } - } - - var17 = MouseHandler.MouseHandler_x; - var18 = MouseHandler.MouseHandler_y; - if (MouseHandler.MouseHandler_lastButton != 0) { - var17 = MouseHandler.MouseHandler_lastPressedX; - var18 = MouseHandler.MouseHandler_lastPressedY; - } - - boolean var33 = var17 >= var12 && var18 >= var13 && var17 < var14 && var18 < var15; - if (var9.contentType == 1337) { - if (!Client.isLoading && !Client.isMenuOpen && var33) { - class32.addSceneMenuOptions(var17, var18, var12, var13); - } - } else if (var9.contentType == 1338) { - BufferedSink.checkIfMinimapClicked(var9, var10, var11); - } else { - if (var9.contentType == 1400) { - Tiles.worldMap.onCycle(MouseHandler.MouseHandler_x, MouseHandler.MouseHandler_y, var33, var10, var11, var9.width, var9.height); - } - - if (!Client.isMenuOpen && var33) { - if (var9.contentType == 1400) { - Tiles.worldMap.addElementMenuOptions(var10, var11, var9.width, var9.height, var17, var18); - } else { - method3798(var9, var17 - var10, var18 - var11); - } - } - - boolean var21; - int var23; - if (var32) { - for (int var20 = 0; var20 < var9.field2552.length; ++var20) { - var21 = false; - boolean var22 = false; - if (!var21 && var9.field2552[var20] != null) { - for (var23 = 0; var23 < var9.field2552[var20].length; ++var23) { - boolean var24 = false; - if (var9.field2684 != null) { - var24 = KeyHandler.KeyHandler_pressedKeys[var9.field2552[var20][var23]]; - } - - if (MusicPatchNode2.method3658(var9.field2552[var20][var23]) || var24) { - var21 = true; - if (var9.field2684 != null && var9.field2684[var20] > Client.cycle) { - break; - } - - byte var25 = var9.field2621[var20][var23]; - if (var25 == 0 || ((var25 & 8) == 0 || !KeyHandler.KeyHandler_pressedKeys[86] && !KeyHandler.KeyHandler_pressedKeys[82] && !KeyHandler.KeyHandler_pressedKeys[81]) && ((var25 & 2) == 0 || KeyHandler.KeyHandler_pressedKeys[86]) && ((var25 & 1) == 0 || KeyHandler.KeyHandler_pressedKeys[82]) && ((var25 & 4) == 0 || KeyHandler.KeyHandler_pressedKeys[81])) { - var22 = true; - break; - } - } - } - } - - if (var22) { - if (var20 < 10) { - WorldMapSection1.widgetDefaultMenuAction(var20 + 1, var9.id, var9.childIndex, var9.itemId, ""); - } else if (var20 == 10) { - class208.Widget_runOnTargetLeave(); - class32.selectSpell(var9.id, var9.childIndex, class2.method30(class2.getWidgetClickMask(var9)), var9.itemId); - Client.selectedSpellActionName = VerticalAlignment.method4321(var9); - if (Client.selectedSpellActionName == null) { - Client.selectedSpellActionName = "null"; - } - - Client.selectedSpellName = var9.dataText + World.colorStartTag(16777215); - } - - var23 = var9.field2586[var20]; - if (var9.field2684 == null) { - var9.field2684 = new int[var9.field2552.length]; - } - - if (var9.field2548 == null) { - var9.field2548 = new int[var9.field2552.length]; - } - - if (var23 != 0) { - if (var9.field2684[var20] == 0) { - var9.field2684[var20] = var23 + Client.cycle + var9.field2548[var20]; - } else { - var9.field2684[var20] = var23 + Client.cycle; - } - } else { - var9.field2684[var20] = Integer.MAX_VALUE; - } - } - - if (!var21 && var9.field2684 != null) { - var9.field2684[var20] = 0; - } - } - } - - if (var9.isIf3) { - if (MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { - var33 = true; - } else { - var33 = false; - } - - boolean var34 = false; - if ((MouseHandler.MouseHandler_currentButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_currentButton == 4) && var33) { - var34 = true; - } - - var21 = false; - if ((MouseHandler.MouseHandler_lastButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= var12 && MouseHandler.MouseHandler_lastPressedY >= var13 && MouseHandler.MouseHandler_lastPressedX < var14 && MouseHandler.MouseHandler_lastPressedY < var15) { - var21 = true; - } - - if (var21) { - class227.clickWidget(var9, MouseHandler.MouseHandler_lastPressedX - var10, MouseHandler.MouseHandler_lastPressedY - var11); - } - - if (var9.contentType == 1400) { - Tiles.worldMap.method6445(var17, var18, var33 & var34, var33 & var21); - } - - if (Client.clickedWidget != null && var9 != Client.clickedWidget && var33 && GrandExchangeOfferTotalQuantityComparator.method93(class2.getWidgetClickMask(var9))) { - Client.draggedOnWidget = var9; - } - - if (var9 == Client.clickedWidgetParent) { - Client.field814 = true; - Client.field695 = var10; - Client.field816 = var11; - } - - if (var9.hasListener) { - ScriptEvent var27; - if (var33 && Client.mouseWheelRotation != 0 && var9.onScroll != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseY = Client.mouseWheelRotation; - var27.args = var9.onScroll; - Client.scriptEvents.addFirst(var27); - } - - if (Client.clickedWidget != null || Frames.dragInventoryWidget != null || Client.isMenuOpen) { - var21 = false; - var34 = false; - var33 = false; - } - - if (!var9.isClicked && var21) { - var9.isClicked = true; - if (var9.onClick != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_lastPressedX - var10; - var27.mouseY = MouseHandler.MouseHandler_lastPressedY - var11; - var27.args = var9.onClick; - Client.scriptEvents.addFirst(var27); - } - } - - if (var9.isClicked && var34 && var9.onClickRepeat != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_x - var10; - var27.mouseY = MouseHandler.MouseHandler_y - var11; - var27.args = var9.onClickRepeat; - Client.scriptEvents.addFirst(var27); - } - - if (var9.isClicked && !var34) { - var9.isClicked = false; - if (var9.onRelease != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_x - var10; - var27.mouseY = MouseHandler.MouseHandler_y - var11; - var27.args = var9.onRelease; - Client.field763.addFirst(var27); - } - } - - if (var34 && var9.onHold != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_x - var10; - var27.mouseY = MouseHandler.MouseHandler_y - var11; - var27.args = var9.onHold; - Client.scriptEvents.addFirst(var27); - } - - if (!var9.containsMouse && var33) { - var9.containsMouse = true; - if (var9.onMouseOver != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_x - var10; - var27.mouseY = MouseHandler.MouseHandler_y - var11; - var27.args = var9.onMouseOver; - Client.scriptEvents.addFirst(var27); - } - } - - if (var9.containsMouse && var33 && var9.onMouseRepeat != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_x - var10; - var27.mouseY = MouseHandler.MouseHandler_y - var11; - var27.args = var9.onMouseRepeat; - Client.scriptEvents.addFirst(var27); - } - - if (var9.containsMouse && !var33) { - var9.containsMouse = false; - if (var9.onMouseLeave != null) { - var27 = new ScriptEvent(); - var27.isMouseInputEvent = true; - var27.widget = var9; - var27.mouseX = MouseHandler.MouseHandler_x - var10; - var27.mouseY = MouseHandler.MouseHandler_y - var11; - var27.args = var9.onMouseLeave; - Client.field763.addFirst(var27); - } - } - - if (var9.onTimer != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onTimer; - Client.field836.addFirst(var27); - } - - ScriptEvent var28; - int var35; - int var36; - if (var9.onVarTransmit != null && Client.field823 > var9.field2620) { - if (var9.varTransmitTriggers != null && Client.field823 - var9.field2620 <= 32) { - label876: - for (var35 = var9.field2620; var35 < Client.field823; ++var35) { - var23 = Client.field782[var35 & 31]; - - for (var36 = 0; var36 < var9.varTransmitTriggers.length; ++var36) { - if (var23 == var9.varTransmitTriggers[var36]) { - var28 = new ScriptEvent(); - var28.widget = var9; - var28.args = var9.onVarTransmit; - Client.scriptEvents.addFirst(var28); - break label876; - } - } - } - } else { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onVarTransmit; - Client.scriptEvents.addFirst(var27); - } - - var9.field2620 = Client.field823; - } - - if (var9.onInvTransmit != null && Client.field825 > var9.field2680) { - if (var9.invTransmitTriggers != null && Client.field825 - var9.field2680 <= 32) { - label852: - for (var35 = var9.field2680; var35 < Client.field825; ++var35) { - var23 = Client.field820[var35 & 31]; - - for (var36 = 0; var36 < var9.invTransmitTriggers.length; ++var36) { - if (var23 == var9.invTransmitTriggers[var36]) { - var28 = new ScriptEvent(); - var28.widget = var9; - var28.args = var9.onInvTransmit; - Client.scriptEvents.addFirst(var28); - break label852; - } - } - } - } else { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onInvTransmit; - Client.scriptEvents.addFirst(var27); - } - - var9.field2680 = Client.field825; - } - - if (var9.onStatTransmit != null && Client.changedSkillsCount > var9.field2681) { - if (var9.statTransmitTriggers != null && Client.changedSkillsCount - var9.field2681 <= 32) { - label828: - for (var35 = var9.field2681; var35 < Client.changedSkillsCount; ++var35) { - var23 = Client.changedSkills[var35 & 31]; - - for (var36 = 0; var36 < var9.statTransmitTriggers.length; ++var36) { - if (var23 == var9.statTransmitTriggers[var36]) { - var28 = new ScriptEvent(); - var28.widget = var9; - var28.args = var9.onStatTransmit; - Client.scriptEvents.addFirst(var28); - break label828; - } - } - } - } else { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onStatTransmit; - Client.scriptEvents.addFirst(var27); - } - - var9.field2681 = Client.changedSkillsCount; - } - - if (Client.chatCycle > var9.field2558 && var9.onChatTransmit != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onChatTransmit; - Client.scriptEvents.addFirst(var27); - } - - if (Client.field744 > var9.field2558 && var9.onFriendTransmit != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onFriendTransmit; - Client.scriptEvents.addFirst(var27); - } - - if (Client.field830 > var9.field2558 && var9.onClanTransmit != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onClanTransmit; - Client.scriptEvents.addFirst(var27); - } - - if (Client.field831 > var9.field2558 && var9.onStockTransmit != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onStockTransmit; - Client.scriptEvents.addFirst(var27); - } - - if (Client.field832 > var9.field2558 && var9.field2662 != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.field2662; - Client.scriptEvents.addFirst(var27); - } - - if (Client.field833 > var9.field2558 && var9.onMiscTransmit != null) { - var27 = new ScriptEvent(); - var27.widget = var9; - var27.args = var9.onMiscTransmit; - Client.scriptEvents.addFirst(var27); - } - - var9.field2558 = Client.cycleCntr; - if (var9.onKey != null) { - for (var35 = 0; var35 < Client.field857; ++var35) { - ScriptEvent var29 = new ScriptEvent(); - var29.widget = var9; - var29.keyTyped = Client.field859[var35]; - var29.keyPressed = Client.field858[var35]; - var29.args = var9.onKey; - Client.scriptEvents.addFirst(var29); - } - } - } - } - - if (!var9.isIf3) { - if (Client.clickedWidget != null || Frames.dragInventoryWidget != null || Client.isMenuOpen) { - continue; - } - - if ((var9.mouseOverRedirect >= 0 || var9.mouseOverColor != 0) && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { - if (var9.mouseOverRedirect >= 0) { - NetSocket.mousedOverWidgetIf1 = var0[var9.mouseOverRedirect]; - } else { - NetSocket.mousedOverWidgetIf1 = var9; - } - } - - if (var9.type == 8 && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15) { - Strings.field2767 = var9; - } - - if (var9.scrollHeight > var9.height) { - WorldMapAreaData.method719(var9, var10 + var9.width, var11, var9.height, var9.scrollHeight, MouseHandler.MouseHandler_x, MouseHandler.MouseHandler_y); - } - } - - if (var9.type == 0) { - updateInterface(var0, var9.id, var12, var13, var14, var15, var10 - var9.scrollX, var11 - var9.scrollY); - if (var9.children != null) { - updateInterface(var9.children, var9.id, var12, var13, var14, var15, var10 - var9.scrollX, var11 - var9.scrollY); - } - - InterfaceParent var30 = (InterfaceParent)Client.interfaceParents.get((long)var9.id); - if (var30 != null) { - if (var30.type == 0 && MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var13 && MouseHandler.MouseHandler_x < var14 && MouseHandler.MouseHandler_y < var15 && !Client.isMenuOpen) { - for (ScriptEvent var31 = (ScriptEvent)Client.scriptEvents.last(); var31 != null; var31 = (ScriptEvent)Client.scriptEvents.previous()) { - if (var31.isMouseInputEvent) { - var31.remove(); - var31.widget.containsMouse = false; - } - } - - if (ViewportMouse.widgetDragDuration == 0) { - Client.clickedWidget = null; - Client.clickedWidgetParent = null; - } - - if (!Client.isMenuOpen) { - KeyHandler.addCancelMenuEntry(); - } - } - - AbstractWorldMapData.updateRootInterface(var30.group, var12, var13, var14, var15, var10, var11); - } - } - } - } - } - } - + public static void method3973() { + WorldMapElement.WorldMapElement_cachedSprites.clear(); } } diff --git a/runescape-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java index fa0eca9746..9e75decad3 100644 --- a/runescape-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -1,96 +1,104 @@ -import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gf") +@ObfuscatedName("gp") @Implements("MusicPatchNode2") public class MusicPatchNode2 { - @ObfuscatedName("i") - @ObfuscatedGetter( - intValue = -1235370225 - ) - public static int field2382; - @ObfuscatedName("z") - byte[] field2376; + @ObfuscatedName("a") + byte[] field2364; + @ObfuscatedName("t") + byte[] field2361; @ObfuscatedName("n") - byte[] field2374; - @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 93349913 + intValue = -269057751 ) - int field2375; - @ObfuscatedName("u") - @ObfuscatedGetter( - intValue = -1109994129 - ) - int field2373; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = 1372771045 - ) - int field2377; - @ObfuscatedName("p") - @ObfuscatedGetter( - intValue = 1580268847 - ) - int field2378; + int field2371; @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1867393453 + intValue = -390074671 ) - int field2379; - @ObfuscatedName("m") + int field2366; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1316855939 + intValue = -1385616309 ) - int field2380; - @ObfuscatedName("y") + int field2363; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1262915041 + intValue = 1962896855 ) - int field2381; + int field2365; + @ObfuscatedName("c") + @ObfuscatedGetter( + intValue = 353135561 + ) + int field2360; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = -538931737 + ) + int field2367; + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = 1418952589 + ) + int field2368; MusicPatchNode2() { } - @ObfuscatedName("fq") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-521075601" + signature = "(I)V", + garbageValue = "-1508520519" ) - @Export("playSong") - static void playSong(int var0) { - if (var0 == -1 && !Client.field759) { - VertexNormal.method2960(); - } else if (var0 != -1 && var0 != Client.field666 && Client.field761 != 0 && !Client.field759) { - Archive var1 = class225.archive6; - int var2 = Client.field761; - class197.field2386 = 1; - class197.musicTrackArchive = var1; - class188.musicTrackGroupId = var0; - class49.musicTrackFileId = 0; - TileItem.field1223 = var2; - WorldMapSectionType.musicTrackBoolean = false; - field2382 = 2; + static void method3829() { + class237.field3174 = new int[2000]; + int var0 = 0; + int var1 = 240; + + int var3; + for (byte var2 = 12; var0 < 16; var1 -= var2) { + var3 = WorldMapSprite.method472((double)((float)var1 / 360.0F), 0.9998999834060669D, (double)((float)var0 * 0.425F / 16.0F + 0.075F)); + class237.field3174[var0] = var3; + ++var0; } - Client.field666 = var0; - } + var1 = 48; - @ObfuscatedName("ic") - @ObfuscatedSignature( - signature = "(IB)Z", - garbageValue = "-93" - ) - static boolean method3658(int var0) { - for (int var1 = 0; var1 < Client.field857; ++var1) { - if (Client.field859[var1] == var0) { - return true; + for (int var5 = var1 / 6; var0 < class237.field3174.length; var1 -= var5) { + var3 = var0 * 2; + + for (int var4 = WorldMapSprite.method472((double)((float)var1 / 360.0F), 0.9998999834060669D, 0.5D); var0 < var3 && var0 < class237.field3174.length; ++var0) { + class237.field3174[var0] = var4; } } - return false; + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;I)V", + garbageValue = "-1954771173" + ) + public static void method3831(AbstractArchive var0) { + FloorUnderlayDefinition.FloorUnderlayDefinition_archive = var0; + } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(Lhq;IIIZI)V", + garbageValue = "1856110966" + ) + public static void method3830(AbstractArchive var0, int var1, int var2, int var3, boolean var4) { + class197.field2377 = 1; + class247.musicTrackArchive = var0; + class189.musicTrackGroupId = var1; + class197.musicTrackFileId = var2; + class197.field2379 = var3; + ScriptFrame.musicTrackBoolean = var4; + class197.field2384 = 10000; } } diff --git a/runescape-client/src/main/java/MusicPatchPcmStream.java b/runescape-client/src/main/java/MusicPatchPcmStream.java index 0c93df451a..66d6035683 100644 --- a/runescape-client/src/main/java/MusicPatchPcmStream.java +++ b/runescape-client/src/main/java/MusicPatchPcmStream.java @@ -3,33 +3,33 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gp") +@ObfuscatedName("gd") @Implements("MusicPatchPcmStream") public class MusicPatchPcmStream extends PcmStream { - @ObfuscatedName("r") - @Export("SpriteBuffer_yOffsets") - public static int[] SpriteBuffer_yOffsets; - @ObfuscatedName("z") + @ObfuscatedName("aj") + @Export("null_string") + protected static String null_string; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgb;" + signature = "Lgg;" ) @Export("superStream") MidiPcmStream superStream; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("queue") NodeDeque queue; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lca;" + signature = "Lct;" ) @Export("mixer") PcmStreamMixer mixer; @ObfuscatedSignature( - signature = "(Lgb;)V" + signature = "(Lgg;)V" ) MusicPatchPcmStream(MidiPcmStream var1) { this.queue = new NodeDeque(); @@ -37,48 +37,48 @@ public class MusicPatchPcmStream extends PcmStream { this.superStream = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lgu;[IIIII)V", - garbageValue = "1901627378" + signature = "(Lgq;[IIIII)V", + garbageValue = "1620688263" ) - void method3879(MusicPatchNode var1, int[] var2, int var3, int var4, int var5) { - if ((this.superStream.field2404[var1.field2420] & 4) != 0 && var1.field2433 < 0) { - int var6 = this.superStream.field2401[var1.field2420] / UrlRequest.PcmPlayer_sampleRate; + void method4044(MusicPatchNode var1, int[] var2, int var3, int var4, int var5) { + if ((this.superStream.field2386[var1.field2425] & 4) != 0 && var1.field2428 < 0) { + int var6 = this.superStream.field2403[var1.field2425] / (PcmPlayer.PcmPlayer_sampleRate * 22050); while (true) { - int var7 = (var6 + 1048575 - var1.field2419) / var6; + int var7 = (var6 + 1048575 - var1.field2434) / var6; if (var7 > var4) { - var1.field2419 += var6 * var4; + var1.field2434 += var4 * var6; break; } var1.stream.fill(var2, var3, var7); var3 += var7; var4 -= var7; - var1.field2419 += var7 * var6 - 1048576; - int var8 = UrlRequest.PcmPlayer_sampleRate / 100; + var1.field2434 += var7 * var6 - 1048576; + int var8 = PcmPlayer.PcmPlayer_sampleRate * 22050 / 100; int var9 = 262144 / var6; if (var9 < var8) { var8 = var9; } RawPcmStream var10 = var1.stream; - if (this.superStream.field2408[var1.field2420] == 0) { - var1.stream = RawPcmStream.method2548(var1.rawSound, var10.method2531(), var10.method2522(), var10.method2523()); + if (this.superStream.field2401[var1.field2425] == 0) { + var1.stream = RawPcmStream.method2767(var1.rawSound, var10.method2714(), var10.method2705(), var10.method2844()); } else { - var1.stream = RawPcmStream.method2548(var1.rawSound, var10.method2531(), 0, var10.method2523()); - this.superStream.method3682(var1, var1.patch.field2457[var1.field2424] < 0); - var1.stream.method2527(var8, var10.method2522()); + var1.stream = RawPcmStream.method2767(var1.rawSound, var10.method2714(), 0, var10.method2844()); + this.superStream.method3885(var1, var1.patch.field2460[var1.field2419] < 0); + var1.stream.method2706(var8, var10.method2705()); } - if (var1.patch.field2457[var1.field2424] < 0) { + if (var1.patch.field2460[var1.field2419] < 0) { var1.stream.setNumLoops(-1); } - var10.method2529(var8); + var10.method2722(var8); var10.fill(var2, var3, var5 - var3); - if (var10.method2533()) { + if (var10.method2716()) { this.mixer.addSubStream(var10); } } @@ -87,38 +87,38 @@ public class MusicPatchPcmStream extends PcmStream { var1.stream.fill(var2, var3, var4); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lgu;IB)V", - garbageValue = "66" + signature = "(Lgq;IB)V", + garbageValue = "115" ) - void method3875(MusicPatchNode var1, int var2) { - if ((this.superStream.field2404[var1.field2420] & 4) != 0 && var1.field2433 < 0) { - int var3 = this.superStream.field2401[var1.field2420] / UrlRequest.PcmPlayer_sampleRate; - int var4 = (var3 + 1048575 - var1.field2419) / var3; - var1.field2419 = var3 * var2 + var1.field2419 & 1048575; + void method4045(MusicPatchNode var1, int var2) { + if ((this.superStream.field2386[var1.field2425] & 4) != 0 && var1.field2428 < 0) { + int var3 = this.superStream.field2403[var1.field2425] / (PcmPlayer.PcmPlayer_sampleRate * 22050); + int var4 = (var3 + 1048575 - var1.field2434) / var3; + var1.field2434 = var3 * var2 + var1.field2434 & 1048575; if (var4 <= var2) { - if (this.superStream.field2408[var1.field2420] == 0) { - var1.stream = RawPcmStream.method2548(var1.rawSound, var1.stream.method2531(), var1.stream.method2522(), var1.stream.method2523()); + if (this.superStream.field2401[var1.field2425] == 0) { + var1.stream = RawPcmStream.method2767(var1.rawSound, var1.stream.method2714(), var1.stream.method2705(), var1.stream.method2844()); } else { - var1.stream = RawPcmStream.method2548(var1.rawSound, var1.stream.method2531(), 0, var1.stream.method2523()); - this.superStream.method3682(var1, var1.patch.field2457[var1.field2424] < 0); + var1.stream = RawPcmStream.method2767(var1.rawSound, var1.stream.method2714(), 0, var1.stream.method2844()); + this.superStream.method3885(var1, var1.patch.field2460[var1.field2419] < 0); } - if (var1.patch.field2457[var1.field2424] < 0) { + if (var1.patch.field2460[var1.field2419] < 0) { var1.stream.setNumLoops(-1); } - var2 = var1.field2419 / var3; + var2 = var1.field2434 / var3; } } var1.stream.skip(var2); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("firstSubStream") protected PcmStream firstSubStream() { @@ -130,9 +130,9 @@ public class MusicPatchPcmStream extends PcmStream { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("nextSubStream") protected PcmStream nextSubStream() { @@ -147,83 +147,96 @@ public class MusicPatchPcmStream extends PcmStream { return var1.stream; } - @ObfuscatedName("m") - protected int vmethod3882() { + @ObfuscatedName("o") + protected int vmethod4063() { return 0; } - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("fill") protected void fill(int[] var1, int var2, int var3) { this.mixer.fill(var1, var2, var3); for (MusicPatchNode var6 = (MusicPatchNode)this.queue.last(); var6 != null; var6 = (MusicPatchNode)this.queue.previous()) { - if (!this.superStream.method3704(var6)) { + if (!this.superStream.method3880(var6)) { int var4 = var2; int var5 = var3; do { - if (var5 <= var6.field2438) { - this.method3879(var6, var1, var4, var5, var4 + var5); - var6.field2438 -= var5; + if (var5 <= var6.field2433) { + this.method4044(var6, var1, var4, var5, var5 + var4); + var6.field2433 -= var5; break; } - this.method3879(var6, var1, var4, var6.field2438, var4 + var5); - var4 += var6.field2438; - var5 -= var6.field2438; - } while(!this.superStream.method3705(var6, var1, var4, var5)); + this.method4044(var6, var1, var4, var6.field2433, var4 + var5); + var4 += var6.field2433; + var5 -= var6.field2433; + } while(!this.superStream.method3881(var6, var1, var4, var5)); } } } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("skip") protected void skip(int var1) { this.mixer.skip(var1); for (MusicPatchNode var3 = (MusicPatchNode)this.queue.last(); var3 != null; var3 = (MusicPatchNode)this.queue.previous()) { - if (!this.superStream.method3704(var3)) { + if (!this.superStream.method3880(var3)) { int var2 = var1; do { - if (var2 <= var3.field2438) { - this.method3875(var3, var2); - var3.field2438 -= var2; + if (var2 <= var3.field2433) { + this.method4045(var3, var2); + var3.field2433 -= var2; break; } - this.method3875(var3, var3.field2438); - var2 -= var3.field2438; - } while(!this.superStream.method3705(var3, (int[])null, 0, var2)); + this.method4045(var3, var3.field2433); + var2 -= var3.field2433; + } while(!this.superStream.method3881(var3, (int[])null, 0, var2)); } } } - @ObfuscatedName("gf") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIII)I", - garbageValue = "-2075145984" + signature = "([BZB)Ljava/lang/Object;", + garbageValue = "25" ) - @Export("getTileHeight") - static final int getTileHeight(int var0, int var1, int var2) { - int var3 = var0 >> 7; - int var4 = var1 >> 7; - if (var3 >= 0 && var4 >= 0 && var3 <= 103 && var4 <= 103) { - int var5 = var2; - if (var2 < 3 && (Tiles.Tiles_renderFlags[1][var3][var4] & 2) == 2) { - var5 = var2 + 1; - } - - int var6 = var0 & 127; - int var7 = var1 & 127; - int var8 = (128 - var6) * Tiles.Tiles_heights[var5][var3][var4] + var6 * Tiles.Tiles_heights[var5][var3 + 1][var4] >> 7; - int var9 = var6 * Tiles.Tiles_heights[var5][var3 + 1][var4 + 1] + Tiles.Tiles_heights[var5][var3][var4 + 1] * (128 - var6) >> 7; - return var9 * var7 + var8 * (128 - var7) >> 7; + public static Object method4064(byte[] var0, boolean var1) { + if (var0 == null) { + return null; + } else if (var0.length > 136) { + DirectByteArrayCopier var2 = new DirectByteArrayCopier(); + var2.set(var0); + return var2; } else { - return 0; + return var0; } } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "57344" + ) + static void method4038() { + Tiles.Tiles_minPlane = 99; + SoundSystem.field1414 = new byte[4][104][104]; + Tiles.field485 = new byte[4][104][104]; + Tiles.field482 = new byte[4][104][104]; + Tiles.field483 = new byte[4][104][104]; + Tiles.field488 = new int[4][105][105]; + class96.field1300 = new byte[4][105][105]; + UserComparator10.field1964 = new int[105][105]; + Tiles.Tiles_hue = new int[104]; + Tiles.Tiles_saturation = new int[104]; + Tiles.Tiles_lightness = new int[104]; + Tiles.Tiles_hueMultiplier = new int[104]; + PlayerType.field3083 = new int[104]; + } } diff --git a/runescape-client/src/main/java/MusicTrack.java b/runescape-client/src/main/java/MusicTrack.java index 3e90fe1419..22af7e20ef 100644 --- a/runescape-client/src/main/java/MusicTrack.java +++ b/runescape-client/src/main/java/MusicTrack.java @@ -3,21 +3,21 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gh") +@ObfuscatedName("gb") @Implements("MusicTrack") public class MusicTrack extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("table") NodeHashTable table; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("midi") byte[] midi; @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) MusicTrack(Buffer var1) { var1.offset = var1.array.length - 3; @@ -196,7 +196,7 @@ public class MusicTrack extends Node { int[] var59 = new int[128]; var28 = 0; - label221: + label220: for (int var60 = 0; var60 < var2; ++var60) { var51.writeInt(1297379947); var51.offset += 4; @@ -218,7 +218,7 @@ public class MusicTrack extends Node { var51.writeByte(47); var51.writeByte(0); var51.writeLengthInt(var51.offset - var61); - continue label221; + continue label220; } if (var64 == 23) { @@ -335,8 +335,8 @@ public class MusicTrack extends Node { } - @ObfuscatedName("n") - void method3895() { + @ObfuscatedName("t") + void method4072() { if (this.table == null) { this.table = new NodeHashTable(16); int[] var1 = new int[16]; @@ -353,7 +353,7 @@ public class MusicTrack extends Node { var4.markTrackPosition(var6); } - label56: + label53: do { while (true) { var6 = var4.getPrioritizedTrack(); @@ -365,7 +365,7 @@ public class MusicTrack extends Node { if (var8 == 1) { var4.setTrackDone(); var4.markTrackPosition(var6); - continue label56; + continue label53; } int var9 = var8 & 240; @@ -416,15 +416,15 @@ public class MusicTrack extends Node { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("clear") void clear() { this.table = null; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;II)Lgh;" + signature = "(Lhq;II)Lgb;" ) @Export("readTrack") public static MusicTrack readTrack(AbstractArchive var0, int var1, int var2) { diff --git a/runescape-client/src/main/java/NPC.java b/runescape-client/src/main/java/NPC.java index 30b27fc115..081ad5f4e6 100644 --- a/runescape-client/src/main/java/NPC.java +++ b/runescape-client/src/main/java/NPC.java @@ -1,21 +1,20 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ck") +@ObfuscatedName("cv") @Implements("NPC") public final class NPC extends Actor { - @ObfuscatedName("ej") - @ObfuscatedGetter( - intValue = 2095761251 - ) - @Export("port3") - static int port3; - @ObfuscatedName("z") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lil;" + signature = "Llw;" + ) + @Export("titleboxSprite") + static IndexedSprite titleboxSprite; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "Lit;" ) @Export("definition") NPCDefinition definition; @@ -23,12 +22,12 @@ public final class NPC extends Actor { NPC() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IBB)V", - garbageValue = "-90" + signature = "(IBI)V", + garbageValue = "9999999" ) - final void method2048(int var1, byte var2) { + final void method2174(int var1, byte var2) { int var3 = super.pathX[0]; int var4 = super.pathY[0]; if (var1 == 0) { @@ -67,7 +66,7 @@ public final class NPC extends Actor { --var4; } - if (super.sequence != -1 && GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.sequence).field3510 == 1) { + if (super.sequence != -1 && PlayerType.SequenceDefinition_get(super.sequence).field3513 == 1) { super.sequence = -1; } @@ -86,13 +85,13 @@ public final class NPC extends Actor { super.pathTraversed[0] = var2; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIZB)V", - garbageValue = "1" + garbageValue = "111" ) - final void method2042(int var1, int var2, boolean var3) { - if (super.sequence != -1 && GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.sequence).field3510 == 1) { + final void method2178(int var1, int var2, boolean var3) { + if (super.sequence != -1 && PlayerType.SequenceDefinition_get(super.sequence).field3513 == 1) { super.sequence = -1; } @@ -118,26 +117,26 @@ public final class NPC extends Actor { } super.pathLength = 0; - super.field988 = 0; - super.field949 = 0; + super.field983 = 0; + super.field982 = 0; super.pathX[0] = var1; super.pathY[0] = var2; - super.x = super.pathX[0] * 128 + super.size * -527978816; - super.y = super.pathY[0] * 128 + super.size * -527978816; + super.x = super.field927 * 64 + super.pathX[0] * 128; + super.y = super.field927 * 64 + super.pathY[0] * 128; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected final Model getModel() { if (this.definition == null) { return null; } else { - SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.sequence) : null; - SequenceDefinition var2 = super.movementSequence != -1 && (super.movementSequence != super.readySequence || var1 == null) ? GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.movementSequence) : null; + SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? PlayerType.SequenceDefinition_get(super.sequence) : null; + SequenceDefinition var2 = super.movementSequence != -1 && (super.readySequence != super.movementSequence || var1 == null) ? PlayerType.SequenceDefinition_get(super.movementSequence) : null; Model var3 = this.definition.getModel(var1, super.sequenceFrame, var2, super.movementFrame); if (var3 == null) { return null; @@ -145,9 +144,9 @@ public final class NPC extends Actor { var3.calculateBoundsCylinder(); super.defaultHeight = var3.height; if (super.spotAnimation != -1 && super.spotAnimationFrame != -1) { - Model var4 = InterfaceParent.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); + Model var4 = MenuAction.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); if (var4 != null) { - var4.offsetBy(0, -super.heightOffset, 0); + var4.offsetBy(0, -super.field965, 0); Model[] var5 = new Model[]{var3, var4}; var3 = new Model(var5, 2); } @@ -162,26 +161,13 @@ public final class NPC extends Actor { } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(S)Z", - garbageValue = "180" + signature = "(B)Z", + garbageValue = "-25" ) @Export("isVisible") final boolean isVisible() { return this.definition != null; } - - @ObfuscatedName("x") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;II)V", - garbageValue = "89732729" - ) - static final void method2050(String var0, int var1) { - PacketBufferNode var2 = InterfaceParent.getPacketBufferNode(ClientPacket.field2254, Client.packetWriter.isaacCipher); - var2.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var0) + 1); - var2.packetBuffer.writeByte(var1); - var2.packetBuffer.writeStringCp1252NullTerminated(var0); - Client.packetWriter.addNode(var2); - } } diff --git a/runescape-client/src/main/java/NPCDefinition.java b/runescape-client/src/main/java/NPCDefinition.java index 91c45edf4f..e6deb60185 100644 --- a/runescape-client/src/main/java/NPCDefinition.java +++ b/runescape-client/src/main/java/NPCDefinition.java @@ -4,185 +4,185 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("il") +@ObfuscatedName("it") @Implements("NPCDefinition") public class NPCDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("NpcDefinition_archive") - public static AbstractArchive NpcDefinition_archive; - @ObfuscatedName("n") + static AbstractArchive NpcDefinition_archive; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("NpcDefinition_modelArchive") - public static AbstractArchive NpcDefinition_modelArchive; - @ObfuscatedName("v") + static AbstractArchive NpcDefinition_modelArchive; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("NpcDefinition_cached") public static EvictingDualNodeHashTable NpcDefinition_cached; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("NpcDefinition_cachedModels") public static EvictingDualNodeHashTable NpcDefinition_cachedModels; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 795033679 + intValue = -1672011881 ) @Export("id") public int id; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("name") public String name; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -441203939 + intValue = -974449841 ) @Export("size") public int size; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("models") int[] models; - @ObfuscatedName("y") - int[] field3448; @ObfuscatedName("i") + int[] field3476; + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -182220755 + intValue = -1219183499 ) @Export("readySequence") public int readySequence; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -1669190657 + intValue = 898691697 ) @Export("turnLeftSequence") public int turnLeftSequence; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -394985883 + intValue = -125318447 ) @Export("turnRightSequence") public int turnRightSequence; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 1951589919 + intValue = 638028449 ) @Export("walkSequence") public int walkSequence; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 1113665339 + intValue = 645048551 ) @Export("walkBackSequence") public int walkBackSequence; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = -1204590857 + intValue = -1214563023 ) @Export("walkLeftSequence") public int walkLeftSequence; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = -2041030831 + intValue = -1718781665 ) @Export("walkRightSequence") public int walkRightSequence; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("recolorFrom") short[] recolorFrom; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("recolorTo") short[] recolorTo; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("retextureFrom") short[] retextureFrom; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("retextureTo") short[] retextureTo; - @ObfuscatedName("s") + @ObfuscatedName("z") @Export("actions") public String[] actions; @ObfuscatedName("f") @Export("drawMapDot") public boolean drawMapDot; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 1360683279 + intValue = 1902455939 ) @Export("combatLevel") public int combatLevel; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = 758770497 + intValue = -177695131 ) @Export("widthScale") int widthScale; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = -1757828027 + intValue = 1085992245 ) @Export("heightScale") int heightScale; - @ObfuscatedName("k") + @ObfuscatedName("y") @Export("isVisible") public boolean isVisible; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @ObfuscatedGetter( - intValue = 1963706097 + intValue = 1272817411 ) @Export("ambient") int ambient; - @ObfuscatedName("az") + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = -1216133169 + intValue = -430923911 ) @Export("contrast") int contrast; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @ObfuscatedGetter( - intValue = 246799047 + intValue = -222453249 ) @Export("headIconPrayer") public int headIconPrayer; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = 950956241 + intValue = -1317382483 ) @Export("rotation") public int rotation; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @Export("transforms") public int[] transforms; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @ObfuscatedGetter( - intValue = 1759904707 + intValue = 1215151999 ) @Export("transformVarbit") int transformVarbit; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @ObfuscatedGetter( - intValue = -313433817 + intValue = 1120874317 ) @Export("transformVarp") int transformVarp; - @ObfuscatedName("ax") + @ObfuscatedName("av") @Export("isInteractable") public boolean isInteractable; - @ObfuscatedName("as") + @ObfuscatedName("am") @Export("isClickable") public boolean isClickable; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @Export("isFollower") public boolean isFollower; - @ObfuscatedName("al") + @ObfuscatedName("ax") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("params") IterableNodeHashTable params; @@ -221,17 +221,17 @@ public class NPCDefinition extends DualNode { @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-117" + signature = "(I)V", + garbageValue = "-1100218543" ) @Export("postDecode") void postDecode() { } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-41" + signature = "(Lkc;I)V", + garbageValue = "-942023250" ) @Export("decode") void decode(Buffer var1) { @@ -245,10 +245,10 @@ public class NPCDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-1943278683" + signature = "(Lkc;II)V", + garbageValue = "1669409378" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -303,10 +303,10 @@ public class NPCDefinition extends DualNode { } } else if (var2 == 60) { var3 = var1.readUnsignedByte(); - this.field3448 = new int[var3]; + this.field3476 = new int[var3]; for (var4 = 0; var4 < var3; ++var4) { - this.field3448[var4] = var1.readUnsignedShort(); + this.field3476[var4] = var1.readUnsignedShort(); } } else if (var2 == 93) { this.drawMapDot = false; @@ -334,7 +334,7 @@ public class NPCDefinition extends DualNode { } else if (var2 == 111) { this.isFollower = true; } else if (var2 == 249) { - this.params = UserComparator5.readStringIntParameters(var1, this.params); + this.params = UserComparator10.readStringIntParameters(var1, this.params); } } else { this.transformVarbit = var1.readUnsignedShort(); @@ -370,10 +370,10 @@ public class NPCDefinition extends DualNode { } - @ObfuscatedName("r") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lix;ILix;IS)Ldh;", - garbageValue = "-24084" + signature = "(Liv;ILiv;II)Ldv;", + garbageValue = "445516226" ) @Export("getModel") public final Model getModel(SequenceDefinition var1, int var2, SequenceDefinition var3, int var4) { @@ -444,23 +444,23 @@ public class NPCDefinition extends DualNode { } } - @ObfuscatedName("p") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(B)Ldw;", - garbageValue = "58" + signature = "(B)Ldu;", + garbageValue = "4" ) @Export("getModelData") public final ModelData getModelData() { if (this.transforms != null) { NPCDefinition var1 = this.transform(); return var1 == null ? null : var1.getModelData(); - } else if (this.field3448 == null) { + } else if (this.field3476 == null) { return null; } else { boolean var5 = false; - for (int var2 = 0; var2 < this.field3448.length; ++var2) { - if (!NpcDefinition_modelArchive.tryLoadFile(this.field3448[var2], 0)) { + for (int var2 = 0; var2 < this.field3476.length; ++var2) { + if (!NpcDefinition_modelArchive.tryLoadFile(this.field3476[var2], 0)) { var5 = true; } } @@ -468,10 +468,10 @@ public class NPCDefinition extends DualNode { if (var5) { return null; } else { - ModelData[] var6 = new ModelData[this.field3448.length]; + ModelData[] var6 = new ModelData[this.field3476.length]; - for (int var3 = 0; var3 < this.field3448.length; ++var3) { - var6[var3] = ModelData.ModelData_get(NpcDefinition_modelArchive, this.field3448[var3], 0); + for (int var3 = 0; var3 < this.field3476.length; ++var3) { + var6[var3] = ModelData.ModelData_get(NpcDefinition_modelArchive, this.field3476[var3], 0); } ModelData var7; @@ -499,16 +499,16 @@ public class NPCDefinition extends DualNode { } } - @ObfuscatedName("q") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(I)Lil;", - garbageValue = "1423511184" + signature = "(B)Lit;", + garbageValue = "73" ) @Export("transform") public final NPCDefinition transform() { int var1 = -1; if (this.transformVarbit != -1) { - var1 = WorldMapSprite.getVarbit(this.transformVarbit); + var1 = UserComparator9.getVarbit(this.transformVarbit); } else if (this.transformVarp != -1) { var1 = Varps.Varps_main[this.transformVarp]; } @@ -520,13 +520,13 @@ public class NPCDefinition extends DualNode { var2 = this.transforms[this.transforms.length - 1]; } - return var2 != -1 ? PacketBufferNode.getNpcDefinition(var2) : null; + return var2 != -1 ? SecureRandomCallable.getNpcDefinition(var2) : null; } - @ObfuscatedName("m") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(B)Z", - garbageValue = "-43" + garbageValue = "101" ) @Export("transformIsVisible") public boolean transformIsVisible() { @@ -535,7 +535,7 @@ public class NPCDefinition extends DualNode { } else { int var1 = -1; if (this.transformVarbit != -1) { - var1 = WorldMapSprite.getVarbit(this.transformVarbit); + var1 = UserComparator9.getVarbit(this.transformVarbit); } else if (this.transformVarp != -1) { var1 = Varps.Varps_main[this.transformVarp]; } @@ -548,85 +548,68 @@ public class NPCDefinition extends DualNode { } } - @ObfuscatedName("y") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(III)I", - garbageValue = "-1804168798" + garbageValue = "-955776181" ) @Export("getIntParam") public int getIntParam(int var1, int var2) { - return HealthBar.method2034(this.params, var1, var2); + return FriendsList.method5306(this.params, var1, var2); } - @ObfuscatedName("i") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(ILjava/lang/String;I)Ljava/lang/String;", - garbageValue = "-1270482233" + signature = "(ILjava/lang/String;B)Ljava/lang/String;", + garbageValue = "-81" ) @Export("getStringParam") public String getStringParam(int var1, String var2) { - return class96.method2263(this.params, var1, var2); + IterableNodeHashTable var4 = this.params; + String var3; + if (var4 == null) { + var3 = var2; + } else { + ObjectNode var5 = (ObjectNode)var4.get((long)var1); + if (var5 == null) { + var3 = var2; + } else { + var3 = (String)var5.obj; + } + } + + return var3; } - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;III)Llf;", - garbageValue = "-1092680498" + signature = "(II)Lkt;", + garbageValue = "287929847" ) - @Export("SpriteBuffer_getSprite") - public static Sprite SpriteBuffer_getSprite(AbstractArchive var0, int var1, int var2) { - return !VertexNormal.method2962(var0, var1, var2) ? null : FillMode.method6030(); + public static PrivateChatMode method4881(int var0) { + PrivateChatMode[] var1 = new PrivateChatMode[]{PrivateChatMode.field3778, PrivateChatMode.field3782, PrivateChatMode.field3779}; + PrivateChatMode[] var2 = var1; + + for (int var3 = 0; var3 < var2.length; ++var3) { + PrivateChatMode var4 = var2[var3]; + if (var0 == var4.field3781) { + return var4; + } + } + + return null; } - @ObfuscatedName("gr") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IIIIIIII)V", - garbageValue = "474931921" + signature = "(B)V", + garbageValue = "-2" ) - static final void method4677(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { - int var8 = var6 - 334; - if (var8 < 0) { - var8 = 0; - } else if (var8 > 100) { - var8 = 100; - } - - int var9 = (Client.zoomWidth - Client.zoomHeight) * var8 / 100 + Client.zoomHeight; - int var7 = var5 * var9 / 256; - var8 = 2048 - var3 & 2047; - var9 = 2048 - var4 & 2047; - int var10 = 0; - int var11 = 0; - int var12 = var7; - int var13; - int var14; - int var15; - if (var8 != 0) { - var13 = Rasterizer3D.Rasterizer3D_sine[var8]; - var14 = Rasterizer3D.Rasterizer3D_cosine[var8]; - var15 = var11 * var14 - var7 * var13 >> 16; - var12 = var14 * var7 + var13 * var11 >> 16; - var11 = var15; - } - - if (var9 != 0) { - var13 = Rasterizer3D.Rasterizer3D_sine[var9]; - var14 = Rasterizer3D.Rasterizer3D_cosine[var9]; - var15 = var10 * var14 + var13 * var12 >> 16; - var12 = var12 * var14 - var10 * var13 >> 16; - var10 = var15; - } - - GrandExchangeOfferOwnWorldComparator.cameraX = var0 - var10; - Varcs.cameraY = var1 - var11; - WorldMapIcon_1.cameraZ = var2 - var12; - IgnoreList.cameraPitch = var3; - WorldMapSection2.cameraYaw = var4; - if (Client.oculusOrbState == 1 && Client.staffModLevel >= 2 && Client.cycle % 50 == 0 && (ObjectSound.oculusOrbFocalPointX >> 7 != class223.localPlayer.x >> 7 || class14.oculusOrbFocalPointY >> 7 != class223.localPlayer.y >> 7)) { - var13 = class223.localPlayer.plane; - var14 = class223.baseX * 64 + (ObjectSound.oculusOrbFocalPointX >> 7); - var15 = class286.baseY * 64 + (class14.oculusOrbFocalPointY >> 7); - class287.method5220(var14, var15, var13, true); + public static void method4880() { + if (MouseHandler.MouseHandler_instance != null) { + synchronized(MouseHandler.MouseHandler_instance) { + MouseHandler.MouseHandler_instance = null; + } } } diff --git a/runescape-client/src/main/java/NanoClock.java b/runescape-client/src/main/java/NanoClock.java index 1e352e19e5..60200a9d65 100644 --- a/runescape-client/src/main/java/NanoClock.java +++ b/runescape-client/src/main/java/NanoClock.java @@ -4,77 +4,55 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fq") +@ObfuscatedName("fn") @Implements("NanoClock") public class NanoClock extends Clock { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - longValue = -5918640064271728259L + longValue = 3388451480976067985L ) @Export("lastTimeNano") long lastTimeNano; - NanoClock() { + public NanoClock() { this.lastTimeNano = System.nanoTime(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-54" + signature = "(I)V", + garbageValue = "1605126906" ) @Export("mark") public void mark() { this.lastTimeNano = System.nanoTime(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(III)I", - garbageValue = "569029249" + garbageValue = "432238723" ) @Export("wait") public int wait(int var1, int var2) { - long var3 = (long)var2 * 1000000L; + long var3 = 1000000L * (long)var2; long var5 = this.lastTimeNano - System.nanoTime(); if (var5 < var3) { var5 = var3; } - long var7 = var5 / 1000000L; - long var9; - if (var7 > 0L) { - if (var7 % 10L == 0L) { - var9 = var7 - 1L; + ClanChat.method5367(var5 / 1000000L); + long var7 = System.nanoTime(); - try { - Thread.sleep(var9); - } catch (InterruptedException var16) { - } - - try { - Thread.sleep(1L); - } catch (InterruptedException var15) { - } - } else { - try { - Thread.sleep(var7); - } catch (InterruptedException var14) { - } - } + int var9; + for (var9 = 0; var9 < 10 && (var9 < 1 || this.lastTimeNano < var7); this.lastTimeNano += 1000000L * (long)var1) { + ++var9; } - var9 = System.nanoTime(); - - int var13; - for (var13 = 0; var13 < 10 && (var13 < 1 || this.lastTimeNano < var9); this.lastTimeNano += 1000000L * (long)var1) { - ++var13; + if (this.lastTimeNano < var7) { + this.lastTimeNano = var7; } - if (this.lastTimeNano < var9) { - this.lastTimeNano = var9; - } - - return var13; + return var9; } } diff --git a/runescape-client/src/main/java/NetCache.java b/runescape-client/src/main/java/NetCache.java index 68d9ac0e14..a0cc3920a8 100644 --- a/runescape-client/src/main/java/NetCache.java +++ b/runescape-client/src/main/java/NetCache.java @@ -1,3 +1,4 @@ +import java.applet.Applet; import java.util.zip.CRC32; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; @@ -5,111 +6,111 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("io") +@ObfuscatedName("ip") @Implements("NetCache") public class NetCache { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lky;" + signature = "Lku;" ) @Export("NetCache_socket") - static AbstractSocket NetCache_socket; - @ObfuscatedName("n") + public static AbstractSocket NetCache_socket; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -76407529 + intValue = 2131672897 ) @Export("NetCache_loadTime") - static int NetCache_loadTime; - @ObfuscatedName("v") + public static int NetCache_loadTime; + @ObfuscatedName("n") @ObfuscatedGetter( - longValue = -6661371924416565423L + longValue = -9118761504647630833L ) - static long field3142; - @ObfuscatedName("u") + public static long field3149; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("NetCache_pendingPriorityWrites") - static NodeHashTable NetCache_pendingPriorityWrites; - @ObfuscatedName("r") + public static NodeHashTable NetCache_pendingPriorityWrites; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 2004934077 + intValue = 2036501335 ) @Export("NetCache_pendingPriorityWritesCount") - static int NetCache_pendingPriorityWritesCount; - @ObfuscatedName("p") + public static int NetCache_pendingPriorityWritesCount; + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("NetCache_pendingPriorityResponses") - static NodeHashTable NetCache_pendingPriorityResponses; - @ObfuscatedName("q") + public static NodeHashTable NetCache_pendingPriorityResponses; + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1183889597 + intValue = -158120331 ) @Export("NetCache_pendingPriorityResponsesCount") - static int NetCache_pendingPriorityResponsesCount; - @ObfuscatedName("m") + public static int NetCache_pendingPriorityResponsesCount; + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Lic;" + signature = "Lia;" ) @Export("NetCache_pendingWritesQueue") - static DualNodeDeque NetCache_pendingWritesQueue; - @ObfuscatedName("y") + public static DualNodeDeque NetCache_pendingWritesQueue; + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("NetCache_pendingWrites") static NodeHashTable NetCache_pendingWrites; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 809384467 + intValue = -1944921257 ) @Export("NetCache_pendingWritesCount") - static int NetCache_pendingWritesCount; - @ObfuscatedName("c") + public static int NetCache_pendingWritesCount; + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("NetCache_pendingResponses") - static NodeHashTable NetCache_pendingResponses; - @ObfuscatedName("b") + public static NodeHashTable NetCache_pendingResponses; + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 1880332209 + intValue = -2059126107 ) @Export("NetCache_pendingResponsesCount") - static int NetCache_pendingResponsesCount; - @ObfuscatedName("e") + public static int NetCache_pendingResponsesCount; + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Lkl;" + signature = "Lkc;" ) @Export("NetCache_responseHeaderBuffer") - static Buffer NetCache_responseHeaderBuffer; - @ObfuscatedName("t") + public static Buffer NetCache_responseHeaderBuffer; + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = 361699237 + intValue = 1307039295 ) - static int field3140; - @ObfuscatedName("x") - @Export("NetCache_crc") - static CRC32 NetCache_crc; + public static int field3161; @ObfuscatedName("s") + @Export("NetCache_crc") + public static CRC32 NetCache_crc; + @ObfuscatedName("z") @ObfuscatedSignature( - signature = "[Lie;" + signature = "[Lij;" ) @Export("NetCache_archives") - static Archive[] NetCache_archives; + public static Archive[] NetCache_archives; @ObfuscatedName("f") - static byte field3156; - @ObfuscatedName("j") + public static byte field3165; + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 2096105199 + intValue = 1710765987 ) @Export("NetCache_crcMismatches") public static int NetCache_crcMismatches; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -703948451 + intValue = 685821675 ) @Export("NetCache_ioExceptions") public static int NetCache_ioExceptions; @@ -126,44 +127,469 @@ public class NetCache { NetCache_pendingResponses = new NodeHashTable(4096); NetCache_pendingResponsesCount = 0; NetCache_responseHeaderBuffer = new Buffer(8); - field3140 = 0; + field3161 = 0; NetCache_crc = new CRC32(); NetCache_archives = new Archive[256]; - field3156 = 0; + field3165 = 0; NetCache_crcMismatches = 0; NetCache_ioExceptions = 0; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIS)Z", - garbageValue = "20573" + signature = "(Ljava/applet/Applet;Ljava/lang/String;I)V", + garbageValue = "2000682989" ) - static boolean method4296(int var0, int var1) { - return var0 != 4 || var1 < 8; + public static void method4472(Applet var0, String var1) { + class51.applet = var0; + if (var1 != null) { + class51.field416 = var1; + } + } - @ObfuscatedName("jk") + @ObfuscatedName("fl") @ObfuscatedSignature( - signature = "(Ljava/lang/String;B)V", - garbageValue = "-108" + signature = "(I)V", + garbageValue = "1138314742" ) - @Export("clanKickUser") - static final void clanKickUser(String var0) { - if (Varps.clanChat != null) { - PacketBufferNode var1 = InterfaceParent.getPacketBufferNode(ClientPacket.field2215, Client.packetWriter.isaacCipher); - var1.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var0)); - var1.packetBuffer.writeStringCp1252NullTerminated(var0); - Client.packetWriter.addNode(var1); + @Export("load") + static void load() { + int var0; + if (Client.titleLoadingStage == 0) { + WorldMapArea.scene = new Scene(4, 104, 104, Tiles.Tiles_heights); + + for (var0 = 0; var0 < 4; ++var0) { + Client.collisionMaps[var0] = new CollisionMap(104, 104); + } + + FloorDecoration.sceneMinimapSprite = new Sprite(512, 512); + Login.Login_loadingText = "Starting game engine..."; + Login.Login_loadingPercent = 5; + Client.titleLoadingStage = 20; + } else if (Client.titleLoadingStage == 20) { + Login.Login_loadingText = "Prepared visibility map"; + Login.Login_loadingPercent = 10; + Client.titleLoadingStage = 30; + } else if (Client.titleLoadingStage == 30) { + BuddyRankComparator.archive0 = WorldMapSectionType.newArchive(0, false, true, true); + LoginPacket.archive1 = WorldMapSectionType.newArchive(1, false, true, true); + AbstractWorldMapIcon.archive2 = WorldMapSectionType.newArchive(2, true, false, true); + SpriteMask.archive3 = WorldMapSectionType.newArchive(3, false, true, true); + NetFileRequest.archive4 = WorldMapSectionType.newArchive(4, false, true, true); + WorldMapRectangle.archive5 = WorldMapSectionType.newArchive(5, true, true, true); + class216.archive6 = WorldMapSectionType.newArchive(6, true, true, true); + Language.archive7 = WorldMapSectionType.newArchive(7, false, true, true); + GrandExchangeOfferUnitPriceComparator.archive8 = WorldMapSectionType.newArchive(8, false, true, true); + WorldMapSprite.archive9 = WorldMapSectionType.newArchive(9, false, true, true); + WorldMapID.archive10 = WorldMapSectionType.newArchive(10, false, true, true); + Decimator.archive11 = WorldMapSectionType.newArchive(11, false, true, true); + Occluder.archive12 = WorldMapSectionType.newArchive(12, false, true, true); + UrlRequest.archive13 = WorldMapSectionType.newArchive(13, true, false, true); + class192.archive14 = WorldMapSectionType.newArchive(14, false, true, true); + Coord.archive15 = WorldMapSectionType.newArchive(15, false, true, true); + DesktopPlatformInfoProvider.archive17 = WorldMapSectionType.newArchive(17, true, true, true); + WorldMapDecoration.archive18 = WorldMapSectionType.newArchive(18, false, true, true); + ReflectionCheck.archive19 = WorldMapSectionType.newArchive(19, false, true, true); + Actor.archive20 = WorldMapSectionType.newArchive(20, false, true, true); + Login.Login_loadingText = "Connecting to update server"; + Login.Login_loadingPercent = 20; + Client.titleLoadingStage = 40; + } else if (Client.titleLoadingStage == 40) { + byte var33 = 0; + var0 = var33 + BuddyRankComparator.archive0.percentage() * 4 / 100; + var0 += LoginPacket.archive1.percentage() * 4 / 100; + var0 += AbstractWorldMapIcon.archive2.percentage() * 2 / 100; + var0 += SpriteMask.archive3.percentage() * 2 / 100; + var0 += NetFileRequest.archive4.percentage() * 6 / 100; + var0 += WorldMapRectangle.archive5.percentage() * 4 / 100; + var0 += class216.archive6.percentage() * 2 / 100; + var0 += Language.archive7.percentage() * 56 / 100; + var0 += GrandExchangeOfferUnitPriceComparator.archive8.percentage() * 2 / 100; + var0 += WorldMapSprite.archive9.percentage() * 2 / 100; + var0 += WorldMapID.archive10.percentage() * 2 / 100; + var0 += Decimator.archive11.percentage() * 2 / 100; + var0 += Occluder.archive12.percentage() * 2 / 100; + var0 += UrlRequest.archive13.percentage() * 2 / 100; + var0 += class192.archive14.percentage() * 2 / 100; + var0 += Coord.archive15.percentage() * 2 / 100; + var0 += ReflectionCheck.archive19.percentage() / 100; + var0 += WorldMapDecoration.archive18.percentage() / 100; + var0 += Actor.archive20.percentage() / 100; + var0 += DesktopPlatformInfoProvider.archive17.method4409() && DesktopPlatformInfoProvider.archive17.isFullyLoaded() ? 1 : 0; + if (var0 != 100) { + if (var0 != 0) { + Login.Login_loadingText = "Checking for updates - " + var0 + "%"; + } + + Login.Login_loadingPercent = 30; + } else { + WorldMapID.method610(BuddyRankComparator.archive0, "Animations"); + WorldMapID.method610(LoginPacket.archive1, "Skeletons"); + WorldMapID.method610(NetFileRequest.archive4, "Sound FX"); + WorldMapID.method610(WorldMapRectangle.archive5, "Maps"); + WorldMapID.method610(class216.archive6, "Music Tracks"); + WorldMapID.method610(Language.archive7, "Models"); + WorldMapID.method610(GrandExchangeOfferUnitPriceComparator.archive8, "Sprites"); + WorldMapID.method610(Decimator.archive11, "Music Jingles"); + WorldMapID.method610(class192.archive14, "Music Samples"); + WorldMapID.method610(Coord.archive15, "Music Patches"); + WorldMapID.method610(ReflectionCheck.archive19, "World Map"); + WorldMapID.method610(WorldMapDecoration.archive18, "World Map Geography"); + WorldMapID.method610(Actor.archive20, "World Map Ground"); + class192.spriteIds = new GraphicsDefaults(); + class192.spriteIds.decode(DesktopPlatformInfoProvider.archive17); + Login.Login_loadingText = "Loaded update list"; + Login.Login_loadingPercent = 30; + Client.titleLoadingStage = 45; + } + } else if (Client.titleLoadingStage == 45) { + boolean var32 = !Client.isLowDetail; + PcmPlayer.PcmPlayer_sampleRate = 486202500; + InterfaceParent.PcmPlayer_stereo = var32; + ParamDefinition.PcmPlayer_count = 2; + MidiPcmStream var28 = new MidiPcmStream(); + var28.method3899(9, 128); + class80.pcmPlayer0 = PendingSpawn.method1856(GameShell.taskHandler, 0, 22050); + class80.pcmPlayer0.setStream(var28); + Clock.method3641(Coord.archive15, class192.archive14, NetFileRequest.archive4, var28); + MenuAction.pcmPlayer1 = PendingSpawn.method1856(GameShell.taskHandler, 1, 2048); + FloorUnderlayDefinition.pcmStreamMixer = new PcmStreamMixer(); + MenuAction.pcmPlayer1.setStream(FloorUnderlayDefinition.pcmStreamMixer); + AbstractWorldMapIcon.decimator = new Decimator(22050, PcmPlayer.PcmPlayer_sampleRate * 22050); + Login.Login_loadingText = "Prepared sound engine"; + Login.Login_loadingPercent = 35; + Client.titleLoadingStage = 50; + ModelData0.WorldMapElement_fonts = new Fonts(GrandExchangeOfferUnitPriceComparator.archive8, UrlRequest.archive13); + } else { + int var20; + if (Client.titleLoadingStage == 50) { + FontName[] var35 = new FontName[]{FontName.FontName_verdana15, FontName.FontName_verdana13, FontName.FontName_verdana11, FontName.FontName_bold12, FontName.FontName_plain11, FontName.FontName_plain12}; + var20 = var35.length; + Fonts var25 = ModelData0.WorldMapElement_fonts; + FontName[] var26 = new FontName[]{FontName.FontName_verdana15, FontName.FontName_verdana13, FontName.FontName_verdana11, FontName.FontName_bold12, FontName.FontName_plain11, FontName.FontName_plain12}; + Client.fontsMap = var25.createMap(var26); + if (Client.fontsMap.size() < var20) { + Login.Login_loadingText = "Loading fonts - " + Client.fontsMap.size() * 100 / var20 + "%"; + Login.Login_loadingPercent = 40; + } else { + class51.fontPlain11 = (Font)Client.fontsMap.get(FontName.FontName_plain11); + ArchiveDiskActionHandler.fontPlain12 = (Font)Client.fontsMap.get(FontName.FontName_plain12); + class43.fontBold12 = (Font)Client.fontsMap.get(FontName.FontName_bold12); + class216.platformInfo = Client.platformInfoProvider.get(); + Login.Login_loadingText = "Loaded fonts"; + Login.Login_loadingPercent = 40; + Client.titleLoadingStage = 60; + } + } else if (Client.titleLoadingStage == 60) { + var0 = GrandExchangeOfferNameComparator.method182(WorldMapID.archive10, GrandExchangeOfferUnitPriceComparator.archive8); + var20 = MusicPatch.method4037(); + if (var0 < var20) { + Login.Login_loadingText = "Loading title screen - " + var0 * 100 / var20 + "%"; + Login.Login_loadingPercent = 50; + } else { + Login.Login_loadingText = "Loaded title screen"; + Login.Login_loadingPercent = 50; + Tile.updateGameState(5); + Client.titleLoadingStage = 70; + } + } else { + Archive var2; + if (Client.titleLoadingStage == 70) { + if (!AbstractWorldMapIcon.archive2.isFullyLoaded()) { + Login.Login_loadingText = "Loading config - " + AbstractWorldMapIcon.archive2.loadPercent() + "%"; + Login.Login_loadingPercent = 60; + } else { + ArchiveLoader.method1235(AbstractWorldMapIcon.archive2); + MusicPatchNode2.method3831(AbstractWorldMapIcon.archive2); + Archive var34 = AbstractWorldMapIcon.archive2; + Archive var27 = Language.archive7; + KitDefinition.KitDefinition_archive = var34; + class43.KitDefinition_modelsArchive = var27; + KitDefinition.KitDefinition_fileCount = KitDefinition.KitDefinition_archive.getGroupFileCount(3); + var2 = AbstractWorldMapIcon.archive2; + Archive var3 = Language.archive7; + boolean var29 = Client.isLowDetail; + ObjectDefinition.ObjectDefinition_archive = var2; + ObjectDefinition.ObjectDefinition_modelsArchive = var3; + ObjectDefinition.ObjectDefinition_isLowDetail = var29; + Script.method2373(AbstractWorldMapIcon.archive2, Language.archive7); + Archive var30 = AbstractWorldMapIcon.archive2; + StructDefinition.StructDefinition_archive = var30; + Archive var6 = AbstractWorldMapIcon.archive2; + Archive var31 = Language.archive7; + boolean var8 = Client.isMembersWorld; + Font var9 = class51.fontPlain11; + ItemDefinition.ItemDefinition_archive = var6; + ItemDefinition.ItemDefinition_modelArchive = var31; + ItemDefinition.ItemDefinition_inMembersWorld = var8; + ItemDefinition.ItemDefinition_fileCount = ItemDefinition.ItemDefinition_archive.getGroupFileCount(10); + class30.ItemDefinition_fontPlain11 = var9; + class197.method3845(AbstractWorldMapIcon.archive2, BuddyRankComparator.archive0, LoginPacket.archive1); + PacketWriter.method2419(AbstractWorldMapIcon.archive2, Language.archive7); + AttackOption.method2221(AbstractWorldMapIcon.archive2); + WorldMapSection0.method263(AbstractWorldMapIcon.archive2); + TileItemPile.Widget_setArchives(SpriteMask.archive3, Language.archive7, GrandExchangeOfferUnitPriceComparator.archive8, UrlRequest.archive13); + Archive var10 = AbstractWorldMapIcon.archive2; + class1.InvDefinition_archive = var10; + class30.method607(AbstractWorldMapIcon.archive2); + Archive var11 = AbstractWorldMapIcon.archive2; + VarcInt.VarcInt_archive = var11; + Archive var12 = AbstractWorldMapIcon.archive2; + ParamDefinition.ParamDefinition_archive = var12; + class1.varcs = new Varcs(); + TaskHandler.method3622(AbstractWorldMapIcon.archive2, GrandExchangeOfferUnitPriceComparator.archive8, UrlRequest.archive13); + Archive var13 = AbstractWorldMapIcon.archive2; + Archive var14 = GrandExchangeOfferUnitPriceComparator.archive8; + HealthBarDefinition.HealthBarDefinition_archive = var13; + HealthBarDefinition.HitSplatDefinition_spritesArchive = var14; + Archive var15 = AbstractWorldMapIcon.archive2; + Archive var16 = GrandExchangeOfferUnitPriceComparator.archive8; + WorldMapElement.WorldMapElement_archive = var16; + if (var15.isFullyLoaded()) { + AbstractByteArrayCopier.WorldMapElement_count = var15.getGroupFileCount(35); + GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached = new WorldMapElement[AbstractByteArrayCopier.WorldMapElement_count]; + + for (int var17 = 0; var17 < AbstractByteArrayCopier.WorldMapElement_count; ++var17) { + byte[] var18 = var15.takeFile(35, var17); + GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached[var17] = new WorldMapElement(var17); + if (var18 != null) { + GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached[var17].decode(new Buffer(var18)); + GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached[var17].method4533(); + } + } + } + + Login.Login_loadingText = "Loaded config"; + Login.Login_loadingPercent = 60; + Client.titleLoadingStage = 80; + } + } else if (Client.titleLoadingStage == 80) { + var0 = 0; + if (class1.compass == null) { + class1.compass = MenuAction.SpriteBuffer_getSprite(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.compass, 0); + } else { + ++var0; + } + + if (class4.redHintArrowSprite == null) { + class4.redHintArrowSprite = MenuAction.SpriteBuffer_getSprite(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.field3787, 0); + } else { + ++var0; + } + + IndexedSprite[] var1; + IndexedSprite[] var5; + IndexedSprite var7; + int var21; + int var22; + if (GrandExchangeOfferWorldComparator.mapSceneSprites == null) { + var2 = GrandExchangeOfferUnitPriceComparator.archive8; + var21 = class192.spriteIds.mapScenes; + if (!class32.method618(var2, var21, 0)) { + var1 = null; + } else { + var5 = new IndexedSprite[class325.SpriteBuffer_spriteCount]; + + for (var22 = 0; var22 < class325.SpriteBuffer_spriteCount; ++var22) { + var7 = var5[var22] = new IndexedSprite(); + var7.width = class325.SpriteBuffer_spriteWidth; + var7.height = class325.SpriteBuffer_spriteHeight; + var7.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[var22]; + var7.yOffset = HealthBar.SpriteBuffer_yOffsets[var22]; + var7.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[var22]; + var7.subHeight = AttackOption.SpriteBuffer_spriteHeights[var22]; + var7.palette = class325.SpriteBuffer_spritePalette; + var7.pixels = class325.SpriteBuffer_pixels[var22]; + } + + WorldMapData_1.method787(); + var1 = var5; + } + + GrandExchangeOfferWorldComparator.mapSceneSprites = var1; + } else { + ++var0; + } + + if (FriendLoginUpdate.headIconPkSprites == null) { + FriendLoginUpdate.headIconPkSprites = class83.SpriteBuffer_getSpriteArray(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.headIconsPk, 0); + } else { + ++var0; + } + + if (Login.headIconPrayerSprites == null) { + Login.headIconPrayerSprites = class83.SpriteBuffer_getSpriteArray(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.field3790, 0); + } else { + ++var0; + } + + if (class14.headIconHintSprites == null) { + class14.headIconHintSprites = class83.SpriteBuffer_getSpriteArray(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.field3786, 0); + } else { + ++var0; + } + + if (GrandExchangeOfferOwnWorldComparator.mapMarkerSprites == null) { + GrandExchangeOfferOwnWorldComparator.mapMarkerSprites = class83.SpriteBuffer_getSpriteArray(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.field3791, 0); + } else { + ++var0; + } + + if (TextureProvider.crossSprites == null) { + TextureProvider.crossSprites = class83.SpriteBuffer_getSpriteArray(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.field3793, 0); + } else { + ++var0; + } + + if (class42.mapDotSprites == null) { + class42.mapDotSprites = class83.SpriteBuffer_getSpriteArray(GrandExchangeOfferUnitPriceComparator.archive8, class192.spriteIds.field3794, 0); + } else { + ++var0; + } + + if (NetSocket.scrollBarSprites == null) { + var2 = GrandExchangeOfferUnitPriceComparator.archive8; + var21 = class192.spriteIds.field3795; + if (!class32.method618(var2, var21, 0)) { + var1 = null; + } else { + var5 = new IndexedSprite[class325.SpriteBuffer_spriteCount]; + + for (var22 = 0; var22 < class325.SpriteBuffer_spriteCount; ++var22) { + var7 = var5[var22] = new IndexedSprite(); + var7.width = class325.SpriteBuffer_spriteWidth; + var7.height = class325.SpriteBuffer_spriteHeight; + var7.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[var22]; + var7.yOffset = HealthBar.SpriteBuffer_yOffsets[var22]; + var7.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[var22]; + var7.subHeight = AttackOption.SpriteBuffer_spriteHeights[var22]; + var7.palette = class325.SpriteBuffer_spritePalette; + var7.pixels = class325.SpriteBuffer_pixels[var22]; + } + + WorldMapData_1.method787(); + var1 = var5; + } + + NetSocket.scrollBarSprites = var1; + } else { + ++var0; + } + + if (VarcInt.modIconSprites == null) { + var2 = GrandExchangeOfferUnitPriceComparator.archive8; + var21 = class192.spriteIds.field3796; + if (!class32.method618(var2, var21, 0)) { + var1 = null; + } else { + var5 = new IndexedSprite[class325.SpriteBuffer_spriteCount]; + + for (var22 = 0; var22 < class325.SpriteBuffer_spriteCount; ++var22) { + var7 = var5[var22] = new IndexedSprite(); + var7.width = class325.SpriteBuffer_spriteWidth; + var7.height = class325.SpriteBuffer_spriteHeight; + var7.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[var22]; + var7.yOffset = HealthBar.SpriteBuffer_yOffsets[var22]; + var7.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[var22]; + var7.subHeight = AttackOption.SpriteBuffer_spriteHeights[var22]; + var7.palette = class325.SpriteBuffer_spritePalette; + var7.pixels = class325.SpriteBuffer_pixels[var22]; + } + + WorldMapData_1.method787(); + var1 = var5; + } + + VarcInt.modIconSprites = var1; + } else { + ++var0; + } + + if (var0 < 11) { + Login.Login_loadingText = "Loading sprites - " + var0 * 100 / 12 + "%"; + Login.Login_loadingPercent = 70; + } else { + AbstractFont.AbstractFont_modIconSprites = VarcInt.modIconSprites; + class4.redHintArrowSprite.normalize(); + var20 = (int)(Math.random() * 21.0D) - 10; + int var24 = (int)(Math.random() * 21.0D) - 10; + var21 = (int)(Math.random() * 21.0D) - 10; + int var4 = (int)(Math.random() * 41.0D) - 20; + GrandExchangeOfferWorldComparator.mapSceneSprites[0].shiftColors(var4 + var20, var24 + var4, var4 + var21); + Login.Login_loadingText = "Loaded sprites"; + Login.Login_loadingPercent = 70; + Client.titleLoadingStage = 90; + } + } else if (Client.titleLoadingStage == 90) { + if (!WorldMapSprite.archive9.isFullyLoaded()) { + Login.Login_loadingText = "Loading textures - " + "0%"; + Login.Login_loadingPercent = 90; + } else { + WorldMapArea.textureProvider = new TextureProvider(WorldMapSprite.archive9, GrandExchangeOfferUnitPriceComparator.archive8, 20, 0.8D, Client.isLowDetail ? 64 : 128); + Rasterizer3D.Rasterizer3D_setTextureLoader(WorldMapArea.textureProvider); + Rasterizer3D.Rasterizer3D_setBrightness(0.8D); + Client.titleLoadingStage = 100; + } + } else if (Client.titleLoadingStage == 100) { + var0 = WorldMapArea.textureProvider.getLoadedPercentage(); + if (var0 < 100) { + Login.Login_loadingText = "Loading textures - " + var0 + "%"; + Login.Login_loadingPercent = 90; + } else { + Login.Login_loadingText = "Loaded textures"; + Login.Login_loadingPercent = 90; + Client.titleLoadingStage = 110; + } + } else if (Client.titleLoadingStage == 110) { + class3.mouseRecorder = new MouseRecorder(); + GameShell.taskHandler.newThreadTask(class3.mouseRecorder, 10); + Login.Login_loadingText = "Loaded input handler"; + Login.Login_loadingPercent = 92; + Client.titleLoadingStage = 120; + } else if (Client.titleLoadingStage == 120) { + if (!WorldMapID.archive10.tryLoadFileByNames("huffman", "")) { + Login.Login_loadingText = "Loading wordpack - " + 0 + "%"; + Login.Login_loadingPercent = 94; + } else { + Huffman var19 = new Huffman(WorldMapID.archive10.takeFileByNames("huffman", "")); + VerticalAlignment.method4504(var19); + Login.Login_loadingText = "Loaded wordpack"; + Login.Login_loadingPercent = 94; + Client.titleLoadingStage = 130; + } + } else if (Client.titleLoadingStage == 130) { + if (!SpriteMask.archive3.isFullyLoaded()) { + Login.Login_loadingText = "Loading interfaces - " + SpriteMask.archive3.loadPercent() * 4 / 5 + "%"; + Login.Login_loadingPercent = 96; + } else if (!Occluder.archive12.isFullyLoaded()) { + Login.Login_loadingText = "Loading interfaces - " + (80 + Occluder.archive12.loadPercent() / 6) + "%"; + Login.Login_loadingPercent = 96; + } else if (!UrlRequest.archive13.isFullyLoaded()) { + Login.Login_loadingText = "Loading interfaces - " + (96 + UrlRequest.archive13.loadPercent() / 50) + "%"; + Login.Login_loadingPercent = 96; + } else { + Login.Login_loadingText = "Loaded interfaces"; + Login.Login_loadingPercent = 98; + Client.titleLoadingStage = 140; + } + } else if (Client.titleLoadingStage == 140) { + Login.Login_loadingPercent = 100; + if (!ReflectionCheck.archive19.tryLoadGroupByName(WorldMapCacheName.field288.name)) { + Login.Login_loadingText = "Loading world map - " + ReflectionCheck.archive19.groupLoadPercentByName(WorldMapCacheName.field288.name) / 10 + "%"; + } else { + if (Login.worldMap == null) { + Login.worldMap = new WorldMap(); + Login.worldMap.init(ReflectionCheck.archive19, WorldMapDecoration.archive18, Actor.archive20, class43.fontBold12, Client.fontsMap, GrandExchangeOfferWorldComparator.mapSceneSprites); + } + + Login.Login_loadingText = "Loaded world map"; + Client.titleLoadingStage = 150; + } + } else if (Client.titleLoadingStage == 150) { + Tile.updateGameState(10); + } + } } } - - @ObfuscatedName("kl") - @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "-101" - ) - static void method4279(int var0) { - Client.oculusOrbState = var0; - } } diff --git a/runescape-client/src/main/java/NetFileRequest.java b/runescape-client/src/main/java/NetFileRequest.java index c3ec6ab5c4..c1fb875d03 100644 --- a/runescape-client/src/main/java/NetFileRequest.java +++ b/runescape-client/src/main/java/NetFileRequest.java @@ -4,25 +4,52 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hc") +@ObfuscatedName("ho") @Implements("NetFileRequest") public class NetFileRequest extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("df") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lij;" + ) + @Export("archive4") + static Archive archive4; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "Lij;" ) @Export("archive") - Archive archive; - @ObfuscatedName("n") + public Archive archive; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -461319929 + intValue = 925703943 ) @Export("crc") - int crc; - @ObfuscatedName("v") + public int crc; + @ObfuscatedName("n") @Export("padding") - byte padding; + public byte padding; NetFileRequest() { } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(II)Lii;", + garbageValue = "-2050258581" + ) + public static HitSplatDefinition method4298(int var0) { + HitSplatDefinition var1 = (HitSplatDefinition)HitSplatDefinition.HitSplatDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = HitSplatDefinition.HitSplatDefinition_archive.takeFile(32, var0); + var1 = new HitSplatDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + + HitSplatDefinition.HitSplatDefinition_cached.put(var1, (long)var0); + return var1; + } + } } diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index be0b0995ae..23fcd5115b 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -9,72 +9,72 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fu") +@ObfuscatedName("fr") @Implements("NetSocket") public final class NetSocket extends AbstractSocket implements Runnable { - @ObfuscatedName("ly") + @ObfuscatedName("gv") @ObfuscatedSignature( - signature = "Lho;" + signature = "[Llw;" ) - @Export("mousedOverWidgetIf1") - static Widget mousedOverWidgetIf1; - @ObfuscatedName("z") + @Export("scrollBarSprites") + static IndexedSprite[] scrollBarSprites; + @ObfuscatedName("a") @Export("inputStream") InputStream inputStream; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("outputStream") OutputStream outputStream; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("socket") Socket socket; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("isClosed") boolean isClosed; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lfm;" + signature = "Lff;" ) @Export("taskHandler") TaskHandler taskHandler; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lfv;" + signature = "Lfw;" ) @Export("task") Task task; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("outBuffer") byte[] outBuffer; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -428981347 + intValue = -1560599267 ) @Export("outLength") int outLength; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 386347925 + intValue = -1803415659 ) @Export("outOffset") int outOffset; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("exceptionWriting") boolean exceptionWriting; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -539294119 + intValue = 1815160735 ) @Export("bufferLength") final int bufferLength; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 312930257 + intValue = 123096351 ) @Export("maxPacketLength") final int maxPacketLength; @ObfuscatedSignature( - signature = "(Ljava/net/Socket;Lfm;I)V" + signature = "(Ljava/net/Socket;Lff;I)V" ) public NetSocket(Socket var1, TaskHandler var2, int var3) throws IOException { this.isClosed = false; @@ -93,10 +93,10 @@ public final class NetSocket extends AbstractSocket implements Runnable { this.outputStream = this.socket.getOutputStream(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-119" + signature = "(I)V", + garbageValue = "1632517280" ) @Export("close") public void close() { @@ -108,10 +108,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { if (this.task != null) { while (this.task.status == 0) { - try { - Thread.sleep(1L); - } catch (InterruptedException var4) { - } + ClanChat.method5367(1L); } if (this.task.status == 1) { @@ -126,30 +123,30 @@ public final class NetSocket extends AbstractSocket implements Runnable { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1784126558" + signature = "(B)I", + garbageValue = "0" ) @Export("readUnsignedByte") public int readUnsignedByte() throws IOException { return this.isClosed ? 0 : this.inputStream.read(); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "3" + garbageValue = "-1" ) @Export("available") public int available() throws IOException { return this.isClosed ? 0 : this.inputStream.available(); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-336706705" + garbageValue = "1174929907" ) @Export("isAvailable") public boolean isAvailable(int var1) throws IOException { @@ -160,10 +157,10 @@ public final class NetSocket extends AbstractSocket implements Runnable { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "([BIII)I", - garbageValue = "-2035668362" + garbageValue = "1681485484" ) @Export("read") public int read(byte[] var1, int var2, int var3) throws IOException { @@ -185,10 +182,10 @@ public final class NetSocket extends AbstractSocket implements Runnable { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "([BIII)V", - garbageValue = "-2110504051" + garbageValue = "-340790701" ) @Export("write0") void write0(byte[] var1, int var2, int var3) throws IOException { @@ -205,7 +202,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { for (int var5 = 0; var5 < var3; ++var5) { this.outBuffer[this.outOffset] = var1[var5 + var2]; this.outOffset = (this.outOffset + 1) % this.bufferLength; - if ((this.maxPacketLength + this.outLength) % this.bufferLength == this.outOffset) { + if ((this.outLength + this.maxPacketLength) % this.bufferLength == this.outOffset) { throw new IOException(); } } @@ -220,20 +217,16 @@ public final class NetSocket extends AbstractSocket implements Runnable { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "([BIIB)V", - garbageValue = "-68" + signature = "([BIII)V", + garbageValue = "1989353375" ) @Export("write") public void write(byte[] var1, int var2, int var3) throws IOException { this.write0(var1, var2, var3); } - protected void finalize() { - this.close(); - } - public void run() { try { while (true) { @@ -241,7 +234,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { int var1; int var2; synchronized(this) { - if (this.outLength == this.outOffset) { + if (this.outOffset == this.outLength) { if (this.isClosed) { break label84; } @@ -273,7 +266,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { this.outLength = (var1 + this.outLength) % this.bufferLength; try { - if (this.outOffset == this.outLength) { + if (this.outLength == this.outOffset) { this.outputStream.flush(); } } catch (IOException var8) { @@ -301,240 +294,12 @@ public final class NetSocket extends AbstractSocket implements Runnable { break; } } catch (Exception var12) { - class32.RunException_sendStackTrace((String)null, var12); + User.RunException_sendStackTrace((String)null, var12); } } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "([Lga;II)Lga;", - garbageValue = "-846037107" - ) - @Export("findEnumerated") - public static Enumerated findEnumerated(Enumerated[] var0, int var1) { - Enumerated[] var2 = var0; - - for (int var3 = 0; var3 < var2.length; ++var3) { - Enumerated var4 = var2[var3]; - if (var1 == var4.rsOrdinal()) { - return var4; - } - } - - return null; - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;B)Z", - garbageValue = "-100" - ) - @Export("isNumber") - public static boolean isNumber(CharSequence var0) { - return MouseRecorder.method1209(var0, 10, true); - } - - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)Ljava/lang/String;", - garbageValue = "-175447114" - ) - public static String method3471(String var0) { - int var1 = var0.length(); - char[] var2 = new char[var1]; - byte var3 = 2; - - for (int var4 = 0; var4 < var1; ++var4) { - char var5 = var0.charAt(var4); - if (var3 == 0) { - var5 = Character.toLowerCase(var5); - } else if (var3 == 2 || Character.isUpperCase(var5)) { - var5 = UrlRequester.method3260(var5); - } - - if (Character.isLetter(var5)) { - var3 = 0; - } else if (var5 != '.' && var5 != '?' && var5 != '!') { - if (Character.isSpaceChar(var5)) { - if (var3 != 2) { - var3 = 1; - } - } else { - var3 = 1; - } - } else { - var3 = 2; - } - - var2[var4] = var5; - } - - return new String(var2); - } - - @ObfuscatedName("jp") - @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-1514465632" - ) - static final void method3472(int var0) { - class325.method6190(); - - for (ObjectSound var1 = (ObjectSound)ObjectSound.objectSounds.last(); var1 != null; var1 = (ObjectSound)ObjectSound.objectSounds.previous()) { - if (var1.obj != null) { - var1.set(); - } - } - - int var4 = AbstractWorldMapData.method288(var0).type; - if (var4 != 0) { - int var2 = Varps.Varps_main[var0]; - if (var4 == 1) { - if (var2 == 1) { - Rasterizer3D.Rasterizer3D_setBrightness(0.9D); - ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.9D); - } - - if (var2 == 2) { - Rasterizer3D.Rasterizer3D_setBrightness(0.8D); - ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.8D); - } - - if (var2 == 3) { - Rasterizer3D.Rasterizer3D_setBrightness(0.7D); - ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.7D); - } - - if (var2 == 4) { - Rasterizer3D.Rasterizer3D_setBrightness(0.6D); - ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.6D); - } - - ItemDefinition.ItemDefinition_cachedSprites.clear(); - } - - if (var4 == 3) { - short var3 = 0; - if (var2 == 0) { - var3 = 255; - } - - if (var2 == 1) { - var3 = 192; - } - - if (var2 == 2) { - var3 = 128; - } - - if (var2 == 3) { - var3 = 64; - } - - if (var2 == 4) { - var3 = 0; - } - - if (var3 != Client.field761) { - if (Client.field761 == 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, var3, false); - Client.field759 = false; - } else if (var3 == 0) { - VertexNormal.method2960(); - Client.field759 = false; - } else if (class197.field2386 != 0) { - TileItem.field1223 = var3; - } else { - class49.midiPcmStream.method3760(var3); - } - - Client.field761 = var3; - } - } - - if (var4 == 4) { - if (var2 == 0) { - Client.soundEffectVolume = 127; - } - - if (var2 == 1) { - Client.soundEffectVolume = 96; - } - - if (var2 == 2) { - Client.soundEffectVolume = 64; - } - - if (var2 == 3) { - Client.soundEffectVolume = 32; - } - - if (var2 == 4) { - Client.soundEffectVolume = 0; - } - } - - if (var4 == 5) { - Client.leftClickOpensMenu = var2; - } - - if (var4 == 6) { - Client.chatEffects = var2; - } - - if (var4 == 9) { - Client.field873 = var2; - } - - if (var4 == 10) { - if (var2 == 0) { - Client.field868 = 127; - } - - if (var2 == 1) { - Client.field868 = 96; - } - - if (var2 == 2) { - Client.field868 = 64; - } - - if (var2 == 3) { - Client.field868 = 32; - } - - if (var2 == 4) { - Client.field868 = 0; - } - } - - if (var4 == 17) { - Client.followerIndex = var2 & 65535; - } - - if (var4 == 18) { - Client.playerAttackOption = (AttackOption)findEnumerated(FloorUnderlayDefinition.method4395(), var2); - if (Client.playerAttackOption == null) { - Client.playerAttackOption = AttackOption.AttackOption_dependsOnCombatLevels; - } - } - - if (var4 == 19) { - if (var2 == -1) { - Client.combatTargetPlayerIndex = -1; - } else { - Client.combatTargetPlayerIndex = var2 & 2047; - } - } - - if (var4 == 22) { - Client.npcAttackOption = (AttackOption)findEnumerated(FloorUnderlayDefinition.method4395(), var2); - if (Client.npcAttackOption == null) { - Client.npcAttackOption = AttackOption.AttackOption_dependsOnCombatLevels; - } - } - - } + protected void finalize() { + this.close(); } } diff --git a/runescape-client/src/main/java/Node.java b/runescape-client/src/main/java/Node.java index cffab4b5da..7a056ea011 100644 --- a/runescape-client/src/main/java/Node.java +++ b/runescape-client/src/main/java/Node.java @@ -3,26 +3,26 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fx") +@ObfuscatedName("fd") @Implements("Node") public class Node { - @ObfuscatedName("cl") + @ObfuscatedName("cp") @Export("key") public long key; - @ObfuscatedName("cw") + @ObfuscatedName("cs") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("previous") public Node previous; - @ObfuscatedName("cq") + @ObfuscatedName("ck") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("next") public Node next; - @ObfuscatedName("fu") + @ObfuscatedName("fv") @Export("remove") public void remove() { if (this.next != null) { @@ -33,7 +33,7 @@ public class Node { } } - @ObfuscatedName("fa") + @ObfuscatedName("fk") @Export("hasNext") public boolean hasNext() { return this.next != null; diff --git a/runescape-client/src/main/java/NodeDeque.java b/runescape-client/src/main/java/NodeDeque.java index f95fe4f71b..50f89db756 100644 --- a/runescape-client/src/main/java/NodeDeque.java +++ b/runescape-client/src/main/java/NodeDeque.java @@ -3,18 +3,18 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jv") +@ObfuscatedName("jb") @Implements("NodeDeque") public class NodeDeque { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("sentinel") public Node sentinel; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("current") Node current; @@ -25,7 +25,7 @@ public class NodeDeque { this.sentinel.next = this.sentinel; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("clear") public void clear() { while (true) { @@ -39,9 +39,9 @@ public class NodeDeque { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lfx;)V" + signature = "(Lfd;)V" ) @Export("addFirst") public void addFirst(Node var1) { @@ -55,9 +55,9 @@ public class NodeDeque { var1.previous.next = var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lfx;)V" + signature = "(Lfd;)V" ) @Export("addLast") public void addLast(Node var1) { @@ -71,9 +71,9 @@ public class NodeDeque { var1.previous.next = var1; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("removeLast") public Node removeLast() { @@ -86,9 +86,9 @@ public class NodeDeque { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("removeFirst") public Node removeFirst() { @@ -101,9 +101,9 @@ public class NodeDeque { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("last") public Node last() { @@ -117,9 +117,9 @@ public class NodeDeque { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("first") public Node first() { @@ -133,9 +133,9 @@ public class NodeDeque { } } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("previous") public Node previous() { @@ -149,9 +149,9 @@ public class NodeDeque { } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("next") public Node next() { @@ -165,9 +165,9 @@ public class NodeDeque { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lfx;Lfx;)V" + signature = "(Lfd;Lfd;)V" ) @Export("NodeDeque_addBefore") public static void NodeDeque_addBefore(Node var0, Node var1) { diff --git a/runescape-client/src/main/java/NodeHashTable.java b/runescape-client/src/main/java/NodeHashTable.java index 19153bbee7..a25a05cde2 100644 --- a/runescape-client/src/main/java/NodeHashTable.java +++ b/runescape-client/src/main/java/NodeHashTable.java @@ -3,31 +3,31 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lq") +@ObfuscatedName("lh") @Implements("NodeHashTable") public final class NodeHashTable { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("size") int size; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "[Lfx;" + signature = "[Lfd;" ) @Export("buckets") Node[] buckets; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("currentGet") Node currentGet; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lfx;" + signature = "Lfd;" ) @Export("current") Node current; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("index") int index; @@ -44,9 +44,9 @@ public final class NodeHashTable { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(J)Lfx;" + signature = "(J)Lfd;" ) @Export("get") public Node get(long var1) { @@ -64,9 +64,9 @@ public final class NodeHashTable { return null; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lfx;J)V" + signature = "(Lfd;J)V" ) @Export("put") public void put(Node var1, long var2) { @@ -82,9 +82,9 @@ public final class NodeHashTable { var1.key = var2; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("first") public Node first() { @@ -92,9 +92,9 @@ public final class NodeHashTable { return this.next(); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "()Lfx;" + signature = "()Lfd;" ) @Export("next") public Node next() { diff --git a/runescape-client/src/main/java/ObjectDefinition.java b/runescape-client/src/main/java/ObjectDefinition.java index 5b0a6e8f72..7dada48640 100644 --- a/runescape-client/src/main/java/ObjectDefinition.java +++ b/runescape-client/src/main/java/ObjectDefinition.java @@ -4,257 +4,257 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("iz") +@ObfuscatedName("ix") @Implements("ObjectDefinition") public class ObjectDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("ObjectDefinition_isLowDetail") public static boolean ObjectDefinition_isLowDetail; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("ObjectDefinition_archive") public static AbstractArchive ObjectDefinition_archive; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("ObjectDefinition_modelsArchive") public static AbstractArchive ObjectDefinition_modelsArchive; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ObjectDefinition_cached") public static EvictingDualNodeHashTable ObjectDefinition_cached; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ObjectDefinition_cachedModelData") public static EvictingDualNodeHashTable ObjectDefinition_cachedModelData; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ObjectDefinition_cachedEntities") public static EvictingDualNodeHashTable ObjectDefinition_cachedEntities; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ObjectDefinition_cachedModels") public static EvictingDualNodeHashTable ObjectDefinition_cachedModels; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "[Ldw;" + signature = "[Ldu;" ) - static ModelData[] field3342; - @ObfuscatedName("y") + static ModelData[] field3343; + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -10424721 + intValue = -1993900589 ) @Export("id") public int id; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("modelIds") int[] modelIds; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("models") int[] models; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("name") public String name; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("recolorFrom") short[] recolorFrom; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("recolorTo") short[] recolorTo; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("retextureFrom") short[] retextureFrom; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("retextureTo") short[] retextureTo; - @ObfuscatedName("t") + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = -1768434003 + intValue = 422386915 ) @Export("sizeX") public int sizeX; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = -1471425107 + intValue = -344442861 ) @Export("sizeY") public int sizeY; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = 887491837 + intValue = 1570722017 ) @Export("interactType") public int interactType; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("boolean1") public boolean boolean1; - @ObfuscatedName("s") + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = 2069443219 + intValue = -1786719331 ) @Export("int1") public int int1; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = 1385916293 + intValue = 1182575987 ) @Export("clipType") int clipType; - @ObfuscatedName("j") + @ObfuscatedName("g") @Export("nonFlatShading") boolean nonFlatShading; - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("modelClipped") public boolean modelClipped; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = -1077296785 + intValue = -1591486693 ) @Export("animationId") public int animationId; - @ObfuscatedName("k") + @ObfuscatedName("y") @ObfuscatedGetter( - intValue = 1255987799 + intValue = 1214501493 ) @Export("int2") public int int2; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @ObfuscatedGetter( - intValue = -1443717983 + intValue = 1736897731 ) @Export("ambient") int ambient; - @ObfuscatedName("az") + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = -1558537711 + intValue = 1030392427 ) @Export("contrast") int contrast; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("actions") public String[] actions; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = 2127089139 + intValue = -1056926649 ) @Export("mapIconId") public int mapIconId; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedGetter( - intValue = 468378425 + intValue = -136330365 ) @Export("mapSceneId") public int mapSceneId; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @Export("isRotated") boolean isRotated; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("clipped") public boolean clipped; - @ObfuscatedName("ax") + @ObfuscatedName("av") @ObfuscatedGetter( - intValue = -1167602213 + intValue = -86408231 ) @Export("modelSizeX") int modelSizeX; - @ObfuscatedName("as") + @ObfuscatedName("am") @ObfuscatedGetter( - intValue = -570144093 + intValue = -2043356087 ) @Export("modelHeight") int modelHeight; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = 1741322051 + intValue = 972016097 ) @Export("modelSizeY") int modelSizeY; - @ObfuscatedName("al") + @ObfuscatedName("ax") @ObfuscatedGetter( - intValue = 771948197 + intValue = -1041382713 ) @Export("offsetX") int offsetX; - @ObfuscatedName("ad") + @ObfuscatedName("al") @ObfuscatedGetter( - intValue = 1528184415 + intValue = -1733868633 ) @Export("offsetHeight") int offsetHeight; - @ObfuscatedName("an") + @ObfuscatedName("ap") @ObfuscatedGetter( - intValue = 1216184101 + intValue = 74915989 ) @Export("offsetY") int offsetY; - @ObfuscatedName("ai") + @ObfuscatedName("aj") @Export("boolean2") public boolean boolean2; - @ObfuscatedName("ak") + @ObfuscatedName("ae") @Export("isSolid") boolean isSolid; - @ObfuscatedName("aq") + @ObfuscatedName("au") @ObfuscatedGetter( - intValue = 1194600097 + intValue = -395487905 ) @Export("int3") public int int3; - @ObfuscatedName("am") + @ObfuscatedName("ah") @Export("transforms") public int[] transforms; - @ObfuscatedName("ae") + @ObfuscatedName("an") @ObfuscatedGetter( - intValue = -702042991 + intValue = 955915521 ) @Export("transformVarbit") int transformVarbit; - @ObfuscatedName("av") + @ObfuscatedName("af") @ObfuscatedGetter( - intValue = 884373055 + intValue = -712370683 ) @Export("transformVarp") int transformVarp; - @ObfuscatedName("ah") + @ObfuscatedName("ay") @ObfuscatedGetter( - intValue = -214798847 + intValue = 176060935 ) @Export("ambientSoundId") public int ambientSoundId; - @ObfuscatedName("ag") + @ObfuscatedName("az") @ObfuscatedGetter( - intValue = -423945127 + intValue = 1665197725 ) @Export("int4") public int int4; - @ObfuscatedName("aj") + @ObfuscatedName("ao") @ObfuscatedGetter( - intValue = -1044165733 + intValue = -370053387 ) @Export("int5") public int int5; - @ObfuscatedName("ay") + @ObfuscatedName("ai") @ObfuscatedGetter( - intValue = -1994867697 + intValue = -307838615 ) @Export("int6") public int int6; - @ObfuscatedName("au") + @ObfuscatedName("ac") @Export("soundEffectIds") public int[] soundEffectIds; - @ObfuscatedName("af") + @ObfuscatedName("at") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("params") IterableNodeHashTable params; @@ -265,7 +265,7 @@ public class ObjectDefinition extends DualNode { ObjectDefinition_cachedModelData = new EvictingDualNodeHashTable(500); ObjectDefinition_cachedEntities = new EvictingDualNodeHashTable(30); ObjectDefinition_cachedModels = new EvictingDualNodeHashTable(30); - field3342 = new ModelData[4]; + field3343 = new ModelData[4]; } ObjectDefinition() { @@ -275,7 +275,7 @@ public class ObjectDefinition extends DualNode { this.interactType = 2; this.boolean1 = true; this.int1 = -1; - this.clipType = -256; + this.clipType = -1; this.nonFlatShading = false; this.modelClipped = false; this.animationId = -1; @@ -304,10 +304,10 @@ public class ObjectDefinition extends DualNode { this.int6 = 0; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "52" + signature = "(I)V", + garbageValue = "1701315891" ) @Export("postDecode") void postDecode() { @@ -330,10 +330,10 @@ public class ObjectDefinition extends DualNode { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "76" + signature = "(Lkc;I)V", + garbageValue = "-420175476" ) @Export("decode") void decode(Buffer var1) { @@ -347,10 +347,10 @@ public class ObjectDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-912301650" + signature = "(Lkc;IB)V", + garbageValue = "-2" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -481,11 +481,11 @@ public class ObjectDefinition extends DualNode { this.soundEffectIds[var4] = var1.readUnsignedShort(); } } else if (var2 == 81) { - this.clipType = var1.readUnsignedByte() * 65536; + this.clipType = var1.readUnsignedByte() * 256; } else if (var2 == 82) { this.mapIconId = var1.readUnsignedShort(); } else if (var2 == 249) { - this.params = UserComparator5.readStringIntParameters(var1, this.params); + this.params = UserComparator10.readStringIntParameters(var1, this.params); } } else { this.transformVarbit = var1.readUnsignedShort(); @@ -521,12 +521,12 @@ public class ObjectDefinition extends DualNode { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "1830976839" + signature = "(IB)Z", + garbageValue = "27" ) - public final boolean method4567(int var1) { + public final boolean method4737(int var1) { if (this.models != null) { for (int var4 = 0; var4 < this.models.length; ++var4) { if (this.models[var4] == var1) { @@ -550,10 +550,10 @@ public class ObjectDefinition extends DualNode { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "1580173918" + signature = "(B)Z", + garbageValue = "-46" ) @Export("needsModelFiles") public final boolean needsModelFiles() { @@ -570,10 +570,10 @@ public class ObjectDefinition extends DualNode { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(II[[IIIIB)Ler;", - garbageValue = "-50" + signature = "(II[[IIIII)Lep;", + garbageValue = "-500081982" ) @Export("getEntity") public final Entity getEntity(int var1, int var2, int[][] var3, int var4, int var5, int var6) { @@ -604,24 +604,24 @@ public class ObjectDefinition extends DualNode { } if (this.nonFlatShading) { - var9 = ((ModelData)var9).method2764(); + var9 = ((ModelData)var9).method2942(); } - if (this.clipType * 256 >= 0) { + if (this.clipType * 65536 >= 0) { if (var9 instanceof Model) { - var9 = ((Model)var9).contourGround(var3, var4, var5, var6, true, this.clipType * 256); + var9 = ((Model)var9).contourGround(var3, var4, var5, var6, true, this.clipType * 65536); } else if (var9 instanceof ModelData) { - var9 = ((ModelData)var9).method2765(var3, var4, var5, var6, true, this.clipType * 256); + var9 = ((ModelData)var9).method2943(var3, var4, var5, var6, true, this.clipType * 65536); } } return (Entity)var9; } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(II[[IIIII)Ldh;", - garbageValue = "-2129252392" + signature = "(II[[IIIIB)Ldv;", + garbageValue = "107" ) @Export("getModel") public final Model getModel(int var1, int var2, int[][] var3, int var4, int var5, int var6) { @@ -643,17 +643,17 @@ public class ObjectDefinition extends DualNode { ObjectDefinition_cachedModels.put(var9, var7); } - if (this.clipType * 256 >= 0) { - var9 = var9.contourGround(var3, var4, var5, var6, true, this.clipType * 256); + if (this.clipType * 65536 >= 0) { + var9 = var9.contourGround(var3, var4, var5, var6, true, this.clipType * 65536); } return var9; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(II[[IIIILix;II)Ldh;", - garbageValue = "680709040" + signature = "(II[[IIIILiv;II)Ldv;", + garbageValue = "-1457023019" ) @Export("getModelDynamic") public final Model getModelDynamic(int var1, int var2, int[][] var3, int var4, int var5, int var6, SequenceDefinition var7, int var8) { @@ -675,7 +675,7 @@ public class ObjectDefinition extends DualNode { ObjectDefinition_cachedModels.put(var11, var9); } - if (var7 == null && this.clipType * 256 == -1) { + if (var7 == null && this.clipType * 65536 == -1) { return var11; } else { if (var7 != null) { @@ -684,18 +684,18 @@ public class ObjectDefinition extends DualNode { var11 = var11.toSharedSequenceModel(true); } - if (this.clipType * 256 >= 0) { - var11 = var11.contourGround(var3, var4, var5, var6, false, this.clipType * 256); + if (this.clipType * 65536 >= 0) { + var11 = var11.contourGround(var3, var4, var5, var6, false, this.clipType * 65536); } return var11; } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(III)Ldw;", - garbageValue = "-1968594863" + signature = "(III)Ldu;", + garbageValue = "-1568760566" ) @Export("getModelData") final ModelData getModelData(int var1, int var2) { @@ -733,19 +733,19 @@ public class ObjectDefinition extends DualNode { } if (var4) { - var3.method2774(); + var3.method2951(); } ObjectDefinition_cachedModelData.put(var3, (long)var7); } if (var5 > 1) { - field3342[var6] = var3; + field3343[var6] = var3; } } if (var5 > 1) { - var3 = new ModelData(field3342, var5); + var3 = new ModelData(field3343, var5); } } else { int var9 = -1; @@ -775,7 +775,7 @@ public class ObjectDefinition extends DualNode { } if (var10) { - var3.method2774(); + var3.method2951(); } ObjectDefinition_cachedModelData.put(var3, (long)var5); @@ -795,19 +795,19 @@ public class ObjectDefinition extends DualNode { var11 = true; } - ModelData var8 = new ModelData(var3, var2 == 0 && !var4 && !var11, this.recolorFrom == null, null == this.retextureFrom, true); + ModelData var8 = new ModelData(var3, var2 == 0 && !var4 && !var11, this.recolorFrom == null, this.retextureFrom == null, true); if (var1 == 4 && var2 > 3) { - var8.method2767(256); + var8.method2948(256); var8.changeOffset(45, 0, -45); } var2 &= 3; if (var2 == 1) { - var8.method2835(); + var8.method2940(); } else if (var2 == 2) { - var8.method2761(); + var8.method2946(); } else if (var2 == 3) { - var8.method2800(); + var8.method2947(); } if (this.recolorFrom != null) { @@ -833,16 +833,16 @@ public class ObjectDefinition extends DualNode { return var8; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(B)Liz;", - garbageValue = "16" + signature = "(I)Lix;", + garbageValue = "-971549373" ) @Export("transform") public final ObjectDefinition transform() { int var1 = -1; if (this.transformVarbit != -1) { - var1 = WorldMapSprite.getVarbit(this.transformVarbit); + var1 = UserComparator9.getVarbit(this.transformVarbit); } else if (this.transformVarp != -1) { var1 = Varps.Varps_main[this.transformVarp]; } @@ -854,33 +854,46 @@ public class ObjectDefinition extends DualNode { var2 = this.transforms[this.transforms.length - 1]; } - return var2 != -1 ? GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var2) : null; + return var2 != -1 ? WorldMapDecorationType.getObjectDefinition(var2) : null; } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(IIB)I", - garbageValue = "79" + signature = "(III)I", + garbageValue = "222142374" ) @Export("getIntParam") public int getIntParam(int var1, int var2) { - return HealthBar.method2034(this.params, var1, var2); + return FriendsList.method5306(this.params, var1, var2); } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(ILjava/lang/String;B)Ljava/lang/String;", - garbageValue = "-65" + signature = "(ILjava/lang/String;I)Ljava/lang/String;", + garbageValue = "894744637" ) @Export("getStringParam") public String getStringParam(int var1, String var2) { - return class96.method2263(this.params, var1, var2); + IterableNodeHashTable var4 = this.params; + String var3; + if (var4 == null) { + var3 = var2; + } else { + ObjectNode var5 = (ObjectNode)var4.get((long)var1); + if (var5 == null) { + var3 = var2; + } else { + var3 = (String)var5.obj; + } + } + + return var3; } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "1401395643" + garbageValue = "2082133096" ) @Export("hasSound") public boolean hasSound() { @@ -889,7 +902,7 @@ public class ObjectDefinition extends DualNode { } else { for (int var1 = 0; var1 < this.transforms.length; ++var1) { if (this.transforms[var1] != -1) { - ObjectDefinition var2 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(this.transforms[var1]); + ObjectDefinition var2 = WorldMapDecorationType.getObjectDefinition(this.transforms[var1]); if (var2.ambientSoundId != -1 || var2.soundEffectIds != null) { return true; } @@ -899,4 +912,41 @@ public class ObjectDefinition extends DualNode { return false; } } + + @ObfuscatedName("jt") + @ObfuscatedSignature( + signature = "(Lhi;III)V", + garbageValue = "1536796270" + ) + @Export("alignWidgetPosition") + static void alignWidgetPosition(Widget var0, int var1, int var2) { + if (var0.xAlignment == 0) { + var0.x = var0.rawX; + } else if (var0.xAlignment == 1) { + var0.x = var0.rawX + (var1 - var0.width) / 2; + } else if (var0.xAlignment == 2) { + var0.x = var1 - var0.width - var0.rawX; + } else if (var0.xAlignment == 3) { + var0.x = var0.rawX * var1 >> 14; + } else if (var0.xAlignment == 4) { + var0.x = (var0.rawX * var1 >> 14) + (var1 - var0.width) / 2; + } else { + var0.x = var1 - var0.width - (var0.rawX * var1 >> 14); + } + + if (var0.yAlignment == 0) { + var0.y = var0.rawY; + } else if (var0.yAlignment == 1) { + var0.y = (var2 - var0.height) / 2 + var0.rawY; + } else if (var0.yAlignment == 2) { + var0.y = var2 - var0.height - var0.rawY; + } else if (var0.yAlignment == 3) { + var0.y = var2 * var0.rawY >> 14; + } else if (var0.yAlignment == 4) { + var0.y = (var2 - var0.height) / 2 + (var2 * var0.rawY >> 14); + } else { + var0.y = var2 - var0.height - (var2 * var0.rawY >> 14); + } + + } } diff --git a/runescape-client/src/main/java/ObjectNode.java b/runescape-client/src/main/java/ObjectNode.java index 0bb7334b6d..10f75a289b 100644 --- a/runescape-client/src/main/java/ObjectNode.java +++ b/runescape-client/src/main/java/ObjectNode.java @@ -2,10 +2,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("fn") +@ObfuscatedName("fj") @Implements("ObjectNode") public class ObjectNode extends Node { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("obj") public final Object obj; diff --git a/runescape-client/src/main/java/ObjectSound.java b/runescape-client/src/main/java/ObjectSound.java index 8460044691..e58ee234fe 100644 --- a/runescape-client/src/main/java/ObjectSound.java +++ b/runescape-client/src/main/java/ObjectSound.java @@ -4,102 +4,90 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bg") +@ObfuscatedName("bf") @Implements("ObjectSound") public final class ObjectSound extends Node { - @ObfuscatedName("pk") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llf;" - ) - @Export("sceneMinimapSprite") - static Sprite sceneMinimapSprite; - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("objectSounds") static NodeDeque objectSounds; - @ObfuscatedName("hs") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1030939799 - ) - @Export("oculusOrbFocalPointX") - static int oculusOrbFocalPointX; - @ObfuscatedName("z") - @ObfuscatedGetter( - intValue = 1622269101 - ) - int field1059; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = 1770378821 + intValue = 1227010727 ) @Export("plane") int plane; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -331149697 + intValue = -286465655 ) @Export("x") int x; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Liz;" - ) - @Export("obj") - ObjectDefinition obj; - @ObfuscatedName("p") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 514830237 + intValue = -1852994176 ) @Export("y") int y; - @ObfuscatedName("q") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -394210361 + intValue = 451765888 ) int field1060; - @ObfuscatedName("m") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1094960613 + intValue = -1453778816 ) - int field1061; - @ObfuscatedName("y") + int field1053; + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 287004655 + intValue = -186868357 + ) + int field1052; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 1676549815 ) @Export("soundEffectId") int soundEffectId; @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Ldu;" + signature = "Lds;" ) @Export("stream1") RawPcmStream stream1; - @ObfuscatedName("c") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 985540703 + intValue = 180162911 ) - int field1064; - @ObfuscatedName("b") + int field1057; + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -91764577 + intValue = -648009507 ) - int field1070; - @ObfuscatedName("o") + int field1058; + @ObfuscatedName("p") @Export("soundEffectIds") int[] soundEffectIds; - @ObfuscatedName("a") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 1113854033 + intValue = 423706127 ) - int field1067; - @ObfuscatedName("e") + int field1054; + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Ldu;" + signature = "Lds;" ) @Export("stream2") RawPcmStream stream2; + @ObfuscatedName("x") + @ObfuscatedSignature( + signature = "Lix;" + ) + @Export("obj") + ObjectDefinition obj; static { objectSounds = new NodeDeque(); @@ -108,10 +96,10 @@ public final class ObjectSound extends Node { ObjectSound() { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-28" + garbageValue = "-23" ) @Export("set") void set() { @@ -119,22 +107,37 @@ public final class ObjectSound extends Node { ObjectDefinition var2 = this.obj.transform(); if (var2 != null) { this.soundEffectId = var2.ambientSoundId; - this.field1061 = var2.int4 * 128; - this.field1064 = var2.int5; - this.field1070 = var2.int6; + this.field1052 = var2.int4 * 128; + this.field1057 = var2.int5; + this.field1058 = var2.int6; this.soundEffectIds = var2.soundEffectIds; } else { this.soundEffectId = -1; - this.field1061 = 0; - this.field1064 = 0; - this.field1070 = 0; + this.field1052 = 0; + this.field1057 = 0; + this.field1058 = 0; this.soundEffectIds = null; } if (var1 != this.soundEffectId && this.stream1 != null) { - WorldMapLabelSize.pcmStreamMixer.removeSubStream(this.stream1); + FloorUnderlayDefinition.pcmStreamMixer.removeSubStream(this.stream1); this.stream1 = null; } } + + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "(Lhi;IIII)V", + garbageValue = "1790951666" + ) + @Export("Widget_setKeyRate") + static final void Widget_setKeyRate(Widget var0, int var1, int var2, int var3) { + if (var0.field2628 == null) { + throw new RuntimeException(); + } else { + var0.field2628[var1] = var2; + var0.field2626[var1] = var3; + } + } } diff --git a/runescape-client/src/main/java/Occluder.java b/runescape-client/src/main/java/Occluder.java index 5559180fb0..e867d15a72 100644 --- a/runescape-client/src/main/java/Occluder.java +++ b/runescape-client/src/main/java/Occluder.java @@ -1,235 +1,184 @@ -import java.util.Date; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("es") +@ObfuscatedName("eh") @Implements("Occluder") public final class Occluder { - @ObfuscatedName("ns") - @ObfuscatedGetter( - intValue = 1790718175 + @ObfuscatedName("dt") + @ObfuscatedSignature( + signature = "Lij;" ) - static int field1889; - @ObfuscatedName("z") + @Export("archive12") + static Archive archive12; + @ObfuscatedName("iz") @ObfuscatedGetter( - intValue = 1195661333 + intValue = 1014742579 + ) + @Export("selectedItemId") + static int selectedItemId; + @ObfuscatedName("a") + @ObfuscatedGetter( + intValue = 2096461427 ) @Export("minTileX") int minTileX; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1045185805 + intValue = 658025365 ) @Export("maxTileX") int maxTileX; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1813082719 + intValue = -423718345 ) @Export("minTileY") int minTileY; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 2061838755 + intValue = 1740624753 ) @Export("maxTileY") int maxTileY; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1843610955 + intValue = 954528249 ) @Export("type") int type; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -629573769 + intValue = 1732339879 ) @Export("minX") int minX; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1170068749 + intValue = 1301635755 ) @Export("maxX") int maxX; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 1998915961 + intValue = -258867493 ) @Export("minZ") int minZ; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 88556865 + intValue = 1337393049 ) @Export("maxZ") int maxZ; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 1146642601 + intValue = 1306653599 ) @Export("minY") int minY; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -486759885 + intValue = 1760102387 ) @Export("maxY") int maxY; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -1230823835 + intValue = 1764224557 ) - int field1882; - @ObfuscatedName("o") + int field1869; + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -1799381643 - ) - int field1884; - @ObfuscatedName("a") - @ObfuscatedGetter( - intValue = -269756741 - ) - int field1871; - @ObfuscatedName("e") - @ObfuscatedGetter( - intValue = 1633183437 - ) - int field1885; - @ObfuscatedName("w") - @ObfuscatedGetter( - intValue = 265274287 - ) - int field1886; - @ObfuscatedName("t") - @ObfuscatedGetter( - intValue = -1265477601 - ) - int field1879; - @ObfuscatedName("g") - @ObfuscatedGetter( - intValue = -163200097 + intValue = -1705634243 ) int field1887; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = -682629895 + ) + int field1880; + @ObfuscatedName("x") + @ObfuscatedGetter( + intValue = -1219807155 + ) + int field1883; + @ObfuscatedName("j") + @ObfuscatedGetter( + intValue = 168844503 + ) + int field1884; + @ObfuscatedName("r") + @ObfuscatedGetter( + intValue = -1533789259 + ) + int field1882; + @ObfuscatedName("e") + @ObfuscatedGetter( + intValue = 1431077503 + ) + int field1885; Occluder() { } - @ObfuscatedName("n") + @ObfuscatedName("ir") @ObfuscatedSignature( - signature = "(II)Lit;", - garbageValue = "1430884212" + signature = "(II)Z", + garbageValue = "-1093183807" ) - @Export("ItemDefinition_get") - public static ItemDefinition ItemDefinition_get(int var0) { - ItemDefinition var1 = (ItemDefinition)ItemDefinition.ItemDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; + static final boolean method3415(int var0) { + if (var0 < 0) { + return false; } else { - byte[] var2 = ItemDefinition.ItemDefinition_archive.takeFile(10, var0); - var1 = new ItemDefinition(); - var1.id = var0; - if (var2 != null) { - var1.decode(new Buffer(var2)); + int var1 = Client.menuOpcodes[var0]; + if (var1 >= 2000) { + var1 -= 2000; } - var1.post(); - if (var1.noteTemplate != -1) { - var1.genCert(ItemDefinition_get(var1.noteTemplate), ItemDefinition_get(var1.note)); - } - - if (var1.notedId != -1) { - var1.genBought(ItemDefinition_get(var1.notedId), ItemDefinition_get(var1.unnotedId)); - } - - if (var1.placeholderTemplate != -1) { - var1.genPlaceholder(ItemDefinition_get(var1.placeholderTemplate), ItemDefinition_get(var1.placeholder)); - } - - if (!class162.ItemDefinition_inMembersWorld && var1.isMembersOnly) { - var1.name = "Members object"; - var1.isTradable = false; - var1.groundActions = null; - var1.inventoryActions = null; - var1.shiftClickIndex = -1; - var1.team = 0; - if (var1.params != null) { - boolean var3 = false; - - for (Node var4 = var1.params.first(); var4 != null; var4 = var1.params.next()) { - ParamDefinition var5 = WallDecoration.getParamDefinition((int)var4.key); - if (var5.autoDisable) { - var4.remove(); - } else { - var3 = true; - } - } - - if (!var3) { - var1.params = null; - } - } - } - - ItemDefinition.ItemDefinition_cached.put(var1, (long)var0); - return var1; + return var1 == 1007; } } - @ObfuscatedName("u") + @ObfuscatedName("ih") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-37" + garbageValue = "0" ) - public static void method3252() { - try { - JagexCache.JagexCache_dat2File.close(); + static final void method3416() { + boolean var0 = false; - for (int var0 = 0; var0 < JagexCache.idxCount; ++var0) { - class189.JagexCache_idxFiles[var0].close(); + while (!var0) { + var0 = true; + + for (int var1 = 0; var1 < Client.menuOptionsCount - 1; ++var1) { + if (Client.menuOpcodes[var1] < 1000 && Client.menuOpcodes[var1 + 1] > 1000) { + String var2 = Client.menuTargets[var1]; + Client.menuTargets[var1] = Client.menuTargets[var1 + 1]; + Client.menuTargets[var1 + 1] = var2; + String var3 = Client.menuActions[var1]; + Client.menuActions[var1] = Client.menuActions[var1 + 1]; + Client.menuActions[var1 + 1] = var3; + int var4 = Client.menuOpcodes[var1]; + Client.menuOpcodes[var1] = Client.menuOpcodes[var1 + 1]; + Client.menuOpcodes[var1 + 1] = var4; + var4 = Client.menuArguments1[var1]; + Client.menuArguments1[var1] = Client.menuArguments1[var1 + 1]; + Client.menuArguments1[var1 + 1] = var4; + var4 = Client.menuArguments2[var1]; + Client.menuArguments2[var1] = Client.menuArguments2[var1 + 1]; + Client.menuArguments2[var1 + 1] = var4; + var4 = Client.menuIdentifiers[var1]; + Client.menuIdentifiers[var1] = Client.menuIdentifiers[var1 + 1]; + Client.menuIdentifiers[var1 + 1] = var4; + boolean var5 = Client.menuShiftClick[var1]; + Client.menuShiftClick[var1] = Client.menuShiftClick[var1 + 1]; + Client.menuShiftClick[var1 + 1] = var5; + var0 = false; + } } - - JagexCache.JagexCache_idx255File.close(); - JagexCache.JagexCache_randomDat.close(); - } catch (Exception var2) { - } - - } - - @ObfuscatedName("ku") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "-1221499190" - ) - static void method3251(String var0) { - class197.field2390 = var0; - - try { - String var1 = ViewportMouse.client.getParameter(Integer.toString(18)); - String var2 = ViewportMouse.client.getParameter(Integer.toString(13)); - String var3 = var1 + "settings=" + var0 + "; version=1; path=/; domain=" + var2; - if (var0.length() == 0) { - var3 = var3 + "; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0"; - } else { - String var4 = var3 + "; Expires="; - long var6 = class30.currentTimeMillis() + 94608000000L; - Calendar.Calendar_calendar.setTime(new Date(var6)); - int var8 = Calendar.Calendar_calendar.get(7); - int var9 = Calendar.Calendar_calendar.get(5); - int var10 = Calendar.Calendar_calendar.get(2); - int var11 = Calendar.Calendar_calendar.get(1); - int var12 = Calendar.Calendar_calendar.get(11); - int var13 = Calendar.Calendar_calendar.get(12); - int var14 = Calendar.Calendar_calendar.get(13); - String var5 = Calendar.DAYS_OF_THE_WEEK[var8 - 1] + ", " + var9 / 10 + var9 % 10 + "-" + Calendar.MONTH_NAMES_ENGLISH_GERMAN[0][var10] + "-" + var11 + " " + var12 / 10 + var12 % 10 + ":" + var13 / 10 + var13 % 10 + ":" + var14 / 10 + var14 % 10 + " GMT"; - var3 = var4 + var5 + "; Max-Age=" + 94608000L; - } - - class47.method880(ViewportMouse.client, "document.cookie=\"" + var3 + "\""); - } catch (Throwable var15) { } } diff --git a/runescape-client/src/main/java/PacketBuffer.java b/runescape-client/src/main/java/PacketBuffer.java index 2bcb1bc691..8a52d0e150 100644 --- a/runescape-client/src/main/java/PacketBuffer.java +++ b/runescape-client/src/main/java/PacketBuffer.java @@ -3,88 +3,87 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; @ObfuscatedName("kf") @Implements("PacketBuffer") public class PacketBuffer extends Buffer { - @ObfuscatedName("n") - static final int[] field3695; - @ObfuscatedName("z") + @ObfuscatedName("t") + static final int[] field3688; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Llg;" + signature = "Llm;" ) @Export("isaacCipher") IsaacCipher isaacCipher; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1801396377 + intValue = 1939783175 ) @Export("bitIndex") int bitIndex; static { - field3695 = new int[]{0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215, 33554431, 67108863, 134217727, 268435455, 536870911, 1073741823, Integer.MAX_VALUE, -1}; + field3688 = new int[]{0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215, 33554431, 67108863, 134217727, 268435455, 536870911, 1073741823, Integer.MAX_VALUE, -1}; } public PacketBuffer(int var1) { super(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([II)V", - garbageValue = "2116683841" + signature = "([IS)V", + garbageValue = "-26147" ) @Export("newIsaacCipher") public void newIsaacCipher(int[] var1) { this.isaacCipher = new IsaacCipher(var1); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Llg;B)V", - garbageValue = "100" + signature = "(Llm;I)V", + garbageValue = "-514086463" ) @Export("setIsaacCipher") public void setIsaacCipher(IsaacCipher var1) { this.isaacCipher = var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1358666817" + garbageValue = "-509998000" ) @Export("writeByteIsaac") public void writeByteIsaac(int var1) { super.array[++super.offset - 1] = (byte)(var1 + this.isaacCipher.nextInt()); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-2099772642" + garbageValue = "1442543055" ) @Export("readByteIsaac") public int readByteIsaac() { return super.array[++super.offset - 1] - this.isaacCipher.nextInt() & 255; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-1080759401" + garbageValue = "387005570" ) - public boolean method5395() { - int var1 = super.array[super.offset] - this.isaacCipher.method6214() & 255; + public boolean method5586() { + int var1 = super.array[super.offset] - this.isaacCipher.method6378() & 255; return var1 >= 128; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "427431431" + signature = "(B)I", + garbageValue = "-68" ) @Export("readSmartByteShortIsaac") public int readSmartByteShortIsaac() { @@ -92,32 +91,32 @@ public class PacketBuffer extends Buffer { return var1 < 128 ? var1 : (var1 - 128 << 8) + (super.array[++super.offset - 1] - this.isaacCipher.nextInt() & 255); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "([BIII)V", - garbageValue = "1740365961" + signature = "([BIIB)V", + garbageValue = "1" ) - public void method5400(byte[] var1, int var2, int var3) { + public void method5558(byte[] var1, int var2, int var3) { for (int var4 = 0; var4 < var3; ++var4) { var1[var4 + var2] = (byte)(super.array[++super.offset - 1] - this.isaacCipher.nextInt()); } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1647095141" + garbageValue = "-168692906" ) @Export("importIndex") public void importIndex() { this.bitIndex = super.offset * 8; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(II)I", - garbageValue = "1367970229" + garbageValue = "431119758" ) @Export("readBits") public int readBits(int var1) { @@ -126,117 +125,36 @@ public class PacketBuffer extends Buffer { int var4 = 0; for (this.bitIndex += var1; var1 > var3; var3 = 8) { - var4 += (super.array[var2++] & field3695[var3]) << var1 - var3; + var4 += (super.array[var2++] & field3688[var3]) << var1 - var3; var1 -= var3; } if (var3 == var1) { - var4 += super.array[var2] & field3695[var3]; + var4 += super.array[var2] & field3688[var3]; } else { - var4 += super.array[var2] >> var3 - var1 & field3695[var1]; + var4 += super.array[var2] >> var3 - var1 & field3688[var1]; } return var4; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "4" + signature = "(I)V", + garbageValue = "-1200645632" ) @Export("exportIndex") public void exportIndex() { super.offset = (this.bitIndex + 7) / 8; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( signature = "(II)I", - garbageValue = "586994412" + garbageValue = "-2087325437" ) @Export("bitsRemaining") public int bitsRemaining(int var1) { return var1 * 8 - this.bitIndex; } - - @ObfuscatedName("aa") - @ObfuscatedSignature( - signature = "(ILcu;ZB)I", - garbageValue = "82" - ) - static int method5423(int var0, Script var1, boolean var2) { - int var3; - int var4; - int var6; - if (var0 == ScriptOpcodes.ENUM_STRING) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - EnumDefinition var5 = UserComparator10.getEnum(var3); - if (var5.outputType != 's') { - } - - for (var6 = 0; var6 < var5.outputCount; ++var6) { - if (var4 == var5.keys[var6]) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var5.strVals[var6]; - var5 = null; - break; - } - } - - if (var5 != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var5.defaultStr; - } - - return 1; - } else if (var0 != ScriptOpcodes.ENUM) { - if (var0 == ScriptOpcodes.ENUM_GETOUTPUTCOUNT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - EnumDefinition var10 = UserComparator10.getEnum(var3); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var10.size(); - return 1; - } else { - return 2; - } - } else { - Interpreter.Interpreter_intStackSize -= 4; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - int var9 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - EnumDefinition var7 = UserComparator10.getEnum(var9); - if (var3 == var7.inputType && var4 == var7.outputType) { - for (int var8 = 0; var8 < var7.outputCount; ++var8) { - if (var6 == var7.keys[var8]) { - if (var4 == 115) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var7.strVals[var8]; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.intVals[var8]; - } - - var7 = null; - break; - } - } - - if (var7 != null) { - if (var4 == 115) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var7.defaultStr; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.defaultInt; - } - } - - return 1; - } else { - if (var4 == 115) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = "null"; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } - } - } } diff --git a/runescape-client/src/main/java/PacketBufferNode.java b/runescape-client/src/main/java/PacketBufferNode.java index 34949e0d2a..9419d17d5f 100644 --- a/runescape-client/src/main/java/PacketBufferNode.java +++ b/runescape-client/src/main/java/PacketBufferNode.java @@ -3,46 +3,44 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("gn") +@ObfuscatedName("gk") @Implements("PacketBufferNode") public class PacketBufferNode extends Node { - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "[Lgn;" + signature = "[Lgk;" ) @Export("PacketBufferNode_packetBufferNodes") - static PacketBufferNode[] PacketBufferNode_packetBufferNodes; - @ObfuscatedName("p") + public static PacketBufferNode[] PacketBufferNode_packetBufferNodes; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 6984373 + intValue = -2062667101 ) @Export("PacketBufferNode_packetBufferNodeCount") - static int PacketBufferNode_packetBufferNodeCount; - @ObfuscatedName("y") - @Export("SpriteBuffer_pixels") - public static byte[][] SpriteBuffer_pixels; - @ObfuscatedName("z") + public static int PacketBufferNode_packetBufferNodeCount; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgy;" + signature = "Lgx;" ) @Export("clientPacket") - ClientPacket clientPacket; - @ObfuscatedName("n") + public ClientPacket clientPacket; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1214677313 + intValue = 1560309835 ) @Export("clientPacketLength") - int clientPacketLength; - @ObfuscatedName("v") + public int clientPacketLength; + @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lkf;" ) @Export("packetBuffer") public PacketBuffer packetBuffer; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 232074557 + intValue = -1326769375 ) @Export("index") public int index; @@ -52,13 +50,10 @@ public class PacketBufferNode extends Node { PacketBufferNode_packetBufferNodeCount = 0; } - PacketBufferNode() { - } - - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-873176834" + signature = "(B)V", + garbageValue = "2" ) @Export("release") public void release() { @@ -67,27 +62,158 @@ public class PacketBufferNode extends Node { } } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)Lil;", - garbageValue = "1677952312" + signature = "(IB)Lhi;", + garbageValue = "56" ) - @Export("getNpcDefinition") - public static NPCDefinition getNpcDefinition(int var0) { - NPCDefinition var1 = (NPCDefinition)NPCDefinition.NpcDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = NPCDefinition.NpcDefinition_archive.takeFile(9, var0); - var1 = new NPCDefinition(); - var1.id = var0; - if (var2 != null) { - var1.decode(new Buffer(var2)); + @Export("getWidget") + public static Widget getWidget(int var0) { + int var1 = var0 >> 16; + int var2 = var0 & 65535; + if (Widget.Widget_interfaceComponents[var1] == null || Widget.Widget_interfaceComponents[var1][var2] == null) { + boolean var3 = TextureProvider.loadInterface(var1); + if (!var3) { + return null; } + } - var1.postDecode(); - NPCDefinition.NpcDefinition_cached.put(var1, (long)var0); - return var1; + return Widget.Widget_interfaceComponents[var1][var2]; + } + + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "1332418089" + ) + static int method3784(int var0, Script var1, boolean var2) { + boolean var3 = true; + Widget var4; + if (var0 >= 2000) { + var0 -= 1000; + var4 = getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + var3 = false; + } else { + var4 = var2 ? class96.field1301 : ReflectionCheck.field1310; + } + + int var11; + if (var0 == ScriptOpcodes.CC_SETOP) { + var11 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] - 1; + if (var11 >= 0 && var11 <= 9) { + var4.setAction(var11, Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]); + return 1; + } else { + --WorldMapDecoration.Interpreter_stringStackSize; + return 1; + } + } else { + int var6; + if (var0 == ScriptOpcodes.CC_SETDRAGGABLE) { + Interpreter.Interpreter_intStackSize -= 2; + var11 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var4.parent = ArchiveLoader.getWidgetChild(var11, var6); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETDRAGGABLEBEHAVIOR) { + var4.isScrollBar = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETDRAGDEADZONE) { + var4.dragZoneSize = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETDRAGDEADTIME) { + var4.dragThreshold = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETOPBASE) { + var4.dataText = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTARGETVERB) { + var4.spellActionName = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + return 1; + } else if (var0 == ScriptOpcodes.CC_CLEAROPS) { + var4.actions = null; + return 1; + } else if (var0 == 1308) { + var4.field2690 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else { + int var7; + byte[] var9; + if (var0 != ScriptOpcodes.CC_SETOPKEY) { + byte var5; + if (var0 == ScriptOpcodes.CC_SETOPTKEY) { + Interpreter.Interpreter_intStackSize -= 2; + var5 = 10; + var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]}; + byte[] var10 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]}; + GameObject.Widget_setKey(var4, var5, var9, var10); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETOPKEYRATE) { + Interpreter.Interpreter_intStackSize -= 3; + var11 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] - 1; + var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + if (var11 >= 0 && var11 <= 9) { + ObjectSound.Widget_setKeyRate(var4, var11, var6, var7); + return 1; + } else { + throw new RuntimeException(); + } + } else if (var0 == ScriptOpcodes.CC_SETOPTKEYRATE) { + var5 = 10; + var6 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + ObjectSound.Widget_setKeyRate(var4, var5, var6, var7); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETOPKEYIGNOREHELD) { + --Interpreter.Interpreter_intStackSize; + var11 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] - 1; + if (var11 >= 0 && var11 <= 9) { + WorldMapCacheName.Widget_setKeyIgnoreHeld(var4, var11); + return 1; + } else { + throw new RuntimeException(); + } + } else if (var0 == ScriptOpcodes.CC_SETOPTKEYIGNOREHELD) { + var5 = 10; + WorldMapCacheName.Widget_setKeyIgnoreHeld(var4, var5); + return 1; + } else { + return 2; + } + } else { + byte[] var8 = null; + var9 = null; + if (var3) { + Interpreter.Interpreter_intStackSize -= 10; + + for (var7 = 0; var7 < 10 && Interpreter.Interpreter_intStack[var7 + Interpreter.Interpreter_intStackSize] >= 0; var7 += 2) { + } + + if (var7 > 0) { + var8 = new byte[var7 / 2]; + var9 = new byte[var7 / 2]; + + for (var7 -= 2; var7 >= 0; var7 -= 2) { + var8[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + Interpreter.Interpreter_intStackSize]; + var9[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + Interpreter.Interpreter_intStackSize + 1]; + } + } + } else { + Interpreter.Interpreter_intStackSize -= 2; + var8 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]}; + var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]}; + } + + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] - 1; + if (var7 >= 0 && var7 <= 9) { + GameObject.Widget_setKey(var4, var7, var8, var9); + return 1; + } else { + throw new RuntimeException(); + } + } + } } } } diff --git a/runescape-client/src/main/java/PacketWriter.java b/runescape-client/src/main/java/PacketWriter.java index a492d43729..deebebd579 100644 --- a/runescape-client/src/main/java/PacketWriter.java +++ b/runescape-client/src/main/java/PacketWriter.java @@ -1,95 +1,99 @@ +import java.awt.Desktop; +import java.awt.Desktop.Action; import java.io.IOException; +import java.net.URI; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("cl") +@ObfuscatedName("cp") @Implements("PacketWriter") public class PacketWriter { - @ObfuscatedName("gt") + @ObfuscatedName("ry") @ObfuscatedSignature( - signature = "Lex;" + signature = "Lbb;" ) - @Export("scene") - static Scene scene; - @ObfuscatedName("z") + @Export("friendSystem") + public static FriendSystem friendSystem; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lky;" + signature = "Lku;" ) @Export("socket") AbstractSocket socket; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ljs;" + signature = "Ljm;" ) @Export("packetBufferNodes") IterableNodeDeque packetBufferNodes; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1980831337 + intValue = 150566237 ) @Export("bufferSize") int bufferSize; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lkl;" + signature = "Lkc;" ) @Export("buffer") Buffer buffer; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Llg;" + signature = "Llm;" ) @Export("isaacCipher") public IsaacCipher isaacCipher; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lkf;" ) @Export("packetBuffer") PacketBuffer packetBuffer; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) @Export("serverPacket") ServerPacket serverPacket; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 1968732153 + intValue = 969841253 ) @Export("serverPacketLength") int serverPacketLength; - @ObfuscatedName("y") - boolean field1290; @ObfuscatedName("i") + boolean field1287; + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -1246763735 + intValue = 1257964487 ) - int field1297; - @ObfuscatedName("c") + int field1291; + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1159394087 + intValue = 34585799 ) @Export("pendingWrites") int pendingWrites; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - ServerPacket field1300; - @ObfuscatedName("o") + ServerPacket field1290; + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - ServerPacket field1291; - @ObfuscatedName("a") + ServerPacket field1286; + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - ServerPacket field1301; + ServerPacket field1292; PacketWriter() { this.packetBufferNodes = new IterableNodeDeque(); @@ -98,15 +102,15 @@ public class PacketWriter { this.packetBuffer = new PacketBuffer(40000); this.serverPacket = null; this.serverPacketLength = 0; - this.field1290 = true; - this.field1297 = 0; + this.field1287 = true; + this.field1291 = 0; this.pendingWrites = 0; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1613977862" + signature = "(B)V", + garbageValue = "47" ) @Export("clearBuffer") final void clearBuffer() { @@ -114,10 +118,10 @@ public class PacketWriter { this.bufferSize = 0; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1302279031" + garbageValue = "-1645356656" ) @Export("flush") final void flush() throws IOException { @@ -142,10 +146,10 @@ public class PacketWriter { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lgn;I)V", - garbageValue = "-1138020286" + signature = "(Lgk;B)V", + garbageValue = "-19" ) @Export("addNode") public final void addNode(PacketBufferNode var1) { @@ -155,20 +159,20 @@ public class PacketWriter { this.bufferSize += var1.index; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lky;I)V", - garbageValue = "750746684" + signature = "(Lku;B)V", + garbageValue = "4" ) @Export("setSocket") void setSocket(AbstractSocket var1) { this.socket = var1; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1336003274" + garbageValue = "-1408755030" ) @Export("close") void close() { @@ -179,23 +183,95 @@ public class PacketWriter { } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-54" + signature = "(I)V", + garbageValue = "906651954" ) @Export("removeSocket") void removeSocket() { this.socket = null; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(I)Lky;", - garbageValue = "1051298543" + signature = "(I)Lku;", + garbageValue = "-814852778" ) @Export("getSocket") AbstractSocket getSocket() { return this.socket; } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;Lhq;I)V", + garbageValue = "1551523322" + ) + public static void method2419(AbstractArchive var0, AbstractArchive var1) { + SpotAnimationDefinition.SpotAnimationDefinition_archive = var0; + SpotAnimationDefinition.SpotAnimationDefinition_modelArchive = var1; + } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;ZLjava/lang/String;ZI)V", + garbageValue = "762135204" + ) + static void method2421(String var0, boolean var1, String var2, boolean var3) { + if (var1) { + if (!var3 && Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Action.BROWSE)) { + try { + Desktop.getDesktop().browse(new URI(var0)); + return; + } catch (Exception var5) { + } + } + + if (class51.field416.startsWith("win") && !var3) { + class226.method4275(var0, 0, "openjs"); + return; + } + + if (class51.field416.startsWith("mac")) { + class226.method4275(var0, 1, var2); + return; + } + + class226.method4275(var0, 2, "openjs"); + } else { + class226.method4275(var0, 3, "openjs"); + } + + } + + @ObfuscatedName("e") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-1319808417" + ) + static int method2426(int var0, Script var1, boolean var2) { + Widget var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + if (var0 == ScriptOpcodes.IF_GETX) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.x; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETY) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.y; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETWIDTH) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.width; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETHEIGHT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.height; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETHIDE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.isHidden ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETLAYER) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.parentId; + return 1; + } else { + return 2; + } + } } diff --git a/runescape-client/src/main/java/ParamDefinition.java b/runescape-client/src/main/java/ParamDefinition.java index 4dc0afeaf7..9cd4450046 100644 --- a/runescape-client/src/main/java/ParamDefinition.java +++ b/runescape-client/src/main/java/ParamDefinition.java @@ -4,45 +4,40 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("if") +@ObfuscatedName("iy") @Implements("ParamDefinition") public class ParamDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("ParamDefinition_archive") public static AbstractArchive ParamDefinition_archive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("ParamDefinition_cached") - static EvictingDualNodeHashTable ParamDefinition_cached; - @ObfuscatedName("o") + public static EvictingDualNodeHashTable ParamDefinition_cached; + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1829462559 + intValue = -508885991 ) - static int field3287; - @ObfuscatedName("lv") - @ObfuscatedSignature( - signature = "Lcs;" - ) - @Export("tempMenuAction") - static MenuAction tempMenuAction; - @ObfuscatedName("v") + @Export("PcmPlayer_count") + public static int PcmPlayer_count; + @ObfuscatedName("n") @Export("type") char type; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -76739099 + intValue = -1697387683 ) @Export("defaultInt") public int defaultInt; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("defaultStr") public String defaultStr; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("autoDisable") boolean autoDisable; @@ -54,19 +49,19 @@ public class ParamDefinition extends DualNode { this.autoDisable = true; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-127" + signature = "(I)V", + garbageValue = "-767348576" ) @Export("postDecode") void postDecode() { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "271304326" + signature = "(Lkc;I)V", + garbageValue = "95444095" ) @Export("decode") void decode(Buffer var1) { @@ -80,15 +75,15 @@ public class ParamDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "854773770" + signature = "(Lkc;II)V", + garbageValue = "130264768" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { if (var2 == 1) { - this.type = WorldMapEvent.method802(var1.readByte()); + this.type = Ignored.method5284(var1.readByte()); } else if (var2 == 2) { this.defaultInt = var1.readInt(); } else if (var2 == 4) { @@ -99,41 +94,13 @@ public class ParamDefinition extends DualNode { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "-70" + signature = "(I)Z", + garbageValue = "1179619328" ) @Export("isString") public boolean isString() { return this.type == 's'; } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lba;B)V", - garbageValue = "-104" - ) - @Export("runScriptEvent") - public static void runScriptEvent(ScriptEvent var0) { - KeyHandler.runScript(var0, 500000); - } - - @ObfuscatedName("hg") - @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "-786706549" - ) - static final boolean method4480(int var0) { - if (var0 < 0) { - return false; - } else { - int var1 = Client.menuOpcodes[var0]; - if (var1 >= 2000) { - var1 -= 2000; - } - - return var1 == 1007; - } - } } diff --git a/runescape-client/src/main/java/PcmPlayer.java b/runescape-client/src/main/java/PcmPlayer.java index c9bb6421be..3a78ecf989 100644 --- a/runescape-client/src/main/java/PcmPlayer.java +++ b/runescape-client/src/main/java/PcmPlayer.java @@ -1,206 +1,199 @@ -import java.util.concurrent.ScheduledExecutorService; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dv") +@ObfuscatedName("dq") @Implements("PcmPlayer") public class PcmPlayer { - @ObfuscatedName("p") - @Export("PcmPlayer_stereo") - public static boolean PcmPlayer_stereo; - @ObfuscatedName("m") - @Export("soundSystemExecutor") - static ScheduledExecutorService soundSystemExecutor; - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lcf;" + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = -326357542 ) - @Export("pcmPlayerProvider") - static PcmPlayerProvider pcmPlayerProvider; - @ObfuscatedName("a") + @Export("PcmPlayer_sampleRate") + public static int PcmPlayer_sampleRate; + @ObfuscatedName("k") @Export("samples") protected int[] samples; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Ldc;" + signature = "Ldj;" ) @Export("stream") PcmStream stream; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 529397433 + intValue = 1561038713 ) - int field1388; - @ObfuscatedName("t") + int field1394; + @ObfuscatedName("r") @ObfuscatedGetter( - longValue = -9085441602565192727L + longValue = -4392841547696202379L ) @Export("timeMs") long timeMs; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 937182747 + intValue = 1043621473 ) @Export("capacity") int capacity; - @ObfuscatedName("x") - @ObfuscatedGetter( - intValue = -1375539879 - ) - int field1391; - @ObfuscatedName("h") - @ObfuscatedGetter( - intValue = -383494247 - ) - int field1392; @ObfuscatedName("s") @ObfuscatedGetter( - longValue = 2578589966919390689L + intValue = 87415669 ) - long field1393; + int field1388; + @ObfuscatedName("b") + @ObfuscatedGetter( + intValue = 692811819 + ) + int field1389; + @ObfuscatedName("z") + @ObfuscatedGetter( + longValue = -5109190258343752079L + ) + long field1390; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = -709133773 + intValue = -728002027 ) - int field1383; - @ObfuscatedName("j") + int field1384; + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 1808057975 + intValue = 1330759581 ) - int field1397; - @ObfuscatedName("d") + int field1380; + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -236130375 + intValue = -1355026859 ) - int field1396; - @ObfuscatedName("l") + int field1393; + @ObfuscatedName("u") @ObfuscatedGetter( - longValue = -2782522933298206297L + longValue = 8313708391947362675L ) - long field1382; - @ObfuscatedName("k") - boolean field1394; - @ObfuscatedName("ar") + long field1396; + @ObfuscatedName("y") + boolean field1395; + @ObfuscatedName("ag") @ObfuscatedGetter( - intValue = 1371288149 + intValue = 232307999 ) - int field1399; - @ObfuscatedName("ab") + int field1392; + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "[Ldc;" + signature = "[Ldj;" ) - PcmStream[] field1400; - @ObfuscatedName("ax") + PcmStream[] field1397; + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "[Ldc;" + signature = "[Ldj;" ) - PcmStream[] field1401; + PcmStream[] field1398; protected PcmPlayer() { - this.field1388 = 32; - this.timeMs = class30.currentTimeMillis(); - this.field1393 = 0L; - this.field1383 = 0; - this.field1397 = 0; - this.field1396 = 0; - this.field1382 = 0L; - this.field1394 = true; - this.field1399 = 0; - this.field1400 = new PcmStream[8]; - this.field1401 = new PcmStream[8]; + this.field1394 = 32; + this.timeMs = PlayerAppearance.currentTimeMillis(); + this.field1390 = 0L; + this.field1384 = 0; + this.field1380 = 0; + this.field1393 = 0; + this.field1396 = 0L; + this.field1395 = true; + this.field1392 = 0; + this.field1397 = new PcmStream[8]; + this.field1398 = new PcmStream[8]; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "8" + garbageValue = "-122" ) @Export("init") protected void init() throws Exception { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IS)V", - garbageValue = "2148" + signature = "(II)V", + garbageValue = "1329305761" ) @Export("open") protected void open(int var1) throws Exception { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "1" + signature = "(I)I", + garbageValue = "-2053382901" ) @Export("position") protected int position() throws Exception { return this.capacity; } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("write") protected void write() throws Exception { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "90832052" + garbageValue = "-359946727" ) @Export("close") protected void close() { } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1875138754" + garbageValue = "47548316" ) @Export("discard") protected void discard() throws Exception { } - @ObfuscatedName("ac") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(Ldc;I)V", - garbageValue = "1280132594" + signature = "(Ldj;S)V", + garbageValue = "2001" ) @Export("setStream") public final synchronized void setStream(PcmStream var1) { this.stream = var1; } - @ObfuscatedName("aa") + @ObfuscatedName("am") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "17" + signature = "(I)V", + garbageValue = "-162724995" ) @Export("run") public final synchronized void run() { if (this.samples != null) { - long var1 = class30.currentTimeMillis(); + long var1 = PlayerAppearance.currentTimeMillis(); try { - if (this.field1393 != 0L) { - if (var1 < this.field1393) { + if (0L != this.field1390) { + if (var1 < this.field1390) { return; } this.open(this.capacity); - this.field1393 = 0L; - this.field1394 = true; + this.field1390 = 0L; + this.field1395 = true; } int var3 = this.position(); - if (this.field1396 - var3 > this.field1383) { - this.field1383 = this.field1396 - var3; + if (this.field1393 - var3 > this.field1384) { + this.field1384 = this.field1393 - var3; } - int var4 = this.field1391 + this.field1392; + int var4 = this.field1389 + this.field1388; if (var4 + 256 > 16384) { var4 = 16128; } @@ -214,10 +207,10 @@ public class PcmPlayer { this.close(); this.open(this.capacity); var3 = 0; - this.field1394 = true; + this.field1395 = true; if (var4 + 256 > this.capacity) { var4 = this.capacity - 256; - this.field1392 = var4 - this.field1391; + this.field1389 = var4 - this.field1388; } } @@ -227,28 +220,28 @@ public class PcmPlayer { var3 += 256; } - if (var1 > this.field1382) { - if (!this.field1394) { - if (this.field1383 == 0 && this.field1397 == 0) { + if (var1 > this.field1396) { + if (!this.field1395) { + if (this.field1384 == 0 && this.field1380 == 0) { this.close(); - this.field1393 = var1 + 2000L; + this.field1390 = var1 + 2000L; return; } - this.field1392 = Math.min(this.field1397, this.field1383); - this.field1397 = this.field1383; + this.field1389 = Math.min(this.field1380, this.field1384); + this.field1380 = this.field1384; } else { - this.field1394 = false; + this.field1395 = false; } - this.field1383 = 0; - this.field1382 = var1 + 2000L; + this.field1384 = 0; + this.field1396 = 2000L + var1; } - this.field1396 = var3; + this.field1393 = var3; } catch (Exception var7) { this.close(); - this.field1393 = var1 + 2000L; + this.field1390 = var1 + 2000L; } try { @@ -256,9 +249,9 @@ public class PcmPlayer { var1 = this.timeMs; } - while (var1 > this.timeMs + 5000L) { + while (var1 > 5000L + this.timeMs) { this.skip(256); - this.timeMs += (long)(256000 / UrlRequest.PcmPlayer_sampleRate); + this.timeMs += (long)(256000 / (PcmPlayer_sampleRate * 22050)); } } catch (Exception var6) { this.timeMs = var1; @@ -267,57 +260,57 @@ public class PcmPlayer { } } - @ObfuscatedName("ap") + @ObfuscatedName("ab") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "580966872" + garbageValue = "-2122185925" ) - public final void method2397() { - this.field1394 = true; + public final void method2581() { + this.field1395 = true; } - @ObfuscatedName("ar") + @ObfuscatedName("ax") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-601426802" + garbageValue = "-855034369" ) @Export("tryDiscard") public final synchronized void tryDiscard() { - this.field1394 = true; + this.field1395 = true; try { this.discard(); } catch (Exception var2) { this.close(); - this.field1393 = class30.currentTimeMillis() + 2000L; + this.field1390 = PlayerAppearance.currentTimeMillis() + 2000L; } } - @ObfuscatedName("ab") + @ObfuscatedName("al") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1026437845" + garbageValue = "-1045839525" ) @Export("shutdown") public final synchronized void shutdown() { - if (RunException.soundSystem != null) { + if (VerticalAlignment.soundSystem != null) { boolean var1 = true; for (int var2 = 0; var2 < 2; ++var2) { - if (this == RunException.soundSystem.players[var2]) { - RunException.soundSystem.players[var2] = null; + if (this == VerticalAlignment.soundSystem.players[var2]) { + VerticalAlignment.soundSystem.players[var2] = null; } - if (RunException.soundSystem.players[var2] != null) { + if (VerticalAlignment.soundSystem.players[var2] != null) { var1 = false; } } if (var1) { - soundSystemExecutor.shutdownNow(); - soundSystemExecutor = null; - RunException.soundSystem = null; + SecureRandomCallable.soundSystemExecutor.shutdownNow(); + SecureRandomCallable.soundSystemExecutor = null; + VerticalAlignment.soundSystem = null; } } @@ -325,16 +318,16 @@ public class PcmPlayer { this.samples = null; } - @ObfuscatedName("ax") + @ObfuscatedName("ap") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "629535464" + garbageValue = "-1485075672" ) @Export("skip") final void skip(int var1) { - this.field1399 -= var1; - if (this.field1399 < 0) { - this.field1399 = 0; + this.field1392 -= var1; + if (this.field1392 < 0) { + this.field1392 = 0; } if (this.stream != null) { @@ -343,20 +336,20 @@ public class PcmPlayer { } - @ObfuscatedName("as") + @ObfuscatedName("aj") @Export("fill") final void fill(int[] var1, int var2) { int var3 = var2; - if (PcmPlayer_stereo) { + if (InterfaceParent.PcmPlayer_stereo) { var3 = var2 << 1; } class300.clearIntArray(var1, 0, var3); - this.field1399 -= var2; - if (this.stream != null && this.field1399 <= 0) { - this.field1399 += UrlRequest.PcmPlayer_sampleRate >> 4; - DynamicObject.PcmStream_disable(this.stream); - this.method2402(this.stream, this.stream.vmethod2691()); + this.field1392 -= var2; + if (this.stream != null && this.field1392 <= 0) { + this.field1392 += PcmPlayer_sampleRate * 22050 >> 4; + PlayerAppearance.PcmStream_disable(this.stream); + this.method2586(this.stream, this.stream.vmethod2868()); int var4 = 0; int var5 = 255; @@ -378,7 +371,7 @@ public class PcmPlayer { if ((var9 & 1) != 0) { var5 &= ~(1 << var7); var10 = null; - PcmStream var11 = this.field1400[var7]; + PcmStream var11 = this.field1397[var7]; label98: while (true) { @@ -394,33 +387,33 @@ public class PcmPlayer { var11 = var11.after; } else { var11.active = true; - int var13 = var11.vmethod3882(); + int var13 = var11.vmethod4063(); var4 += var13; if (var12 != null) { var12.position += var13; } - if (var4 >= this.field1388) { + if (var4 >= this.field1394) { break label104; } PcmStream var14 = var11.firstSubStream(); if (var14 != null) { - for (int var15 = var11.field1462; var14 != null; var14 = var11.nextSubStream()) { - this.method2402(var14, var15 * var14.vmethod2691() >> 8); + for (int var15 = var11.field1467; var14 != null; var14 = var11.nextSubStream()) { + this.method2586(var14, var15 * var14.vmethod2868() >> 8); } } PcmStream var18 = var11.after; var11.after = null; if (var10 == null) { - this.field1400[var7] = var18; + this.field1397[var7] = var18; } else { var10.after = var18; } if (var18 == null) { - this.field1401[var7] = var10; + this.field1398[var7] = var10; } var11 = var18; @@ -435,9 +428,9 @@ public class PcmPlayer { } for (var6 = 0; var6 < 8; ++var6) { - PcmStream var16 = this.field1400[var6]; - PcmStream[] var17 = this.field1400; - this.field1401[var6] = null; + PcmStream var16 = this.field1397[var6]; + PcmStream[] var17 = this.field1397; + this.field1398[var6] = null; for (var17[var6] = null; var16 != null; var16 = var10) { var10 = var16.after; @@ -446,32 +439,83 @@ public class PcmPlayer { } } - if (this.field1399 < 0) { - this.field1399 = 0; + if (this.field1392 < 0) { + this.field1392 = 0; } if (this.stream != null) { this.stream.fill(var1, 0, var2); } - this.timeMs = class30.currentTimeMillis(); + this.timeMs = PlayerAppearance.currentTimeMillis(); } - @ObfuscatedName("al") + @ObfuscatedName("au") @ObfuscatedSignature( - signature = "(Ldc;II)V", - garbageValue = "1373941757" + signature = "(Ldj;IB)V", + garbageValue = "113" ) - final void method2402(PcmStream var1, int var2) { + final void method2586(PcmStream var1, int var2) { int var3 = var2 >> 5; - PcmStream var4 = this.field1401[var3]; + PcmStream var4 = this.field1398[var3]; if (var4 == null) { - this.field1400[var3] = var1; + this.field1397[var3] = var1; } else { var4.after = var1; } - this.field1401[var3] = var1; - var1.field1462 = var2; + this.field1398[var3] = var1; + var1.field1467 = var2; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(CI)Z", + garbageValue = "1251726708" + ) + public static boolean method2639(char var0) { + if (var0 > ' ' && var0 < 127 || var0 > 127 && var0 < 160 || var0 > 160 && var0 <= 255) { + return true; + } else { + if (var0 != 0) { + char[] var1 = class287.cp1252AsciiExtension; + + for (int var2 = 0; var2 < var1.length; ++var2) { + char var3 = var1[var2]; + if (var0 == var3) { + return true; + } + } + } + + return false; + } + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "1581886582" + ) + static int method2638(int var0, int var1) { + long var2 = (long)((var0 << 16) + var1); + return UserComparator6.NetCache_currentResponse != null && var2 == UserComparator6.NetCache_currentResponse.key ? Frames.NetCache_responseArchiveBuffer.offset * 99 / (Frames.NetCache_responseArchiveBuffer.array.length - UserComparator6.NetCache_currentResponse.padding) + 1 : 0; + } + + @ObfuscatedName("hk") + @ObfuscatedSignature( + signature = "(IIB)I", + garbageValue = "-14" + ) + static int method2637(int var0, int var1) { + int var2 = var1 - 334; + if (var2 < 0) { + var2 = 0; + } else if (var2 > 100) { + var2 = 100; + } + + int var3 = (Client.zoomWidth - Client.zoomHeight) * var2 / 100 + Client.zoomHeight; + return var0 * var3 / 256; } } diff --git a/runescape-client/src/main/java/PcmPlayerProvider.java b/runescape-client/src/main/java/PcmPlayerProvider.java deleted file mode 100644 index 81bea81bbd..0000000000 --- a/runescape-client/src/main/java/PcmPlayerProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("cf") -@Implements("PcmPlayerProvider") -public interface PcmPlayerProvider { - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(I)Ldv;", - garbageValue = "-79742550" - ) - @Export("player") - PcmPlayer player(); -} diff --git a/runescape-client/src/main/java/PcmStream.java b/runescape-client/src/main/java/PcmStream.java index d066df1cc7..04e9494aac 100644 --- a/runescape-client/src/main/java/PcmStream.java +++ b/runescape-client/src/main/java/PcmStream.java @@ -3,62 +3,62 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dc") +@ObfuscatedName("dj") @Implements("PcmStream") public abstract class PcmStream extends Node { - @ObfuscatedName("w") - @Export("active") - volatile boolean active; - @ObfuscatedName("t") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "Ldc;" + signature = "Ldj;" ) @Export("after") PcmStream after; - @ObfuscatedName("g") - int field1462; - @ObfuscatedName("x") + @ObfuscatedName("r") + int field1467; + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "Ldx;" + signature = "Ldg;" ) @Export("sound") AbstractSound sound; + @ObfuscatedName("s") + @Export("active") + volatile boolean active; protected PcmStream() { this.active = true; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("firstSubStream") protected abstract PcmStream firstSubStream(); - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("nextSubStream") protected abstract PcmStream nextSubStream(); - @ObfuscatedName("m") - protected abstract int vmethod3882(); + @ObfuscatedName("o") + protected abstract int vmethod4063(); - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("fill") protected abstract void fill(int[] var1, int var2, int var3); - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("skip") protected abstract void skip(int var1); - @ObfuscatedName("ah") - int vmethod2691() { + @ObfuscatedName("as") + int vmethod2868() { return 255; } - @ObfuscatedName("fh") + @ObfuscatedName("fw") @Export("update") final void update(int[] var1, int var2, int var3) { if (this.active) { diff --git a/runescape-client/src/main/java/PcmStreamMixer.java b/runescape-client/src/main/java/PcmStreamMixer.java index 75e1fa9dcf..7d8a750401 100644 --- a/runescape-client/src/main/java/PcmStreamMixer.java +++ b/runescape-client/src/main/java/PcmStreamMixer.java @@ -3,152 +3,152 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ca") +@ObfuscatedName("ct") @Implements("PcmStreamMixer") public class PcmStreamMixer extends PcmStream { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("subStreams") NodeDeque subStreams; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) - NodeDeque field1318; - @ObfuscatedName("v") - int field1319; - @ObfuscatedName("u") + NodeDeque field1316; + @ObfuscatedName("n") int field1317; + @ObfuscatedName("q") + int field1315; public PcmStreamMixer() { this.subStreams = new NodeDeque(); - this.field1318 = new NodeDeque(); - this.field1319 = 0; - this.field1317 = -1; + this.field1316 = new NodeDeque(); + this.field1317 = 0; + this.field1315 = -1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ldc;)V" + signature = "(Ldj;)V" ) @Export("addSubStream") public final synchronized void addSubStream(PcmStream var1) { this.subStreams.addLast(var1); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ldc;)V" + signature = "(Ldj;)V" ) @Export("removeSubStream") public final synchronized void removeSubStream(PcmStream var1) { var1.remove(); } - @ObfuscatedName("v") - void method2275() { - if (this.field1319 > 0) { - for (PcmStreamMixerListener var1 = (PcmStreamMixerListener)this.field1318.last(); var1 != null; var1 = (PcmStreamMixerListener)this.field1318.previous()) { - var1.field1421 -= this.field1319; + @ObfuscatedName("n") + void method2439() { + if (this.field1317 > 0) { + for (PcmStreamMixerListener var1 = (PcmStreamMixerListener)this.field1316.last(); var1 != null; var1 = (PcmStreamMixerListener)this.field1316.previous()) { + var1.field1420 -= this.field1317; } - this.field1317 -= this.field1319; - this.field1319 = 0; + this.field1315 -= this.field1317; + this.field1317 = 0; } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lfx;Lde;)V" + signature = "(Lfd;Ldn;)V" ) - void method2298(Node var1, PcmStreamMixerListener var2) { - while (this.field1318.sentinel != var1 && ((PcmStreamMixerListener)var1).field1421 <= var2.field1421) { + void method2443(Node var1, PcmStreamMixerListener var2) { + while (this.field1316.sentinel != var1 && ((PcmStreamMixerListener)var1).field1420 <= var2.field1420) { var1 = var1.previous; } NodeDeque.NodeDeque_addBefore(var2, var1); - this.field1317 = ((PcmStreamMixerListener)this.field1318.sentinel.previous).field1421; + this.field1315 = ((PcmStreamMixerListener)this.field1316.sentinel.previous).field1420; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lde;)V" + signature = "(Ldn;)V" ) - void method2276(PcmStreamMixerListener var1) { + void method2478(PcmStreamMixerListener var1) { var1.remove(); var1.remove2(); - Node var2 = this.field1318.sentinel.previous; - if (var2 == this.field1318.sentinel) { - this.field1317 = -1; + Node var2 = this.field1316.sentinel.previous; + if (var2 == this.field1316.sentinel) { + this.field1315 = -1; } else { - this.field1317 = ((PcmStreamMixerListener)var2).field1421; + this.field1315 = ((PcmStreamMixerListener)var2).field1420; } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("firstSubStream") protected PcmStream firstSubStream() { return (PcmStream)this.subStreams.last(); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("nextSubStream") protected PcmStream nextSubStream() { return (PcmStream)this.subStreams.previous(); } - @ObfuscatedName("m") - protected int vmethod3882() { + @ObfuscatedName("o") + protected int vmethod4063() { return 0; } - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("fill") public final synchronized void fill(int[] var1, int var2, int var3) { do { - if (this.field1317 < 0) { + if (this.field1315 < 0) { this.updateSubStreams(var1, var2, var3); return; } - if (var3 + this.field1319 < this.field1317) { - this.field1319 += var3; + if (var3 + this.field1317 < this.field1315) { + this.field1317 += var3; this.updateSubStreams(var1, var2, var3); return; } - int var4 = this.field1317 - this.field1319; + int var4 = this.field1315 - this.field1317; this.updateSubStreams(var1, var2, var4); var2 += var4; var3 -= var4; - this.field1319 += var4; - this.method2275(); - PcmStreamMixerListener var5 = (PcmStreamMixerListener)this.field1318.last(); + this.field1317 += var4; + this.method2439(); + PcmStreamMixerListener var5 = (PcmStreamMixerListener)this.field1316.last(); synchronized(var5) { int var7 = var5.update(); if (var7 < 0) { - var5.field1421 = 0; - this.method2276(var5); + var5.field1420 = 0; + this.method2478(var5); } else { - var5.field1421 = var7; - this.method2298(var5.previous, var5); + var5.field1420 = var7; + this.method2443(var5.previous, var5); } } } while(var3 != 0); } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("updateSubStreams") void updateSubStreams(int[] var1, int var2, int var3) { for (PcmStream var4 = (PcmStream)this.subStreams.last(); var4 != null; var4 = (PcmStream)this.subStreams.previous()) { @@ -157,42 +157,42 @@ public class PcmStreamMixer extends PcmStream { } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("skip") public final synchronized void skip(int var1) { do { - if (this.field1317 < 0) { + if (this.field1315 < 0) { this.skipSubStreams(var1); return; } - if (this.field1319 + var1 < this.field1317) { - this.field1319 += var1; + if (this.field1317 + var1 < this.field1315) { + this.field1317 += var1; this.skipSubStreams(var1); return; } - int var2 = this.field1317 - this.field1319; + int var2 = this.field1315 - this.field1317; this.skipSubStreams(var2); var1 -= var2; - this.field1319 += var2; - this.method2275(); - PcmStreamMixerListener var3 = (PcmStreamMixerListener)this.field1318.last(); + this.field1317 += var2; + this.method2439(); + PcmStreamMixerListener var3 = (PcmStreamMixerListener)this.field1316.last(); synchronized(var3) { int var5 = var3.update(); if (var5 < 0) { - var3.field1421 = 0; - this.method2276(var3); + var3.field1420 = 0; + this.method2478(var3); } else { - var3.field1421 = var5; - this.method2298(var3.previous, var3); + var3.field1420 = var5; + this.method2443(var3.previous, var3); } } } while(var1 != 0); } - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("skipSubStreams") void skipSubStreams(int var1) { for (PcmStream var2 = (PcmStream)this.subStreams.last(); var2 != null; var2 = (PcmStream)this.subStreams.previous()) { diff --git a/runescape-client/src/main/java/PcmStreamMixerListener.java b/runescape-client/src/main/java/PcmStreamMixerListener.java index 0782f76591..dd519bb4b1 100644 --- a/runescape-client/src/main/java/PcmStreamMixerListener.java +++ b/runescape-client/src/main/java/PcmStreamMixerListener.java @@ -3,19 +3,19 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("de") +@ObfuscatedName("dn") @Implements("PcmStreamMixerListener") public abstract class PcmStreamMixerListener extends Node { - @ObfuscatedName("z") - int field1421; + @ObfuscatedName("a") + int field1420; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("remove2") abstract void remove2(); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lca;)I" + signature = "(Lct;)I" ) @Export("update") abstract int update(); diff --git a/runescape-client/src/main/java/PendingSpawn.java b/runescape-client/src/main/java/PendingSpawn.java index 625d107e43..6453656836 100644 --- a/runescape-client/src/main/java/PendingSpawn.java +++ b/runescape-client/src/main/java/PendingSpawn.java @@ -1,84 +1,82 @@ +import java.io.File; +import java.io.RandomAccessFile; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bt") +@ObfuscatedName("bn") @Implements("PendingSpawn") public final class PendingSpawn extends Node { - @ObfuscatedName("gb") - @ObfuscatedSignature( - signature = "Llf;" - ) - @Export("redHintArrowSprite") - static Sprite redHintArrowSprite; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1962154215 - ) - @Export("objectId") - int objectId; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = 1562451131 + intValue = -1584679065 ) @Export("plane") int plane; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1262583567 + intValue = -1530621461 ) @Export("type") int type; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1018276189 + intValue = -1386695055 ) @Export("x") int x; - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 179665149 + intValue = -1902286249 ) @Export("y") int y; - @ObfuscatedName("p") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1264128253 + intValue = 1162414355 ) - int field922; - @ObfuscatedName("q") + @Export("objectId") + int objectId; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -753782081 + intValue = 1880086587 ) - int field921; - @ObfuscatedName("m") + int field913; + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 481754121 + intValue = 1367998823 + ) + int field914; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 1222529831 ) @Export("id") int id; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 2059869293 + intValue = 235222743 ) @Export("orientation") int orientation; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 764785127 + intValue = 2005302789 ) - int field916; - @ObfuscatedName("c") + int field917; + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -201127845 + intValue = -1677449417 ) @Export("delay") int delay; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -39012303 + intValue = 2086246849 ) @Export("hitpoints") int hitpoints; @@ -87,4 +85,106 @@ public final class PendingSpawn extends Node { this.delay = 0; this.hitpoints = -1; } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;I)Ljava/io/File;", + garbageValue = "1594273687" + ) + @Export("getFile") + static File getFile(String var0) { + if (!FileSystem.FileSystem_hasPermissions) { + throw new RuntimeException(""); + } else { + File var1 = (File)FileSystem.FileSystem_cacheFiles.get(var0); + if (var1 != null) { + return var1; + } else { + File var2 = new File(FileSystem.FileSystem_cacheDir, var0); + RandomAccessFile var3 = null; + + try { + File var4 = new File(var2.getParent()); + if (!var4.exists()) { + throw new RuntimeException(""); + } else { + var3 = new RandomAccessFile(var2, "rw"); + int var5 = var3.read(); + var3.seek(0L); + var3.write(var5); + var3.seek(0L); + var3.close(); + FileSystem.FileSystem_cacheFiles.put(var0, var2); + return var2; + } + } catch (Exception var8) { + try { + if (var3 != null) { + var3.close(); + var3 = null; + } + } catch (Exception var7) { + } + + throw new RuntimeException(); + } + } + } + } + + @ObfuscatedName("ak") + @ObfuscatedSignature( + signature = "(Lff;IIB)Ldq;", + garbageValue = "0" + ) + public static final PcmPlayer method1856(TaskHandler var0, int var1, int var2) { + if (PcmPlayer.PcmPlayer_sampleRate * 22050 == 0) { + throw new IllegalStateException(); + } else if (var1 >= 0 && var1 < 2) { + if (var2 < 256) { + var2 = 256; + } + + try { + PcmPlayer var3 = class188.pcmPlayerProvider.player(); + var3.samples = new int[256 * (InterfaceParent.PcmPlayer_stereo ? 2 : 1)]; + var3.field1388 = var2; + var3.init(); + var3.capacity = (var2 & -1024) + 1024; + if (var3.capacity > 16384) { + var3.capacity = 16384; + } + + var3.open(var3.capacity); + if (ParamDefinition.PcmPlayer_count > 0 && VerticalAlignment.soundSystem == null) { + VerticalAlignment.soundSystem = new SoundSystem(); + SecureRandomCallable.soundSystemExecutor = Executors.newScheduledThreadPool(1); + SecureRandomCallable.soundSystemExecutor.scheduleAtFixedRate(VerticalAlignment.soundSystem, 0L, 10L, TimeUnit.MILLISECONDS); + } + + if (VerticalAlignment.soundSystem != null) { + if (VerticalAlignment.soundSystem.players[var1] != null) { + throw new IllegalArgumentException(); + } + + VerticalAlignment.soundSystem.players[var1] = var3; + } + + return var3; + } catch (Throwable var4) { + return new PcmPlayer(); + } + } else { + throw new IllegalArgumentException(); + } + } + + @ObfuscatedName("lm") + @ObfuscatedSignature( + signature = "(B)Z", + garbageValue = "92" + ) + public static boolean method1854() { + return Client.staffModLevel >= 2; + } } diff --git a/runescape-client/src/main/java/PlatformInfo.java b/runescape-client/src/main/java/PlatformInfo.java index c54542c21d..00a5f89629 100644 --- a/runescape-client/src/main/java/PlatformInfo.java +++ b/runescape-client/src/main/java/PlatformInfo.java @@ -4,188 +4,188 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lt") +@ObfuscatedName("lk") @Implements("PlatformInfo") public class PlatformInfo extends Node { - @ObfuscatedName("ab") - @ObfuscatedGetter( - intValue = -760772209 - ) - int field3903; - @ObfuscatedName("ax") - boolean field3913; - @ObfuscatedName("as") - @ObfuscatedGetter( - intValue = -68737307 - ) - int field3914; - @ObfuscatedName("ao") - @ObfuscatedGetter( - intValue = -1228924445 - ) - int field3915; - @ObfuscatedName("al") - @ObfuscatedGetter( - intValue = -1993401909 - ) - int field3926; - @ObfuscatedName("ad") - @ObfuscatedGetter( - intValue = -1530437153 - ) - int field3917; - @ObfuscatedName("an") - @ObfuscatedGetter( - intValue = -1258615957 - ) - int field3918; - @ObfuscatedName("ai") - boolean field3919; @ObfuscatedName("ak") @ObfuscatedGetter( - intValue = 1358828589 - ) - int field3920; - @ObfuscatedName("aq") - @ObfuscatedGetter( - intValue = -931926903 - ) - int field3921; - @ObfuscatedName("ae") - @ObfuscatedGetter( - intValue = -1834478057 + intValue = 1353612323 ) int field3922; @ObfuscatedName("av") + boolean field3911; + @ObfuscatedName("am") @ObfuscatedGetter( - intValue = 400152439 + intValue = 1724945833 ) - int field3907; - @ObfuscatedName("ah") - String field3924; - @ObfuscatedName("ag") - String field3925; + int field3927; + @ObfuscatedName("ab") + @ObfuscatedGetter( + intValue = -1892503757 + ) + int field3913; + @ObfuscatedName("ax") + @ObfuscatedGetter( + intValue = -769451899 + ) + int field3914; + @ObfuscatedName("al") + @ObfuscatedGetter( + intValue = -2046511239 + ) + int field3917; + @ObfuscatedName("ap") + @ObfuscatedGetter( + intValue = -1112004663 + ) + int field3916; @ObfuscatedName("aj") - String field3934; - @ObfuscatedName("ay") - String field3932; + boolean field3912; + @ObfuscatedName("ae") + @ObfuscatedGetter( + intValue = -864167753 + ) + int field3918; @ObfuscatedName("au") @ObfuscatedGetter( - intValue = 118098315 + intValue = 1103652803 ) - int field3928; + int field3929; + @ObfuscatedName("an") + @ObfuscatedGetter( + intValue = 43977127 + ) + int field3921; @ObfuscatedName("af") @ObfuscatedGetter( - intValue = 246544057 + intValue = 634727617 ) - int field3923; + int field3915; + @ObfuscatedName("ay") + String field3923; + @ObfuscatedName("az") + String field3924; + @ObfuscatedName("ao") + String field3925; + @ObfuscatedName("ai") + String field3926; + @ObfuscatedName("ac") + @ObfuscatedGetter( + intValue = -1691055317 + ) + int field3931; @ObfuscatedName("at") @ObfuscatedGetter( - intValue = 84742935 + intValue = 598634221 + ) + int field3933; + @ObfuscatedName("as") + @ObfuscatedGetter( + intValue = 953656517 + ) + int field3908; + @ObfuscatedName("ba") + @ObfuscatedGetter( + intValue = 1818308125 ) int field3930; + @ObfuscatedName("bg") + String field3928; + @ObfuscatedName("bc") + String field3932; + @ObfuscatedName("bd") + int[] field3905; @ObfuscatedName("bx") @ObfuscatedGetter( - intValue = 1315916991 + intValue = 2080789709 ) - int field3910; - @ObfuscatedName("bh") - String field3927; - @ObfuscatedName("bd") - String field3906; - @ObfuscatedName("bm") - int[] field3912; - @ObfuscatedName("bv") - @ObfuscatedGetter( - intValue = 1280064129 - ) - int field3935; - @ObfuscatedName("bj") - String field3936; + int field3934; + @ObfuscatedName("bl") + String field3901; 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) { - this.field3912 = new int[3]; - this.field3903 = var1; - this.field3913 = var2; - this.field3914 = var3; - this.field3915 = var4; - this.field3926 = var5; + this.field3905 = new int[3]; + this.field3922 = var1; + this.field3911 = var2; + this.field3927 = var3; + this.field3913 = var4; + this.field3914 = var5; this.field3917 = var6; - this.field3918 = var7; - this.field3919 = var8; - this.field3920 = var9; - this.field3921 = var10; - this.field3922 = var11; - this.field3907 = var12; - this.field3924 = var13; - this.field3925 = var14; - this.field3934 = var15; - this.field3932 = var16; - this.field3928 = var17; - this.field3923 = var18; - this.field3930 = var19; - this.field3910 = var20; - this.field3927 = var21; - this.field3906 = var22; - this.field3912 = var23; - this.field3935 = var24; - this.field3936 = var25; + this.field3916 = var7; + this.field3912 = var8; + this.field3918 = var9; + this.field3929 = var10; + this.field3921 = var11; + this.field3915 = var12; + this.field3923 = var13; + this.field3924 = var14; + this.field3925 = var15; + this.field3926 = var16; + this.field3931 = var17; + this.field3933 = var18; + this.field3908 = var19; + this.field3930 = var20; + this.field3928 = var21; + this.field3932 = var22; + this.field3905 = var23; + this.field3934 = var24; + this.field3901 = var25; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1592227856" + signature = "(Lkc;I)V", + garbageValue = "-2033458104" ) @Export("write") public void write(Buffer var1) { var1.writeByte(8); - var1.writeByte(this.field3903); - var1.writeByte(this.field3913 ? 1 : 0); - var1.writeShort(this.field3914); - var1.writeByte(this.field3915); - var1.writeByte(this.field3926); + var1.writeByte(this.field3922); + var1.writeByte(this.field3911 ? 1 : 0); + var1.writeShort(this.field3927); + var1.writeByte(this.field3913); + var1.writeByte(this.field3914); var1.writeByte(this.field3917); - var1.writeByte(this.field3918); - var1.writeByte(this.field3919 ? 1 : 0); - var1.writeShort(this.field3920); - var1.writeByte(this.field3921); - var1.writeMedium(this.field3922); - var1.writeShort(this.field3907); + var1.writeByte(this.field3916); + var1.writeByte(this.field3912 ? 1 : 0); + var1.writeShort(this.field3918); + var1.writeByte(this.field3929); + var1.writeMedium(this.field3921); + var1.writeShort(this.field3915); + var1.writeStringCp1252NullCircumfixed(this.field3923); var1.writeStringCp1252NullCircumfixed(this.field3924); var1.writeStringCp1252NullCircumfixed(this.field3925); - var1.writeStringCp1252NullCircumfixed(this.field3934); + var1.writeStringCp1252NullCircumfixed(this.field3926); + var1.writeByte(this.field3933); + var1.writeShort(this.field3931); + var1.writeStringCp1252NullCircumfixed(this.field3928); var1.writeStringCp1252NullCircumfixed(this.field3932); - var1.writeByte(this.field3923); - var1.writeShort(this.field3928); - var1.writeStringCp1252NullCircumfixed(this.field3927); - var1.writeStringCp1252NullCircumfixed(this.field3906); + var1.writeByte(this.field3908); var1.writeByte(this.field3930); - var1.writeByte(this.field3910); - for (int var2 = 0; var2 < this.field3912.length; ++var2) { - var1.writeInt(this.field3912[var2]); + for (int var2 = 0; var2 < this.field3905.length; ++var2) { + var1.writeInt(this.field3905[var2]); } - var1.writeInt(this.field3935); - var1.writeStringCp1252NullCircumfixed(this.field3936); + var1.writeInt(this.field3934); + var1.writeStringCp1252NullCircumfixed(this.field3901); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "3" + signature = "(I)I", + garbageValue = "-963267335" ) @Export("size") public int size() { byte var1 = 39; - int var2 = var1 + UserComparator5.method3387(this.field3924); - var2 += UserComparator5.method3387(this.field3925); - var2 += UserComparator5.method3387(this.field3934); - var2 += UserComparator5.method3387(this.field3932); - var2 += UserComparator5.method3387(this.field3927); - var2 += UserComparator5.method3387(this.field3906); - var2 += UserComparator5.method3387(this.field3936); + int var2 = var1 + Buddy.method5297(this.field3923); + var2 += Buddy.method5297(this.field3924); + var2 += Buddy.method5297(this.field3925); + var2 += Buddy.method5297(this.field3926); + var2 += Buddy.method5297(this.field3928); + var2 += Buddy.method5297(this.field3932); + var2 += Buddy.method5297(this.field3901); return var2; } } diff --git a/runescape-client/src/main/java/PlatformInfoProvider.java b/runescape-client/src/main/java/PlatformInfoProvider.java index 0a330e4861..cd657862f4 100644 --- a/runescape-client/src/main/java/PlatformInfoProvider.java +++ b/runescape-client/src/main/java/PlatformInfoProvider.java @@ -3,13 +3,13 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ly") +@ObfuscatedName("lb") @Implements("PlatformInfoProvider") public interface PlatformInfoProvider { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)Llt;", - garbageValue = "2006662723" + signature = "(I)Llk;", + garbageValue = "-1540970685" ) @Export("get") PlatformInfo get(); diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index fc723a94c7..a01f45b714 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -4,155 +4,161 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bi") +@ObfuscatedName("bj") @Implements("Player") public final class Player extends Actor { - @ObfuscatedName("z") + @ObfuscatedName("jh") + @ObfuscatedGetter( + intValue = 302709599 + ) + @Export("Scene_plane") + static int Scene_plane; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ljq;" + signature = "Lju;" ) @Export("username") Username username; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhr;" + signature = "Lhe;" ) @Export("appearance") PlayerAppearance appearance; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1858482709 + intValue = -1452773485 ) @Export("headIconPk") int headIconPk; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1159540227 + intValue = 543277395 ) @Export("headIconPrayer") int headIconPrayer; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("actions") String[] actions; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1877190243 + intValue = -1482937775 ) @Export("combatLevel") int combatLevel; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 637335031 + intValue = -1894325429 ) @Export("skillLevel") int skillLevel; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1771866445 + intValue = -910871753 ) @Export("tileHeight") int tileHeight; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -635760975 + intValue = -1047722297 ) @Export("animationCycleStart") int animationCycleStart; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -417952037 + intValue = -1520700303 ) @Export("animationCycleEnd") int animationCycleEnd; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -160406725 + intValue = -1427757385 ) - int field606; - @ObfuscatedName("o") + int field620; + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 259205349 + intValue = 1927324771 ) @Export("tileHeight2") int tileHeight2; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = -115769627 + intValue = 1667324247 ) - int field608; - @ObfuscatedName("e") + int field613; + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Ldh;" + signature = "Ldv;" ) @Export("model0") Model model0; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 1991225207 + intValue = -259291277 ) - int field622; - @ObfuscatedName("t") + int field595; + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = -650011663 + intValue = -1041408825 ) int field611; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 1516041903 + intValue = 1183898211 ) int field612; - @ObfuscatedName("x") - @ObfuscatedGetter( - intValue = -1977928131 - ) - int field613; - @ObfuscatedName("h") - @Export("isUnanimated") - boolean isUnanimated; @ObfuscatedName("s") @ObfuscatedGetter( - intValue = 14620165 + intValue = 1592139531 + ) + int field604; + @ObfuscatedName("b") + @Export("isUnanimated") + boolean isUnanimated; + @ObfuscatedName("z") + @ObfuscatedGetter( + intValue = -118673171 ) @Export("team") int team; @ObfuscatedName("f") @Export("isHidden") boolean isHidden; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 574179385 + intValue = -1409701989 ) @Export("plane") int plane; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -1078544769 + intValue = -1262555149 ) @Export("index") int index; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("isFriendTriBool") TriBool isFriendTriBool; - @ObfuscatedName("k") + @ObfuscatedName("y") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("isInClanChat") TriBool isInClanChat; - @ObfuscatedName("ac") - boolean field621; - @ObfuscatedName("az") + @ObfuscatedName("aa") + boolean field606; + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = -1966699347 + intValue = -655940439 ) @Export("tileX") int tileX; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @ObfuscatedGetter( - intValue = -150727859 + intValue = 2119390623 ) @Export("tileY") int tileY; @@ -175,13 +181,13 @@ public final class Player extends Actor { this.isHidden = false; this.isFriendTriBool = TriBool.TriBool_unknown; this.isInClanChat = TriBool.TriBool_unknown; - this.field621 = false; + this.field606 = false; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-16" + signature = "(Lkc;B)V", + garbageValue = "-1" ) @Export("read") final void read(Buffer var1) { @@ -208,7 +214,7 @@ public final class Player extends Actor { } if (var4[var5] >= 512) { - int var8 = Occluder.ItemDefinition_get(var4[var5] - 512).team; + int var8 = class222.ItemDefinition_get(var4[var5] - 512).team; if (var8 != 0) { this.team = var8; } @@ -220,7 +226,7 @@ public final class Player extends Actor { for (var6 = 0; var6 < 5; ++var6) { var7 = var1.readUnsignedByte(); - if (var7 < 0 || var7 >= PlayerAppearance.field2519[var6].length) { + if (var7 < 0 || var7 >= PlayerAppearance.field2520[var6].length) { var7 = 0; } @@ -263,10 +269,10 @@ public final class Player extends Actor { super.runSequence = -1; } - this.username = new Username(var1.readStringCp1252NullTerminated(), WorldMapSection1.loginType); + this.username = new Username(var1.readStringCp1252NullTerminated(), class60.loginType); this.clearIsFriend(); this.clearIsInClanChat(); - if (this == class223.localPlayer) { + if (this == class215.localPlayer) { RunException.localPlayerName = this.username.getName(); } @@ -284,10 +290,10 @@ public final class Player extends Actor { this.appearance.update(var4, var9, var2 == 1, var3); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-2145672884" + signature = "(S)Z", + garbageValue = "-6206" ) @Export("isFriend") boolean isFriend() { @@ -298,30 +304,30 @@ public final class Player extends Actor { return this.isFriendTriBool == TriBool.TriBool_true; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "77" + garbageValue = "68" ) @Export("clearIsFriend") void clearIsFriend() { this.isFriendTriBool = TriBool.TriBool_unknown; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "79" + signature = "(I)V", + garbageValue = "-51176527" ) @Export("checkIsFriend") void checkIsFriend() { - this.isFriendTriBool = Tiles.friendSystem.isFriendAndHasWorld(this.username) ? TriBool.TriBool_true : TriBool.TriBool_false; + this.isFriendTriBool = PacketWriter.friendSystem.isFriendAndHasWorld(this.username) ? TriBool.TriBool_true : TriBool.TriBool_false; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-408684042" + garbageValue = "-184998769" ) @Export("isClanMember") boolean isClanMember() { @@ -332,48 +338,48 @@ public final class Player extends Actor { return this.isInClanChat == TriBool.TriBool_true; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-2050482015" + garbageValue = "1691080178" ) @Export("clearIsInClanChat") void clearIsInClanChat() { this.isInClanChat = TriBool.TriBool_unknown; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "108" + signature = "(S)V", + garbageValue = "1126" ) @Export("updateIsInClanChat") void updateIsInClanChat() { - this.isInClanChat = Varps.clanChat != null && Varps.clanChat.contains(this.username) ? TriBool.TriBool_true : TriBool.TriBool_false; + this.isInClanChat = class4.clanChat != null && class4.clanChat.contains(this.username) ? TriBool.TriBool_true : TriBool.TriBool_false; } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "20" + signature = "(S)I", + garbageValue = "11776" ) @Export("transformedSize") int transformedSize() { - return this.appearance != null && this.appearance.npcTransformId != -1 ? PacketBufferNode.getNpcDefinition(this.appearance.npcTransformId).size : 1; + return this.appearance != null && this.appearance.npcTransformId != -1 ? SecureRandomCallable.getNpcDefinition(this.appearance.npcTransformId).size : 1; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected final Model getModel() { if (this.appearance == null) { return null; } else { - SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.sequence) : null; - SequenceDefinition var2 = super.movementSequence != -1 && !this.isUnanimated && (super.movementSequence != super.readySequence || var1 == null) ? GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.movementSequence) : null; + SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? PlayerType.SequenceDefinition_get(super.sequence) : null; + SequenceDefinition var2 = super.movementSequence == -1 || this.isUnanimated || super.movementSequence == super.readySequence && var1 != null ? null : PlayerType.SequenceDefinition_get(super.movementSequence); Model var3 = this.appearance.getModel(var1, super.sequenceFrame, var2, super.movementFrame); if (var3 == null) { return null; @@ -383,9 +389,9 @@ public final class Player extends Actor { Model var4; Model[] var5; if (!this.isUnanimated && super.spotAnimation != -1 && super.spotAnimationFrame != -1) { - var4 = InterfaceParent.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); + var4 = MenuAction.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame); if (var4 != null) { - var4.offsetBy(0, -super.heightOffset, 0); + var4.offsetBy(0, -super.field965, 0); var5 = new Model[]{var3, var4}; var3 = new Model(var5, 2); } @@ -398,7 +404,7 @@ public final class Player extends Actor { if (Client.cycle >= this.animationCycleStart && Client.cycle < this.animationCycleEnd) { var4 = this.model0; - var4.offsetBy(this.field606 * 4096 - super.x, this.tileHeight2 - this.tileHeight, this.field608 * 4096 - super.y); + var4.offsetBy(this.field620 * 4096 - super.x, this.tileHeight2 - this.tileHeight, this.field613 * 4096 - super.y); if (super.orientation == 512) { var4.rotateY90Ccw(); var4.rotateY90Ccw(); @@ -423,7 +429,7 @@ public final class Player extends Actor { var4.rotateY90Ccw(); } - var4.offsetBy(super.x - this.field606 * 4096, this.tileHeight - this.tileHeight2, super.y - this.field608 * 4096); + var4.offsetBy(super.x - this.field620 * 4096, this.tileHeight - this.tileHeight2, super.y - this.field613 * 4096); } } @@ -433,24 +439,35 @@ public final class Player extends Actor { } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(IIBB)V", - garbageValue = "37" + signature = "(IIBI)V", + garbageValue = "-1935410968" ) - final void method1274(int var1, int var2, byte var3) { - if (super.sequence != -1 && GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(super.sequence).field3510 == 1) { + final void method1334(int var1, int var2, byte var3) { + if (super.sequence != -1 && PlayerType.SequenceDefinition_get(super.sequence).field3513 == 1) { super.sequence = -1; } - super.field957 = -1; + super.field934 = -1; if (var1 >= 0 && var1 < 104 && var2 >= 0 && var2 < 104) { if (super.pathX[0] >= 0 && super.pathX[0] < 104 && super.pathY[0] >= 0 && super.pathY[0] < 104) { if (var3 == 2) { - class1.method14(this, var1, var2, (byte)2); + Player var4 = this; + int var5 = super.pathX[0]; + int var6 = super.pathY[0]; + int var7 = this.transformedSize(); + if (var5 >= var7 && var5 < 104 - var7 && var6 >= var7 && var6 < 104 - var7 && var1 >= var7 && var1 < 104 - var7 && var2 >= var7 && var2 < 104 - var7) { + int var8 = Message.method1311(var5, var6, this.transformedSize(), WorldMapCacheName.method685(var1, var2), Client.collisionMaps[this.Scene_plane], true, Client.field890, Client.field906); + if (var8 >= 1) { + for (int var9 = 0; var9 < var8 - 1; ++var9) { + var4.method1352(Client.field890[var9], Client.field906[var9], (byte)2); + } + } + } } - this.method1263(var1, var2, var3); + this.method1352(var1, var2, var3); } else { this.resetPath(var1, var2); } @@ -460,29 +477,29 @@ public final class Player extends Actor { } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "-23" + signature = "(III)V", + garbageValue = "1427222618" ) @Export("resetPath") void resetPath(int var1, int var2) { super.pathLength = 0; - super.field988 = 0; - super.field949 = 0; + super.field983 = 0; + super.field982 = 0; super.pathX[0] = var1; super.pathY[0] = var2; int var3 = this.transformedSize(); - super.x = var3 * 64 + super.pathX[0] * 128; - super.y = var3 * 64 + super.pathY[0] * 128; + super.x = super.pathX[0] * 128 + var3 * 64; + super.y = super.pathY[0] * 128 + var3 * 64; } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(IIBI)V", - garbageValue = "-1343044637" + garbageValue = "-2040004615" ) - final void method1263(int var1, int var2, byte var3) { + final void method1352(int var1, int var2, byte var3) { if (super.pathLength < 9) { ++super.pathLength; } @@ -498,13 +515,53 @@ public final class Player extends Actor { super.pathTraversed[0] = var3; } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(S)Z", - garbageValue = "180" + signature = "(B)Z", + garbageValue = "-25" ) @Export("isVisible") final boolean isVisible() { return this.appearance != null; } + + @ObfuscatedName("gi") + @ObfuscatedSignature( + signature = "(Lbj;ZI)V", + garbageValue = "1425328760" + ) + @Export("addPlayerToScene") + static void addPlayerToScene(Player var0, boolean var1) { + if (var0 != null && var0.isVisible() && !var0.isHidden) { + var0.isUnanimated = false; + if ((Client.isLowDetail && Players.Players_count > 50 || Players.Players_count > 200) && var1 && var0.readySequence == var0.movementSequence) { + var0.isUnanimated = true; + } + + int var2 = var0.x >> 7; + int var3 = var0.y >> 7; + if (var2 >= 0 && var2 < 104 && var3 >= 0 && var3 < 104) { + long var4 = class160.calculateTag(0, 0, 0, false, var0.index); + if (var0.model0 != null && Client.cycle >= var0.animationCycleStart && Client.cycle < var0.animationCycleEnd) { + var0.isUnanimated = false; + var0.tileHeight = GraphicsObject.getTileHeight(var0.x, var0.y, Scene_plane); + var0.playerCycle = Client.cycle; + WorldMapArea.scene.addNullableObject(Scene_plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.field595, var0.field611, var0.field612, var0.field604); + } else { + if ((var0.x & 127) == 64 && (var0.y & 127) == 64) { + if (Client.tileLastDrawnActor[var2][var3] == Client.viewportDrawCount) { + return; + } + + Client.tileLastDrawnActor[var2][var3] = Client.viewportDrawCount; + } + + var0.tileHeight = GraphicsObject.getTileHeight(var0.x, var0.y, Scene_plane); + var0.playerCycle = Client.cycle; + WorldMapArea.scene.drawEntity(Scene_plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.isWalking); + } + } + } + + } } diff --git a/runescape-client/src/main/java/PlayerAppearance.java b/runescape-client/src/main/java/PlayerAppearance.java index 80a84c9a6a..5ff3ffeeb2 100644 --- a/runescape-client/src/main/java/PlayerAppearance.java +++ b/runescape-client/src/main/java/PlayerAppearance.java @@ -1,61 +1,60 @@ -import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hr") +@ObfuscatedName("he") @Implements("PlayerAppearance") public class PlayerAppearance { - @ObfuscatedName("m") - public static short[][] field2519; - @ObfuscatedName("y") - public static short[] field2525; @ObfuscatedName("c") + public static short[] field2519; + @ObfuscatedName("o") + public static short[][] field2520; + @ObfuscatedName("m") @Export("equipmentIndices") static final int[] equipmentIndices; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("PlayerAppearance_cachedModels") static EvictingDualNodeHashTable PlayerAppearance_cachedModels; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("equipment") int[] equipment; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("bodyColors") int[] bodyColors; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("isFemale") public boolean isFemale; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 297413953 + intValue = -1447721329 ) @Export("npcTransformId") public int npcTransformId; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - longValue = 720398240330286877L + longValue = 3547676045736653443L ) - long field2526; - @ObfuscatedName("p") + long field2517; + @ObfuscatedName("l") @ObfuscatedGetter( - longValue = -4457276035074261541L + longValue = 826558689471794127L ) - long field2522; + long field2518; static { equipmentIndices = new int[]{8, 11, 4, 6, 9, 7, 10}; PlayerAppearance_cachedModels = new EvictingDualNodeHashTable(260); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "([I[IZII)V", - garbageValue = "16711680" + garbageValue = "2098683582" ) @Export("update") public void update(int[] var1, int[] var2, boolean var3, int var4) { @@ -63,9 +62,9 @@ public class PlayerAppearance { var1 = new int[12]; for (int var5 = 0; var5 < 7; ++var5) { - for (int var6 = 0; var6 < DevicePcmPlayerProvider.KitDefinition_fileCount; ++var6) { - KitDefinition var7 = class216.KitDefinition_get(var6); - if (var7 != null && !var7.nonSelectable && var5 + (var3 ? 7 : 0) == var7.bodypartID) { + for (int var6 = 0; var6 < KitDefinition.KitDefinition_fileCount; ++var6) { + KitDefinition var7 = BufferedSource.KitDefinition_get(var6); + if (var7 != null && !var7.nonSelectable && var7.bodypartID == (var3 ? 7 : 0) + var5) { var1[equipmentIndices[var5]] = var6 + 256; break; } @@ -80,10 +79,10 @@ public class PlayerAppearance { this.setHash(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IZI)V", - garbageValue = "-317022193" + garbageValue = "429844211" ) @Export("changeAppearance") public void changeAppearance(int var1, boolean var2) { @@ -97,17 +96,17 @@ public class PlayerAppearance { if (!var2) { --var3; if (var3 < 0) { - var3 = DevicePcmPlayerProvider.KitDefinition_fileCount - 1; + var3 = KitDefinition.KitDefinition_fileCount - 1; } } else { ++var3; - if (var3 >= DevicePcmPlayerProvider.KitDefinition_fileCount) { + if (var3 >= KitDefinition.KitDefinition_fileCount) { var3 = 0; } } - var4 = class216.KitDefinition_get(var3); - } while(var4 == null || var4.nonSelectable || var4.bodypartID != var1 + (this.isFemale ? 7 : 0)); + var4 = BufferedSource.KitDefinition_get(var3); + } while(var4 == null || var4.nonSelectable || var1 + (this.isFemale ? 7 : 0) != var4.bodypartID); this.equipment[equipmentIndices[var1]] = var3 + 256; this.setHash(); @@ -115,37 +114,50 @@ public class PlayerAppearance { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IZI)V", - garbageValue = "-278552632" + signature = "(IZB)V", + garbageValue = "1" ) - public void method3977(int var1, boolean var2) { + public void method4156(int var1, boolean var2) { int var3 = this.bodyColors[var1]; + boolean var4; if (!var2) { do { --var3; if (var3 < 0) { - var3 = field2519[var1].length - 1; + var3 = field2520[var1].length - 1; } - } while(!NetCache.method4296(var1, var3)); + + if (var1 == 4 && var3 >= 8) { + var4 = false; + } else { + var4 = true; + } + } while(!var4); } else { do { ++var3; - if (var3 >= field2519[var1].length) { + if (var3 >= field2520[var1].length) { var3 = 0; } - } while(!NetCache.method4296(var1, var3)); + + if (var1 == 4 && var3 >= 8) { + var4 = false; + } else { + var4 = true; + } + } while(!var4); } this.bodyColors[var1] = var3; this.setHash(); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "-1564425789" + garbageValue = "864833529" ) @Export("changeSex") public void changeSex(boolean var1) { @@ -154,10 +166,10 @@ public class PlayerAppearance { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-1319583567" + signature = "(Lkc;I)V", + garbageValue = "65280" ) @Export("write") public void write(Buffer var1) { @@ -179,62 +191,62 @@ public class PlayerAppearance { } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1673165778" + garbageValue = "1536337357" ) @Export("setHash") void setHash() { - long var1 = this.field2526; + long var1 = this.field2517; int var3 = this.equipment[5]; int var4 = this.equipment[9]; this.equipment[5] = var4; this.equipment[9] = var3; - this.field2526 = 0L; + this.field2517 = 0L; int var5; for (var5 = 0; var5 < 12; ++var5) { - this.field2526 <<= 4; + this.field2517 <<= 4; if (this.equipment[var5] >= 256) { - this.field2526 += (long)(this.equipment[var5] - 256); + this.field2517 += (long)(this.equipment[var5] - 256); } } if (this.equipment[0] >= 256) { - this.field2526 += (long)(this.equipment[0] - 256 >> 4); + this.field2517 += (long)(this.equipment[0] - 256 >> 4); } if (this.equipment[1] >= 256) { - this.field2526 += (long)(this.equipment[1] - 256 >> 8); + this.field2517 += (long)(this.equipment[1] - 256 >> 8); } for (var5 = 0; var5 < 5; ++var5) { - this.field2526 <<= 3; - this.field2526 += (long)this.bodyColors[var5]; + this.field2517 <<= 3; + this.field2517 += (long)this.bodyColors[var5]; } - this.field2526 <<= 1; - this.field2526 += (long)(this.isFemale ? 1 : 0); + this.field2517 <<= 1; + this.field2517 += (long)(this.isFemale ? 1 : 0); this.equipment[5] = var3; this.equipment[9] = var4; - if (var1 != 0L && this.field2526 != var1) { + if (var1 != 0L && var1 != this.field2517) { PlayerAppearance_cachedModels.remove(var1); } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Lix;ILix;IB)Ldh;", - garbageValue = "2" + signature = "(Liv;ILiv;II)Ldv;", + garbageValue = "-1006380079" ) @Export("getModel") public Model getModel(SequenceDefinition var1, int var2, SequenceDefinition var3, int var4) { if (this.npcTransformId != -1) { - return PacketBufferNode.getNpcDefinition(this.npcTransformId).getModel(var1, var2, var3, var4); + return SecureRandomCallable.getNpcDefinition(this.npcTransformId).getModel(var1, var2, var3, var4); } else { - long var5 = this.field2526; + long var5 = this.field2517; int[] var7 = this.equipment; if (var1 != null && (var1.shield >= 0 || var1.weapon >= 0)) { var7 = new int[12]; @@ -261,18 +273,18 @@ public class PlayerAppearance { int var11; for (int var10 = 0; var10 < 12; ++var10) { var11 = var7[var10]; - if (var11 >= 256 && var11 < 512 && !class216.KitDefinition_get(var11 - 256).ready()) { + if (var11 >= 256 && var11 < 512 && !BufferedSource.KitDefinition_get(var11 - 256).ready()) { var9 = true; } - if (var11 >= 512 && !Occluder.ItemDefinition_get(var11 - 512).hasNoValidModel(this.isFemale)) { + if (var11 >= 512 && !class222.ItemDefinition_get(var11 - 512).hasNoValidModel(this.isFemale)) { var9 = true; } } if (var9) { - if (-1L != this.field2522) { - var8 = (Model)PlayerAppearance_cachedModels.get(this.field2522); + if (-1L != this.field2518) { + var8 = (Model)PlayerAppearance_cachedModels.get(this.field2518); } if (var8 == null) { @@ -289,14 +301,14 @@ public class PlayerAppearance { var13 = var7[var12]; ModelData var14; if (var13 >= 256 && var13 < 512) { - var14 = class216.KitDefinition_get(var13 - 256).getModelData(); + var14 = BufferedSource.KitDefinition_get(var13 - 256).getModelData(); if (var14 != null) { var16[var11++] = var14; } } if (var13 >= 512) { - var14 = Occluder.ItemDefinition_get(var13 - 512).method4605(this.isFemale); + var14 = class222.ItemDefinition_get(var13 - 512).method4790(this.isFemale); if (var14 != null) { var16[var11++] = var14; } @@ -306,18 +318,18 @@ public class PlayerAppearance { ModelData var18 = new ModelData(var16, var11); for (var13 = 0; var13 < 5; ++var13) { - if (this.bodyColors[var13] < field2519[var13].length) { - var18.recolor(HorizontalAlignment.field3447[var13], field2519[var13][this.bodyColors[var13]]); + if (this.bodyColors[var13] < field2520[var13].length) { + var18.recolor(field2519[var13], field2520[var13][this.bodyColors[var13]]); } - if (this.bodyColors[var13] < DevicePcmPlayerProvider.field390[var13].length) { - var18.recolor(field2525[var13], DevicePcmPlayerProvider.field390[var13][this.bodyColors[var13]]); + if (this.bodyColors[var13] < class195.field2359[var13].length) { + var18.recolor(class326.field3881[var13], class195.field2359[var13][this.bodyColors[var13]]); } } var8 = var18.toModel(64, 850, -30, -50, -30); PlayerAppearance_cachedModels.put(var8, var5); - this.field2522 = var5; + this.field2518 = var5; } } @@ -338,26 +350,26 @@ public class PlayerAppearance { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(B)Ldw;", - garbageValue = "65" + signature = "(B)Ldu;", + garbageValue = "-58" ) @Export("getModelData") ModelData getModelData() { if (this.npcTransformId != -1) { - return PacketBufferNode.getNpcDefinition(this.npcTransformId).getModelData(); + return SecureRandomCallable.getNpcDefinition(this.npcTransformId).getModelData(); } else { boolean var1 = false; int var3; for (int var2 = 0; var2 < 12; ++var2) { var3 = this.equipment[var2]; - if (var3 >= 256 && var3 < 512 && !class216.KitDefinition_get(var3 - 256).method4423()) { + if (var3 >= 256 && var3 < 512 && !BufferedSource.KitDefinition_get(var3 - 256).method4602()) { var1 = true; } - if (var3 >= 512 && !Occluder.ItemDefinition_get(var3 - 512).method4623(this.isFemale)) { + if (var3 >= 512 && !class222.ItemDefinition_get(var3 - 512).method4791(this.isFemale)) { var1 = true; } } @@ -373,14 +385,14 @@ public class PlayerAppearance { var5 = this.equipment[var4]; ModelData var6; if (var5 >= 256 && var5 < 512) { - var6 = class216.KitDefinition_get(var5 - 256).getKitDefinitionModels(); + var6 = BufferedSource.KitDefinition_get(var5 - 256).getKitDefinitionModels(); if (var6 != null) { var7[var3++] = var6; } } if (var5 >= 512) { - var6 = Occluder.ItemDefinition_get(var5 - 512).method4607(this.isFemale); + var6 = class222.ItemDefinition_get(var5 - 512).method4792(this.isFemale); if (var6 != null) { var7[var3++] = var6; } @@ -390,12 +402,12 @@ public class PlayerAppearance { ModelData var8 = new ModelData(var7, var3); for (var5 = 0; var5 < 5; ++var5) { - if (this.bodyColors[var5] < field2519[var5].length) { - var8.recolor(HorizontalAlignment.field3447[var5], field2519[var5][this.bodyColors[var5]]); + if (this.bodyColors[var5] < field2520[var5].length) { + var8.recolor(field2519[var5], field2520[var5][this.bodyColors[var5]]); } - if (this.bodyColors[var5] < DevicePcmPlayerProvider.field390[var5].length) { - var8.recolor(field2525[var5], DevicePcmPlayerProvider.field390[var5][this.bodyColors[var5]]); + if (this.bodyColors[var5] < class195.field2359[var5].length) { + var8.recolor(class326.field3881[var5], class195.field2359[var5][this.bodyColors[var5]]); } } @@ -404,285 +416,122 @@ public class PlayerAppearance { } } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-2085645902" + garbageValue = "2091261693" ) @Export("getChatHeadId") public int getChatHeadId() { - return this.npcTransformId == -1 ? (this.equipment[0] << 15) + this.equipment[1] + (this.equipment[11] << 5) + (this.equipment[8] << 10) + (this.bodyColors[0] << 25) + (this.bodyColors[4] << 20) : 305419896 + PacketBufferNode.getNpcDefinition(this.npcTransformId).id; + return this.npcTransformId == -1 ? (this.equipment[0] << 15) + this.equipment[1] + (this.equipment[11] << 5) + (this.equipment[8] << 10) + (this.bodyColors[0] << 25) + (this.bodyColors[4] << 20) : 305419896 + SecureRandomCallable.getNpcDefinition(this.npcTransformId).id; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-1021250910" + signature = "(I)J", + garbageValue = "100440409" ) - public static boolean method4010() { - long var0 = class30.currentTimeMillis(); - int var2 = (int)(var0 - NetCache.field3142); - NetCache.field3142 = var0; - if (var2 > 200) { - var2 = 200; + @Export("currentTimeMillis") + public static final synchronized long currentTimeMillis() { + long var0 = System.currentTimeMillis(); + if (var0 < class296.field3684) { + class296.field3683 += class296.field3684 - var0; } - NetCache.NetCache_loadTime += var2; - if (NetCache.NetCache_pendingResponsesCount == 0 && NetCache.NetCache_pendingPriorityResponsesCount == 0 && NetCache.NetCache_pendingWritesCount == 0 && NetCache.NetCache_pendingPriorityWritesCount == 0) { - return true; - } else if (NetCache.NetCache_socket == null) { - return false; + class296.field3684 = var0; + return var0 + class296.field3683; + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(II)Z", + garbageValue = "-994897132" + ) + @Export("isWorldMapEvent") + public static boolean isWorldMapEvent(int var0) { + return var0 == 10 || var0 == 11 || var0 == 12 || var0 == 13 || var0 == 14 || var0 == 15 || var0 == 16 || var0 == 17; + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(Lhq;Ljava/lang/String;Ljava/lang/String;I)[Llw;", + garbageValue = "-1961704142" + ) + public static IndexedSprite[] method4160(AbstractArchive var0, String var1, String var2) { + int var3 = var0.getGroupId(var1); + int var4 = var0.getFileId(var3, var2); + IndexedSprite[] var5; + if (!class32.method618(var0, var3, var4)) { + var5 = null; } else { - try { - if (NetCache.NetCache_loadTime > 30000) { - throw new IOException(); - } else { - NetFileRequest var3; - Buffer var4; - while (NetCache.NetCache_pendingPriorityResponsesCount < 200 && NetCache.NetCache_pendingPriorityWritesCount > 0) { - var3 = (NetFileRequest)NetCache.NetCache_pendingPriorityWrites.first(); - var4 = new Buffer(4); - var4.writeByte(1); - var4.writeMedium((int)var3.key); - NetCache.NetCache_socket.write(var4.array, 0, 4); - NetCache.NetCache_pendingPriorityResponses.put(var3, var3.key); - --NetCache.NetCache_pendingPriorityWritesCount; - ++NetCache.NetCache_pendingPriorityResponsesCount; - } + IndexedSprite[] var7 = new IndexedSprite[class325.SpriteBuffer_spriteCount]; - while (NetCache.NetCache_pendingResponsesCount < 200 && NetCache.NetCache_pendingWritesCount > 0) { - var3 = (NetFileRequest)NetCache.NetCache_pendingWritesQueue.removeLast(); - var4 = new Buffer(4); - var4.writeByte(0); - var4.writeMedium((int)var3.key); - NetCache.NetCache_socket.write(var4.array, 0, 4); - var3.removeDual(); - NetCache.NetCache_pendingResponses.put(var3, var3.key); - --NetCache.NetCache_pendingWritesCount; - ++NetCache.NetCache_pendingResponsesCount; - } + for (int var8 = 0; var8 < class325.SpriteBuffer_spriteCount; ++var8) { + IndexedSprite var9 = var7[var8] = new IndexedSprite(); + var9.width = class325.SpriteBuffer_spriteWidth; + var9.height = class325.SpriteBuffer_spriteHeight; + var9.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[var8]; + var9.yOffset = HealthBar.SpriteBuffer_yOffsets[var8]; + var9.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[var8]; + var9.subHeight = AttackOption.SpriteBuffer_spriteHeights[var8]; + var9.palette = class325.SpriteBuffer_spritePalette; + var9.pixels = class325.SpriteBuffer_pixels[var8]; + } - for (int var15 = 0; var15 < 100; ++var15) { - int var16 = NetCache.NetCache_socket.available(); - if (var16 < 0) { - throw new IOException(); - } + WorldMapData_1.method787(); + var5 = var7; + } - if (var16 == 0) { - break; - } + return var5; + } - NetCache.NetCache_loadTime = 0; - byte var5 = 0; - if (WorldMapEvent.NetCache_currentResponse == null) { - var5 = 8; - } else if (NetCache.field3140 == 0) { - var5 = 1; - } + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(IB)V", + garbageValue = "103" + ) + public static void method4191(int var0) { + if (var0 != -1) { + if (class215.Widget_loadedInterfaces[var0]) { + Coord.Widget_archive.clearFilesGroup(var0); + if (Widget.Widget_interfaceComponents[var0] != null) { + boolean var1 = true; - int var6; - int var7; - int var8; - int var10; - byte[] var10000; - int var10001; - Buffer var22; - if (var5 > 0) { - var6 = var5 - NetCache.NetCache_responseHeaderBuffer.offset; - if (var6 > var16) { - var6 = var16; - } - - NetCache.NetCache_socket.read(NetCache.NetCache_responseHeaderBuffer.array, NetCache.NetCache_responseHeaderBuffer.offset, var6); - if (NetCache.field3156 != 0) { - for (var7 = 0; var7 < var6; ++var7) { - var10000 = NetCache.NetCache_responseHeaderBuffer.array; - var10001 = NetCache.NetCache_responseHeaderBuffer.offset + var7; - var10000[var10001] ^= NetCache.field3156; - } - } - - var22 = NetCache.NetCache_responseHeaderBuffer; - var22.offset += var6; - if (NetCache.NetCache_responseHeaderBuffer.offset < var5) { - break; - } - - if (WorldMapEvent.NetCache_currentResponse == null) { - NetCache.NetCache_responseHeaderBuffer.offset = 0; - var7 = NetCache.NetCache_responseHeaderBuffer.readUnsignedByte(); - var8 = NetCache.NetCache_responseHeaderBuffer.readUnsignedShort(); - int var9 = NetCache.NetCache_responseHeaderBuffer.readUnsignedByte(); - var10 = NetCache.NetCache_responseHeaderBuffer.readInt(); - long var11 = (long)(var8 + (var7 << 16)); - NetFileRequest var13 = (NetFileRequest)NetCache.NetCache_pendingPriorityResponses.get(var11); - UserComparator10.field1957 = true; - if (var13 == null) { - var13 = (NetFileRequest)NetCache.NetCache_pendingResponses.get(var11); - UserComparator10.field1957 = false; - } - - if (var13 == null) { - throw new IOException(); - } - - int var14 = var9 == 0 ? 5 : 9; - WorldMapEvent.NetCache_currentResponse = var13; - FaceNormal.NetCache_responseArchiveBuffer = new Buffer(var10 + var14 + WorldMapEvent.NetCache_currentResponse.padding); - FaceNormal.NetCache_responseArchiveBuffer.writeByte(var9); - FaceNormal.NetCache_responseArchiveBuffer.writeInt(var10); - NetCache.field3140 = 8; - NetCache.NetCache_responseHeaderBuffer.offset = 0; - } else if (NetCache.field3140 == 0) { - if (NetCache.NetCache_responseHeaderBuffer.array[0] == -1) { - NetCache.field3140 = 1; - NetCache.NetCache_responseHeaderBuffer.offset = 0; - } else { - WorldMapEvent.NetCache_currentResponse = null; - } - } - } else { - var6 = FaceNormal.NetCache_responseArchiveBuffer.array.length - WorldMapEvent.NetCache_currentResponse.padding; - var7 = 512 - NetCache.field3140; - if (var7 > var6 - FaceNormal.NetCache_responseArchiveBuffer.offset) { - var7 = var6 - FaceNormal.NetCache_responseArchiveBuffer.offset; - } - - if (var7 > var16) { - var7 = var16; - } - - NetCache.NetCache_socket.read(FaceNormal.NetCache_responseArchiveBuffer.array, FaceNormal.NetCache_responseArchiveBuffer.offset, var7); - if (NetCache.field3156 != 0) { - for (var8 = 0; var8 < var7; ++var8) { - var10000 = FaceNormal.NetCache_responseArchiveBuffer.array; - var10001 = var8 + FaceNormal.NetCache_responseArchiveBuffer.offset; - var10000[var10001] ^= NetCache.field3156; - } - } - - var22 = FaceNormal.NetCache_responseArchiveBuffer; - var22.offset += var7; - NetCache.field3140 += var7; - if (var6 == FaceNormal.NetCache_responseArchiveBuffer.offset) { - if (16711935L == WorldMapEvent.NetCache_currentResponse.key) { - AbstractWorldMapIcon.NetCache_reference = FaceNormal.NetCache_responseArchiveBuffer; - - for (var8 = 0; var8 < 256; ++var8) { - Archive var17 = NetCache.NetCache_archives[var8]; - if (var17 != null) { - AbstractWorldMapIcon.NetCache_reference.offset = var8 * 8 + 5; - var10 = AbstractWorldMapIcon.NetCache_reference.readInt(); - int var18 = AbstractWorldMapIcon.NetCache_reference.readInt(); - var17.loadIndex(var10, var18); - } - } - } else { - NetCache.NetCache_crc.reset(); - NetCache.NetCache_crc.update(FaceNormal.NetCache_responseArchiveBuffer.array, 0, var6); - var8 = (int)NetCache.NetCache_crc.getValue(); - if (var8 != WorldMapEvent.NetCache_currentResponse.crc) { - try { - NetCache.NetCache_socket.close(); - } catch (Exception var20) { - } - - ++NetCache.NetCache_crcMismatches; - NetCache.NetCache_socket = null; - NetCache.field3156 = (byte)((int)(Math.random() * 255.0D + 1.0D)); - return false; - } - - NetCache.NetCache_crcMismatches = 0; - NetCache.NetCache_ioExceptions = 0; - WorldMapEvent.NetCache_currentResponse.archive.write((int)(WorldMapEvent.NetCache_currentResponse.key & 65535L), FaceNormal.NetCache_responseArchiveBuffer.array, (WorldMapEvent.NetCache_currentResponse.key & 16711680L) == 16711680L, UserComparator10.field1957); - } - - WorldMapEvent.NetCache_currentResponse.remove(); - if (UserComparator10.field1957) { - --NetCache.NetCache_pendingPriorityResponsesCount; - } else { - --NetCache.NetCache_pendingResponsesCount; - } - - NetCache.field3140 = 0; - WorldMapEvent.NetCache_currentResponse = null; - FaceNormal.NetCache_responseArchiveBuffer = null; + for (int var2 = 0; var2 < Widget.Widget_interfaceComponents[var0].length; ++var2) { + if (Widget.Widget_interfaceComponents[var0][var2] != null) { + if (Widget.Widget_interfaceComponents[var0][var2].type != 2) { + Widget.Widget_interfaceComponents[var0][var2] = null; } else { - if (NetCache.field3140 != 512) { - break; - } - - NetCache.field3140 = 0; + var1 = false; } } } - return true; - } - } catch (IOException var21) { - try { - NetCache.NetCache_socket.close(); - } catch (Exception var19) { - } + if (var1) { + Widget.Widget_interfaceComponents[var0] = null; + } - ++NetCache.NetCache_ioExceptions; - NetCache.NetCache_socket = null; - return false; + class215.Widget_loadedInterfaces[var0] = false; + } } } } - @ObfuscatedName("z") + @ObfuscatedName("ae") @ObfuscatedSignature( - signature = "(B)[Lin;", - garbageValue = "101" + signature = "(Ldj;B)V", + garbageValue = "11" ) - static HorizontalAlignment[] method4012() { - return new HorizontalAlignment[]{HorizontalAlignment.field3442, HorizontalAlignment.field3444, HorizontalAlignment.HorizontalAlignment_centered}; - } - - @ObfuscatedName("ai") - @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "1781991052" - ) - static int method3978(int var0) { - return (int)Math.pow(2.0D, (double)(7.0F + (float)var0 / 256.0F)); - } - - @ObfuscatedName("go") - @ObfuscatedSignature( - signature = "(IIII)V", - garbageValue = "1898502945" - ) - @Export("worldToScreen") - static final void worldToScreen(int var0, int var1, int var2) { - if (var0 >= 128 && var1 >= 128 && var0 <= 13056 && var1 <= 13056) { - int var3 = MusicPatchPcmStream.getTileHeight(var0, var1, WorldMapRectangle.plane) - var2; - var0 -= GrandExchangeOfferOwnWorldComparator.cameraX; - var3 -= Varcs.cameraY; - var1 -= WorldMapIcon_1.cameraZ; - int var4 = Rasterizer3D.Rasterizer3D_sine[IgnoreList.cameraPitch]; - int var5 = Rasterizer3D.Rasterizer3D_cosine[IgnoreList.cameraPitch]; - int var6 = Rasterizer3D.Rasterizer3D_sine[WorldMapSection2.cameraYaw]; - int var7 = Rasterizer3D.Rasterizer3D_cosine[WorldMapSection2.cameraYaw]; - int var8 = var6 * var1 + var0 * var7 >> 16; - var1 = var7 * var1 - var0 * var6 >> 16; - var0 = var8; - var8 = var3 * var5 - var4 * var1 >> 16; - var1 = var5 * var1 + var4 * var3 >> 16; - if (var1 >= 50) { - Client.viewportTempX = var0 * Client.viewportZoom / var1 + Client.viewportWidth / 2; - Client.viewportTempY = Client.viewportHeight / 2 + var8 * Client.viewportZoom / var1; - } else { - Client.viewportTempX = -1; - Client.viewportTempY = -1; - } - - } else { - Client.viewportTempX = -1; - Client.viewportTempY = -1; + @Export("PcmStream_disable") + static final void PcmStream_disable(PcmStream var0) { + var0.active = false; + if (var0.sound != null) { + var0.sound.position = 0; } + + for (PcmStream var1 = var0.firstSubStream(); var1 != null; var1 = var0.nextSubStream()) { + PcmStream_disable(var1); + } + } } diff --git a/runescape-client/src/main/java/PlayerType.java b/runescape-client/src/main/java/PlayerType.java index 54161234ea..de53e0478a 100644 --- a/runescape-client/src/main/java/PlayerType.java +++ b/runescape-client/src/main/java/PlayerType.java @@ -4,62 +4,64 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hj") +@ObfuscatedName("hy") @Implements("PlayerType") public enum PlayerType implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhj;" + signature = "Lhy;" ) @Export("PlayerType_normal") PlayerType_normal(0, -1, true, false, true), - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhj;" + signature = "Lhy;" ) @Export("PlayerType_playerModerator") PlayerType_playerModerator(1, 0, true, true, true), - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhj;" + signature = "Lhy;" ) @Export("PlayerType_jagexModerator") PlayerType_jagexModerator(2, 1, true, true, false), - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lhj;" + signature = "Lhy;" ) @Export("PlayerType_ironman") PlayerType_ironman(3, 2, false, false, true), - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lhj;" + signature = "Lhy;" ) @Export("PlayerType_ultimateIronman") PlayerType_ultimateIronman(4, 3, false, false, true), - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lhj;" + signature = "Lhy;" ) @Export("PlayerType_hardcoreIronman") PlayerType_hardcoreIronman(5, 10, false, false, true); - @ObfuscatedName("q") + @ObfuscatedName("k") + static int[] field3083; + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1844030563 + intValue = 28008263 ) @Export("id") final int id; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -1331495779 + intValue = -573652869 ) @Export("modIcon") public final int modIcon; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("isPrivileged") public final boolean isPrivileged; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("isUser") public final boolean isUser; @@ -70,166 +72,65 @@ public enum PlayerType implements Enumerated { this.isUser = var7; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("m") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V", - garbageValue = "-1550321441" + signature = "(Llx;IIII)V", + garbageValue = "-964423468" ) - @Export("setLoginResponseString") - static void setLoginResponseString(String var0, String var1, String var2) { - Login.Login_response1 = var0; - Login.Login_response2 = var1; - Login.Login_response3 = var2; + static void method4285(Sprite var0, int var1, int var2, int var3) { + DemotingHashTable var4 = WorldMapRegion.WorldMapRegion_cachedSprites; + long var6 = (long)(var3 << 16 | var1 << 8 | var2); + var4.put(var0, var6, var0.pixels.length * 4); } - @ObfuscatedName("fe") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(ZI)V", - garbageValue = "297483019" + signature = "(II)Liv;", + garbageValue = "-872663018" ) - static final void method4104(boolean var0) { - if (var0) { - Client.field672 = Login.field1183 ? class160.field1976 : class160.field1977; + @Export("SequenceDefinition_get") + public static SequenceDefinition SequenceDefinition_get(int var0) { + SequenceDefinition var1 = (SequenceDefinition)SequenceDefinition.SequenceDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; } else { - Client.field672 = AbstractArchive.clientPreferences.parameters.containsKey(class288.method5224(Login.Login_username)) ? class160.field1979 : class160.field1985; - } + byte[] var2 = SequenceDefinition.SequenceDefinition_archive.takeFile(12, var0); + var1 = new SequenceDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + var1.postDecode(); + SequenceDefinition.SequenceDefinition_cached.put(var1, (long)var0); + return var1; + } } - @ObfuscatedName("gb") + @ObfuscatedName("ku") @ObfuscatedSignature( - signature = "(ZLkf;I)V", - garbageValue = "-100712701" + signature = "(Lhi;IIII)V", + garbageValue = "-1541837446" ) - @Export("loadRegions") - static final void loadRegions(boolean var0, PacketBuffer var1) { - Client.isInInstance = var0; - int var2; - int var4; - int var5; - int var6; - int var7; - int var8; - if (!Client.isInInstance) { - var2 = var1.method5647(); - int var3 = var1.method5479(); - var4 = var1.readUnsignedShort(); - class296.xteaKeys = new int[var4][4]; - - for (var5 = 0; var5 < var4; ++var5) { - for (var6 = 0; var6 < 4; ++var6) { - class296.xteaKeys[var5][var6] = var1.readInt(); - } + @Export("drawCompass") + static final void drawCompass(Widget var0, int var1, int var2, int var3) { + SpriteMask var4 = var0.getSpriteMask(false); + if (var4 != null) { + if (Client.minimapState < 3) { + class1.compass.drawRotatedMaskedCenteredAround(var1, var2, var4.width, var4.height, 25, 25, Client.camAngleY, 256, var4.xStarts, var4.xWidths); + } else { + Rasterizer2D.Rasterizer2D_fillMaskedRectangle(var1, var2, 0, var4.xStarts, var4.xWidths); } - MouseHandler.regions = new int[var4]; - class197.regionMapArchiveIds = new int[var4]; - class60.regionLandArchiveIds = new int[var4]; - WorldMapIcon_1.regionLandArchives = new byte[var4][]; - ArchiveLoader.regionMapArchives = new byte[var4][]; - boolean var16 = false; - if ((var2 / 8 == 48 || var2 / 8 == 49) && var3 / 8 == 48) { - var16 = true; - } - - if (var2 / 8 == 48 && var3 / 8 == 148) { - var16 = true; - } - - var4 = 0; - - for (var6 = (var2 - 6) / 8; var6 <= (var2 + 6) / 8; ++var6) { - for (var7 = (var3 - 6) / 8; var7 <= (var3 + 6) / 8; ++var7) { - var8 = var7 + (var6 << 8); - if (!var16 || var7 != 49 && var7 != 149 && var7 != 147 && var6 != 50 && (var6 != 49 || var7 != 47)) { - MouseHandler.regions[var4] = var8; - class197.regionMapArchiveIds[var4] = class3.archive5.getGroupId("m" + var6 + "_" + var7); - class60.regionLandArchiveIds[var4] = class3.archive5.getGroupId("l" + var6 + "_" + var7); - ++var4; - } - } - } - - class289.method5228(var2, var3, true); - } else { - var2 = var1.readUnsignedShort(); - boolean var15 = var1.method5511() == 1; - var4 = var1.method5647(); - var5 = var1.readUnsignedShort(); - var1.importIndex(); - - int var9; - for (var6 = 0; var6 < 4; ++var6) { - for (var7 = 0; var7 < 13; ++var7) { - for (var8 = 0; var8 < 13; ++var8) { - var9 = var1.readBits(1); - if (var9 == 1) { - Client.instanceChunkTemplates[var6][var7][var8] = var1.readBits(26); - } else { - Client.instanceChunkTemplates[var6][var7][var8] = -1; - } - } - } - } - - var1.exportIndex(); - class296.xteaKeys = new int[var5][4]; - - for (var6 = 0; var6 < var5; ++var6) { - for (var7 = 0; var7 < 4; ++var7) { - class296.xteaKeys[var6][var7] = var1.readInt(); - } - } - - MouseHandler.regions = new int[var5]; - class197.regionMapArchiveIds = new int[var5]; - class60.regionLandArchiveIds = new int[var5]; - WorldMapIcon_1.regionLandArchives = new byte[var5][]; - ArchiveLoader.regionMapArchives = new byte[var5][]; - var5 = 0; - - for (var6 = 0; var6 < 4; ++var6) { - for (var7 = 0; var7 < 13; ++var7) { - for (var8 = 0; var8 < 13; ++var8) { - var9 = Client.instanceChunkTemplates[var6][var7][var8]; - if (var9 != -1) { - int var10 = var9 >> 14 & 1023; - int var11 = var9 >> 3 & 2047; - int var12 = (var10 / 8 << 8) + var11 / 8; - - int var13; - for (var13 = 0; var13 < var5; ++var13) { - if (MouseHandler.regions[var13] == var12) { - var12 = -1; - break; - } - } - - if (var12 != -1) { - MouseHandler.regions[var5] = var12; - var13 = var12 >> 8 & 255; - int var14 = var12 & 255; - class197.regionMapArchiveIds[var5] = class3.archive5.getGroupId("m" + var13 + "_" + var14); - class60.regionLandArchiveIds[var5] = class3.archive5.getGroupId("l" + var13 + "_" + var14); - ++var5; - } - } - } - } - } - - class289.method5228(var4, var2, !var15); } - } } diff --git a/runescape-client/src/main/java/Players.java b/runescape-client/src/main/java/Players.java index f4596e1564..d107441f6e 100644 --- a/runescape-client/src/main/java/Players.java +++ b/runescape-client/src/main/java/Players.java @@ -4,64 +4,64 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cr") +@ObfuscatedName("cu") @Implements("Players") public class Players { + @ObfuscatedName("n") + static byte[] field1227; + @ObfuscatedName("q") + static byte[] field1228; @ObfuscatedName("v") - static byte[] field1244; - @ObfuscatedName("u") - static byte[] field1235; - @ObfuscatedName("r") @ObfuscatedSignature( - signature = "[Lkl;" + signature = "[Lkc;" ) - static Buffer[] field1236; - @ObfuscatedName("p") + static Buffer[] field1229; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 842790617 + intValue = -1057935815 ) @Export("Players_count") static int Players_count; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("Players_indices") static int[] Players_indices; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -662435465 + intValue = 1503324563 ) @Export("Players_emptyIdxCount") static int Players_emptyIdxCount; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("Players_emptyIndices") static int[] Players_emptyIndices; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("Players_regions") static int[] Players_regions; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("Players_orientations") static int[] Players_orientations; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("Players_targetIndices") static int[] Players_targetIndices; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 301065307 + intValue = -1083709183 ) @Export("Players_pendingUpdateCount") static int Players_pendingUpdateCount; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("Players_pendingUpdateIndices") static int[] Players_pendingUpdateIndices; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Lkl;" + signature = "Lkc;" ) - static Buffer field1246; + static Buffer field1238; static { - field1244 = new byte[2048]; - field1235 = new byte[2048]; - field1236 = new Buffer[2048]; + field1227 = new byte[2048]; + field1228 = new byte[2048]; + field1229 = new Buffer[2048]; Players_count = 0; Players_indices = new int[2048]; Players_emptyIdxCount = 0; @@ -71,46 +71,30 @@ public class Players { Players_targetIndices = new int[2048]; Players_pendingUpdateCount = 0; Players_pendingUpdateIndices = new int[2048]; - field1246 = new Buffer(new byte[5000]); + field1238 = new Buffer(new byte[5000]); } - @ObfuscatedName("gw") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(Lbi;ZI)V", - garbageValue = "-1924716638" + signature = "(Ljava/lang/String;I)V", + garbageValue = "1609837921" ) - @Export("addPlayerToScene") - static void addPlayerToScene(Player var0, boolean var1) { - if (var0 != null && var0.isVisible() && !var0.isHidden) { - var0.isUnanimated = false; - if ((Client.isLowDetail && Players_count > 50 || Players_count > 200) && var1 && var0.readySequence == var0.movementSequence) { - var0.isUnanimated = true; - } - - int var2 = var0.x >> 7; - int var3 = var0.y >> 7; - if (var2 >= 0 && var2 < 104 && var3 >= 0 && var3 < 104) { - long var4 = class267.calculateTag(0, 0, 0, false, var0.index); - if (var0.model0 != null && Client.cycle >= var0.animationCycleStart && Client.cycle < var0.animationCycleEnd) { - var0.isUnanimated = false; - var0.tileHeight = MusicPatchPcmStream.getTileHeight(var0.x, var0.y, WorldMapRectangle.plane); - var0.playerCycle = Client.cycle; - PacketWriter.scene.addNullableObject(WorldMapRectangle.plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.field622, var0.field611, var0.field612, var0.field613); - } else { - if ((var0.x & 127) == 64 && (var0.y & 127) == 64) { - if (Client.tileLastDrawnActor[var2][var3] == Client.viewportDrawCount) { - return; - } - - Client.tileLastDrawnActor[var2][var3] = Client.viewportDrawCount; - } - - var0.tileHeight = MusicPatchPcmStream.getTileHeight(var0.x, var0.y, WorldMapRectangle.plane); - var0.playerCycle = Client.cycle; - PacketWriter.scene.drawEntity(WorldMapRectangle.plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.isWalking); - } - } - } + static final void method2308(String var0) { + StringBuilder var10000 = new StringBuilder(); + Object var10001 = null; + var10000 = var10000.append("Please remove ").append(var0); + var10001 = null; + String var1 = var10000.append(" from your ignore list first").toString(); + class30.addGameMessage(30, "", var1); + } + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "108" + ) + static void method2298() { + Login.loginIndex = 24; + GrandExchangeOffer.setLoginResponseString("The game servers are currently being updated.", "Please wait a few minutes and try again.", ""); } } diff --git a/runescape-client/src/main/java/PrivateChatMode.java b/runescape-client/src/main/java/PrivateChatMode.java index 834f83806e..e9a18f3fe4 100644 --- a/runescape-client/src/main/java/PrivateChatMode.java +++ b/runescape-client/src/main/java/PrivateChatMode.java @@ -3,37 +3,37 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kc") +@ObfuscatedName("kt") @Implements("PrivateChatMode") public class PrivateChatMode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lkc;" + signature = "Lkt;" ) - static final PrivateChatMode field3790; + static final PrivateChatMode field3778; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lkt;" + ) + public static final PrivateChatMode field3779; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lkc;" + signature = "Lkt;" ) - public static final PrivateChatMode field3791; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lkc;" - ) - static final PrivateChatMode field3792; - @ObfuscatedName("u") + static final PrivateChatMode field3782; + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1358406113 + intValue = 1472825575 ) - public final int field3793; + public final int field3781; static { - field3790 = new PrivateChatMode(0); - field3791 = new PrivateChatMode(1); - field3792 = new PrivateChatMode(2); + field3778 = new PrivateChatMode(0); + field3779 = new PrivateChatMode(1); + field3782 = new PrivateChatMode(2); } PrivateChatMode(int var1) { - this.field3793 = var1; + this.field3781 = var1; } } diff --git a/runescape-client/src/main/java/Projectile.java b/runescape-client/src/main/java/Projectile.java index ee77350ae8..cb4ab38fb3 100644 --- a/runescape-client/src/main/java/Projectile.java +++ b/runescape-client/src/main/java/Projectile.java @@ -7,126 +7,126 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("cy") @Implements("Projectile") public final class Projectile extends Entity { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -704302089 + intValue = -464791279 ) @Export("id") int id; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 373161727 + intValue = 458201439 ) @Export("plane") int plane; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -2017111693 + intValue = -2076592615 ) @Export("sourceX") int sourceX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1525037115 + intValue = 623427875 ) @Export("sourceY") int sourceY; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1560824427 + intValue = -2041358603 ) @Export("sourceZ") int sourceZ; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 396414685 + intValue = -10892035 ) @Export("endHeight") int endHeight; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 655131925 + intValue = -2134033129 ) @Export("cycleStart") int cycleStart; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -673682431 + intValue = 1813713909 ) @Export("cycleEnd") int cycleEnd; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1319621727 + intValue = -580647449 ) @Export("slope") int slope; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -1718323581 + intValue = -1691147323 ) @Export("startHeight") int startHeight; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -216257617 + intValue = 1840141045 ) @Export("targetIndex") int targetIndex; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("isMoving") boolean isMoving; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("x") double x; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("y") double y; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("z") double z; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("speedX") double speedX; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("speedY") double speedY; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("speed") double speed; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("speedZ") double speedZ; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("accelerationZ") double accelerationZ; - @ObfuscatedName("s") + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = 797140937 + intValue = -893857759 ) @Export("yaw") int yaw; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = -1677081341 + intValue = 915982703 ) @Export("pitch") int pitch; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedSignature( - signature = "Lix;" + signature = "Liv;" ) @Export("sequenceDefinition") SequenceDefinition sequenceDefinition; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = 1931929967 + intValue = 83831929 ) @Export("frame") int frame; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = -1977187681 + intValue = 324172471 ) @Export("frameCycle") int frameCycle; @@ -147,19 +147,19 @@ public final class Projectile extends Entity { this.targetIndex = var10; this.endHeight = var11; this.isMoving = false; - int var12 = InterfaceParent.SpotAnimationDefinition_get(this.id).sequence; + int var12 = MenuAction.SpotAnimationDefinition_get(this.id).sequence; if (var12 != -1) { - this.sequenceDefinition = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var12); + this.sequenceDefinition = PlayerType.SequenceDefinition_get(var12); } else { this.sequenceDefinition = null; } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(IIIII)V", - garbageValue = "1126340593" + garbageValue = "-1390758796" ) @Export("setDestination") final void setDestination(int var1, int var2, int var3, int var4) { @@ -167,16 +167,16 @@ public final class Projectile extends Entity { if (!this.isMoving) { var5 = (double)(var1 - this.sourceX); double var7 = (double)(var2 - this.sourceY); - double var9 = Math.sqrt(var7 * var7 + var5 * var5); - this.x = (double)this.startHeight * var5 / var9 + (double)this.sourceX; - this.y = (double)this.startHeight * var7 / var9 + (double)this.sourceY; + double var9 = Math.sqrt(var5 * var5 + var7 * var7); + this.x = (double)this.sourceX + (double)this.startHeight * var5 / var9; + this.y = (double)this.sourceY + (double)this.startHeight * var7 / var9; this.z = (double)this.sourceZ; } var5 = (double)(this.cycleEnd + 1 - var4); this.speedX = ((double)var1 - this.x) / var5; this.speedY = ((double)var2 - this.y) / var5; - this.speed = Math.sqrt(this.speedX * this.speedX + this.speedY * this.speedY); + this.speed = Math.sqrt(this.speedY * this.speedY + this.speedX * this.speedX); if (!this.isMoving) { this.speedZ = -this.speed * Math.tan(0.02454369D * (double)this.slope); } @@ -184,17 +184,17 @@ public final class Projectile extends Entity { this.accelerationZ = 2.0D * ((double)var3 - this.z - var5 * this.speedZ) / (var5 * var5); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IS)V", - garbageValue = "-22789" + signature = "(II)V", + garbageValue = "931373856" ) @Export("advance") final void advance(int var1) { this.isMoving = true; this.x += this.speedX * (double)var1; - this.y += this.speedY * (double)var1; - this.z += (double)var1 * (double)var1 * 0.5D * this.accelerationZ + (double)var1 * this.speedZ; + this.y += (double)var1 * this.speedY; + this.z += this.accelerationZ * 0.5D * (double)var1 * (double)var1 + this.speedZ * (double)var1; this.speedZ += this.accelerationZ * (double)var1; this.yaw = (int)(Math.atan2(this.speedX, this.speedY) * 325.949D) + 1024 & 2047; this.pitch = (int)(Math.atan2(this.speedZ, this.speed) * 325.949D) & 2047; @@ -220,14 +220,14 @@ public final class Projectile extends Entity { } } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected final Model getModel() { - SpotAnimationDefinition var1 = InterfaceParent.SpotAnimationDefinition_get(this.id); + SpotAnimationDefinition var1 = MenuAction.SpotAnimationDefinition_get(this.id); Model var2 = var1.getModel(this.frame); if (var2 == null) { return null; @@ -237,48 +237,26 @@ public final class Projectile extends Entity { } } - @ObfuscatedName("r") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IB)I", - garbageValue = "106" + signature = "(Ljava/lang/CharSequence;I)I", + garbageValue = "1093152418" ) - @Export("Messages_getHistorySize") - static int Messages_getHistorySize(int var0) { - ChatChannel var1 = (ChatChannel)Messages.Messages_channels.get(var0); - return var1 == null ? 0 : var1.size(); - } + public static int method2268(CharSequence var0) { + int var1 = var0.length(); + int var2 = 0; - @ObfuscatedName("ir") - @ObfuscatedSignature( - signature = "(Lho;I)Z", - garbageValue = "-1182032943" - ) - @Export("runCs1") - static final boolean runCs1(Widget var0) { - if (var0.cs1Comparisons == null) { - return false; - } else { - for (int var1 = 0; var1 < var0.cs1Comparisons.length; ++var1) { - int var2 = class216.method4015(var0, var1); - int var3 = var0.cs1ComparisonValues[var1]; - if (var0.cs1Comparisons[var1] == 2) { - if (var2 >= var3) { - return false; - } - } else if (var0.cs1Comparisons[var1] == 3) { - if (var2 <= var3) { - return false; - } - } else if (var0.cs1Comparisons[var1] == 4) { - if (var2 == var3) { - return false; - } - } else if (var3 != var2) { - return false; - } + for (int var3 = 0; var3 < var1; ++var3) { + char var4 = var0.charAt(var3); + if (var4 <= 127) { + ++var2; + } else if (var4 <= 2047) { + var2 += 2; + } else { + var2 += 3; } - - return true; } + + return var2; } } diff --git a/runescape-client/src/main/java/RasterProvider.java b/runescape-client/src/main/java/RasterProvider.java index d22cac708e..9c7460447b 100644 --- a/runescape-client/src/main/java/RasterProvider.java +++ b/runescape-client/src/main/java/RasterProvider.java @@ -14,13 +14,13 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bx") +@ObfuscatedName("ba") @Implements("RasterProvider") public final class RasterProvider extends AbstractRasterProvider { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("component") Component component; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("image") Image image; @@ -36,40 +36,40 @@ public final class RasterProvider extends AbstractRasterProvider { this.apply(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(Ljava/awt/Component;I)V", - garbageValue = "1269592003" + garbageValue = "-434500602" ) @Export("setComponent") final void setComponent(Component var1) { this.component = var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "-1952064900" + signature = "(IIB)V", + garbageValue = "3" ) @Export("drawFull") public final void drawFull(int var1, int var2) { this.drawFull0(this.component.getGraphics(), var1, var2); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(IIIII)V", - garbageValue = "-67564732" + garbageValue = "-2086134046" ) @Export("draw") public final void draw(int var1, int var2, int var3, int var4) { this.draw0(this.component.getGraphics(), var1, var2, var3, var4); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Ljava/awt/Graphics;IIB)V", - garbageValue = "111" + signature = "(Ljava/awt/Graphics;III)V", + garbageValue = "-1961186393" ) @Export("drawFull0") final void drawFull0(Graphics var1, int var2, int var3) { @@ -81,10 +81,10 @@ public final class RasterProvider extends AbstractRasterProvider { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(Ljava/awt/Graphics;IIIII)V", - garbageValue = "1517141753" + garbageValue = "-2057417095" ) @Export("draw0") final void draw0(Graphics var1, int var2, int var3, int var4, int var5) { diff --git a/runescape-client/src/main/java/Rasterizer2D.java b/runescape-client/src/main/java/Rasterizer2D.java index 1b4322d165..3aa66387be 100644 --- a/runescape-client/src/main/java/Rasterizer2D.java +++ b/runescape-client/src/main/java/Rasterizer2D.java @@ -3,28 +3,28 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lx") +@ObfuscatedName("lv") @Implements("Rasterizer2D") public class Rasterizer2D extends DualNode { - @ObfuscatedName("az") + @ObfuscatedName("aw") @Export("Rasterizer2D_pixels") public static int[] Rasterizer2D_pixels; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("Rasterizer2D_width") public static int Rasterizer2D_width; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @Export("Rasterizer2D_height") public static int Rasterizer2D_height; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @Export("Rasterizer2D_yClipStart") public static int Rasterizer2D_yClipStart; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @Export("Rasterizer2D_yClipEnd") public static int Rasterizer2D_yClipEnd; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("Rasterizer2D_xClipStart") public static int Rasterizer2D_xClipStart; - @ObfuscatedName("ax") + @ObfuscatedName("av") @Export("Rasterizer2D_xClipEnd") public static int Rasterizer2D_xClipEnd; @@ -38,7 +38,7 @@ public class Rasterizer2D extends DualNode { protected Rasterizer2D() { } - @ObfuscatedName("dt") + @ObfuscatedName("ch") @Export("Rasterizer2D_replace") public static void Rasterizer2D_replace(int[] var0, int var1, int var2) { Rasterizer2D_pixels = var0; @@ -47,7 +47,7 @@ public class Rasterizer2D extends DualNode { Rasterizer2D_setClip(0, 0, var1, var2); } - @ObfuscatedName("dv") + @ObfuscatedName("cg") @Export("Rasterizer2D_resetClip") public static void Rasterizer2D_resetClip() { Rasterizer2D_xClipStart = 0; @@ -56,7 +56,7 @@ public class Rasterizer2D extends DualNode { Rasterizer2D_yClipEnd = Rasterizer2D_height; } - @ObfuscatedName("dm") + @ObfuscatedName("cf") @Export("Rasterizer2D_setClip") public static void Rasterizer2D_setClip(int var0, int var1, int var2, int var3) { if (var0 < 0) { @@ -81,7 +81,7 @@ public class Rasterizer2D extends DualNode { Rasterizer2D_yClipEnd = var3; } - @ObfuscatedName("dn") + @ObfuscatedName("ca") @Export("Rasterizer2D_expandClip") public static void Rasterizer2D_expandClip(int var0, int var1, int var2, int var3) { if (Rasterizer2D_xClipStart < var0) { @@ -102,7 +102,7 @@ public class Rasterizer2D extends DualNode { } - @ObfuscatedName("dq") + @ObfuscatedName("db") @Export("Rasterizer2D_getClipArray") public static void Rasterizer2D_getClipArray(int[] var0) { var0[0] = Rasterizer2D_xClipStart; @@ -111,7 +111,7 @@ public class Rasterizer2D extends DualNode { var0[3] = Rasterizer2D_yClipEnd; } - @ObfuscatedName("dy") + @ObfuscatedName("dq") @Export("Rasterizer2D_setClipArray") public static void Rasterizer2D_setClipArray(int[] var0) { Rasterizer2D_xClipStart = var0[0]; @@ -120,7 +120,7 @@ public class Rasterizer2D extends DualNode { Rasterizer2D_yClipEnd = var0[3]; } - @ObfuscatedName("de") + @ObfuscatedName("dd") @Export("Rasterizer2D_clear") public static void Rasterizer2D_clear() { int var0 = 0; @@ -141,7 +141,7 @@ public class Rasterizer2D extends DualNode { } - @ObfuscatedName("df") + @ObfuscatedName("dl") @Export("drawCircle") static void drawCircle(int var0, int var1, int var2, int var3) { if (var2 == 0) { @@ -236,7 +236,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dr") + @ObfuscatedName("dm") @Export("Rasterizer2D_drawCircleAlpha") public static void Rasterizer2D_drawCircleAlpha(int var0, int var1, int var2, int var3, int var4) { if (var4 != 0) { @@ -349,7 +349,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("du") + @ObfuscatedName("di") @Export("Rasterizer2D_fillRectangleAlpha") public static void Rasterizer2D_fillRectangleAlpha(int var0, int var1, int var2, int var3, int var4, int var5) { if (var0 < Rasterizer2D_xClipStart) { @@ -387,7 +387,7 @@ public class Rasterizer2D extends DualNode { } - @ObfuscatedName("ds") + @ObfuscatedName("dn") @Export("Rasterizer2D_fillRectangle") public static void Rasterizer2D_fillRectangle(int var0, int var1, int var2, int var3, int var4) { if (var0 < Rasterizer2D_xClipStart) { @@ -421,7 +421,7 @@ public class Rasterizer2D extends DualNode { } - @ObfuscatedName("dc") + @ObfuscatedName("dr") @Export("Rasterizer2D_fillRectangleGradient") public static void Rasterizer2D_fillRectangleGradient(int var0, int var1, int var2, int var3, int var4, int var5) { if (var2 > 0 && var3 > 0) { @@ -465,7 +465,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("di") + @ObfuscatedName("do") @Export("Rasterizer2D_fillRectangleGradientAlpha") public static void Rasterizer2D_fillRectangleGradientAlpha(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { if (var2 > 0 && var3 > 0) { @@ -523,7 +523,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dk") + @ObfuscatedName("ds") @ObfuscatedSignature( signature = "(IIIIII[BIZ)V", garbageValue = "1" @@ -604,7 +604,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dx") + @ObfuscatedName("dz") @Export("Rasterizer2D_drawRectangle") public static void Rasterizer2D_drawRectangle(int var0, int var1, int var2, int var3, int var4) { Rasterizer2D_drawHorizontalLine(var0, var1, var2, var4); @@ -613,7 +613,7 @@ public class Rasterizer2D extends DualNode { Rasterizer2D_drawVerticalLine(var0 + var2 - 1, var1, var3, var4); } - @ObfuscatedName("dz") + @ObfuscatedName("dj") @Export("Rasterizer2D_drawRectangleAlpha") public static void Rasterizer2D_drawRectangleAlpha(int var0, int var1, int var2, int var3, int var4, int var5) { Rasterizer2D_drawHorizontalLineAlpha(var0, var1, var2, var4, var5); @@ -625,7 +625,7 @@ public class Rasterizer2D extends DualNode { } - @ObfuscatedName("do") + @ObfuscatedName("df") @Export("Rasterizer2D_drawHorizontalLine") public static void Rasterizer2D_drawHorizontalLine(int var0, int var1, int var2, int var3) { if (var1 >= Rasterizer2D_yClipStart && var1 < Rasterizer2D_yClipEnd) { @@ -647,7 +647,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dw") + @ObfuscatedName("da") @Export("Rasterizer2D_drawHorizontalLineAlpha") static void Rasterizer2D_drawHorizontalLineAlpha(int var0, int var1, int var2, int var3, int var4) { if (var1 >= Rasterizer2D_yClipStart && var1 < Rasterizer2D_yClipEnd) { @@ -677,7 +677,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dd") + @ObfuscatedName("dg") @Export("Rasterizer2D_drawVerticalLine") public static void Rasterizer2D_drawVerticalLine(int var0, int var1, int var2, int var3) { if (var0 >= Rasterizer2D_xClipStart && var0 < Rasterizer2D_xClipEnd) { @@ -699,7 +699,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dj") + @ObfuscatedName("dp") @Export("Rasterizer2D_drawVerticalLineAlpha") static void Rasterizer2D_drawVerticalLineAlpha(int var0, int var1, int var2, int var3, int var4) { if (var0 >= Rasterizer2D_xClipStart && var0 < Rasterizer2D_xClipEnd) { @@ -730,7 +730,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dg") + @ObfuscatedName("dy") @Export("Rasterizer2D_drawLine") public static void Rasterizer2D_drawLine(int var0, int var1, int var2, int var3, int var4) { var2 -= var0; @@ -812,7 +812,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("da") + @ObfuscatedName("du") @Export("Rasterizer2D_setPixel") static void Rasterizer2D_setPixel(int var0, int var1, int var2) { if (var0 >= Rasterizer2D_xClipStart && var1 >= Rasterizer2D_yClipStart && var0 < Rasterizer2D_xClipEnd && var1 < Rasterizer2D_yClipEnd) { @@ -820,7 +820,7 @@ public class Rasterizer2D extends DualNode { } } - @ObfuscatedName("dl") + @ObfuscatedName("dk") @Export("Rasterizer2D_fillMaskedRectangle") public static void Rasterizer2D_fillMaskedRectangle(int var0, int var1, int var2, int[] var3, int[] var4) { int var5 = var0 + Rasterizer2D_width * var1; diff --git a/runescape-client/src/main/java/Rasterizer3D.java b/runescape-client/src/main/java/Rasterizer3D.java index 39297a0dbb..2abcbac9c6 100644 --- a/runescape-client/src/main/java/Rasterizer3D.java +++ b/runescape-client/src/main/java/Rasterizer3D.java @@ -3,92 +3,92 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ek") +@ObfuscatedName("eu") @Implements("Rasterizer3D") public class Rasterizer3D extends Rasterizer2D { - @ObfuscatedName("z") - static boolean field1733; + @ObfuscatedName("a") + static boolean field1745; + @ObfuscatedName("t") + static boolean field1737; @ObfuscatedName("n") - static boolean field1730; - @ObfuscatedName("v") @Export("Rasterizer3D_isLowDetailTexture") static boolean Rasterizer3D_isLowDetailTexture; - @ObfuscatedName("u") - public static boolean field1754; - @ObfuscatedName("r") + @ObfuscatedName("q") + public static boolean field1739; + @ObfuscatedName("v") @Export("Rasterizer3D_alpha") static int Rasterizer3D_alpha; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("Rasterizer3D_zoom") public static int Rasterizer3D_zoom; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("Rasterizer3D_clipMidX") static int Rasterizer3D_clipMidX; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("Rasterizer3D_clipMidY") static int Rasterizer3D_clipMidY; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("Rasterizer3D_clipWidth") static int Rasterizer3D_clipWidth; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("Rasterizer3D_clipHeight") static int Rasterizer3D_clipHeight; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("Rasterizer3D_clipNegativeMidX") static int Rasterizer3D_clipNegativeMidX; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("Rasterizer3D_clipMidX2") static int Rasterizer3D_clipMidX2; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("Rasterizer3D_clipNegativeMidY") static int Rasterizer3D_clipNegativeMidY; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("Rasterizer3D_clipMidY2") static int Rasterizer3D_clipMidY2; - @ObfuscatedName("s") + @ObfuscatedName("z") @Export("Rasterizer3D_rowOffsets") static int[] Rasterizer3D_rowOffsets; @ObfuscatedName("f") @Export("Rasterizer3D_colorPalette") public static int[] Rasterizer3D_colorPalette; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedSignature( - signature = "Lei;" + signature = "Lew;" ) @Export("Rasterizer3D_textureLoader") public static TextureLoader Rasterizer3D_textureLoader; - @ObfuscatedName("d") - static int[] field1752; - @ObfuscatedName("l") - static int[] field1753; - @ObfuscatedName("k") + @ObfuscatedName("w") + static int[] field1759; + @ObfuscatedName("u") + static int[] field1760; + @ObfuscatedName("y") @Export("Rasterizer3D_sine") public static int[] Rasterizer3D_sine; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @Export("Rasterizer3D_cosine") public static int[] Rasterizer3D_cosine; static { - field1733 = false; - field1730 = false; + field1745 = false; + field1737 = false; Rasterizer3D_isLowDetailTexture = false; - field1754 = true; + field1739 = true; Rasterizer3D_alpha = 0; Rasterizer3D_zoom = 512; Rasterizer3D_rowOffsets = new int[1024]; Rasterizer3D_colorPalette = new int[65536]; - field1752 = new int[512]; - field1753 = new int[2048]; + field1759 = new int[512]; + field1760 = new int[2048]; Rasterizer3D_sine = new int[2048]; Rasterizer3D_cosine = new int[2048]; int var0; for (var0 = 1; var0 < 512; ++var0) { - field1752[var0] = 32768 / var0; + field1759[var0] = 32768 / var0; } for (var0 = 1; var0 < 2048; ++var0) { - field1753[var0] = 65536 / var0; + field1760[var0] = 65536 / var0; } for (var0 = 0; var0 < 2048; ++var0) { @@ -98,13 +98,13 @@ public class Rasterizer3D extends Rasterizer2D { } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("Rasterizer3D_setClipFromRasterizer2D") public static final void Rasterizer3D_setClipFromRasterizer2D() { Rasterizer3D_setClip(Rasterizer2D.Rasterizer2D_xClipStart, Rasterizer2D.Rasterizer2D_yClipStart, Rasterizer2D.Rasterizer2D_xClipEnd, Rasterizer2D.Rasterizer2D_yClipEnd); } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("Rasterizer3D_setClip") static final void Rasterizer3D_setClip(int var0, int var1, int var2, int var3) { Rasterizer3D_clipWidth = var2 - var0; @@ -133,7 +133,7 @@ public class Rasterizer3D extends Rasterizer2D { } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("Rasterizer3D_method3") public static final void Rasterizer3D_method3() { Rasterizer3D_clipMidX = Rasterizer3D_clipWidth / 2; @@ -144,8 +144,8 @@ public class Rasterizer3D extends Rasterizer2D { Rasterizer3D_clipMidY2 = Rasterizer3D_clipHeight - Rasterizer3D_clipMidY; } - @ObfuscatedName("u") - public static final void method2992(int var0, int var1) { + @ObfuscatedName("q") + public static final void method3131(int var0, int var1) { int var2 = Rasterizer3D_rowOffsets[0]; int var3 = var2 / Rasterizer2D.Rasterizer2D_width; int var4 = var2 - var3 * Rasterizer2D.Rasterizer2D_width; @@ -157,22 +157,22 @@ public class Rasterizer3D extends Rasterizer2D { Rasterizer3D_clipMidY2 = Rasterizer3D_clipHeight - Rasterizer3D_clipMidY; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lei;)V" + signature = "(Lew;)V" ) @Export("Rasterizer3D_setTextureLoader") public static final void Rasterizer3D_setTextureLoader(TextureLoader var0) { Rasterizer3D_textureLoader = var0; } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("Rasterizer3D_setBrightness") public static final void Rasterizer3D_setBrightness(double var0) { Rasterizer3D_buildPalette(var0, 0, 512); } - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("Rasterizer3D_buildPalette") static final void Rasterizer3D_buildPalette(double var0, int var2, int var3) { int var4 = var2 * 128; @@ -251,7 +251,7 @@ public class Rasterizer3D extends Rasterizer2D { } - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("Rasterizer3D_brighten") static int Rasterizer3D_brighten(int var0, double var1) { double var3 = (double)(var0 >> 16) / 256.0D; @@ -266,13 +266,13 @@ public class Rasterizer3D extends Rasterizer2D { return var11 + (var10 << 8) + (var9 << 16); } - @ObfuscatedName("y") - public static void method2972(int var0, int var1, int var2) { - field1733 = var0 < 0 || var0 > Rasterizer3D_clipWidth || var1 < 0 || var1 > Rasterizer3D_clipWidth || var2 < 0 || var2 > Rasterizer3D_clipWidth; + @ObfuscatedName("i") + public static void method3125(int var0, int var1, int var2) { + field1745 = var0 < 0 || var0 > Rasterizer3D_clipWidth || var1 < 0 || var1 > Rasterizer3D_clipWidth || var2 < 0 || var2 > Rasterizer3D_clipWidth; } - @ObfuscatedName("i") - static final void method2973(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { + @ObfuscatedName("d") + static final void method3132(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { int var9 = var4 - var3; int var10 = var1 - var0; int var11 = var5 - var3; @@ -330,35 +330,7 @@ public class Rasterizer3D extends Rasterizer2D { var1 = 0; } - if ((var0 == var1 || var17 >= var16) && (var0 != var1 || var17 <= var15)) { - var2 -= var1; - var1 -= var0; - var0 = Rasterizer3D_rowOffsets[var0]; - - while (true) { - --var1; - if (var1 < 0) { - while (true) { - --var2; - if (var2 < 0) { - return; - } - - Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, 0, 0, var4 >> 14, var5 >> 14, var6, var19); - var5 += var17; - var4 += var15; - var6 += var20; - var0 += Rasterizer2D.Rasterizer2D_width; - } - } - - Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, 0, 0, var3 >> 14, var5 >> 14, var6, var19); - var5 += var17; - var3 += var16; - var6 += var20; - var0 += Rasterizer2D.Rasterizer2D_width; - } - } else { + if (var0 != var1 && var17 < var16 || var0 == var1 && var17 > var15) { var2 -= var1; var1 -= var0; var0 = Rasterizer3D_rowOffsets[var0]; @@ -386,6 +358,34 @@ public class Rasterizer3D extends Rasterizer2D { var6 += var20; var0 += Rasterizer2D.Rasterizer2D_width; } + } else { + var2 -= var1; + var1 -= var0; + var0 = Rasterizer3D_rowOffsets[var0]; + + while (true) { + --var1; + if (var1 < 0) { + while (true) { + --var2; + if (var2 < 0) { + return; + } + + Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, 0, 0, var4 >> 14, var5 >> 14, var6, var19); + var5 += var17; + var4 += var15; + var6 += var20; + var0 += Rasterizer2D.Rasterizer2D_width; + } + } + + Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, 0, 0, var3 >> 14, var5 >> 14, var6, var19); + var5 += var17; + var3 += var16; + var6 += var20; + var0 += Rasterizer2D.Rasterizer2D_width; + } } } else { var4 = var3 <<= 14; @@ -487,35 +487,7 @@ public class Rasterizer3D extends Rasterizer2D { var2 = 0; } - if ((var2 == var1 || var16 >= var15) && (var2 != var1 || var16 <= var17)) { - var0 -= var2; - var2 -= var1; - var1 = Rasterizer3D_rowOffsets[var1]; - - while (true) { - --var2; - if (var2 < 0) { - while (true) { - --var0; - if (var0 < 0) { - return; - } - - Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, 0, 0, var5 >> 14, var3 >> 14, var7, var19); - var3 += var16; - var5 += var17; - var7 += var20; - var1 += Rasterizer2D.Rasterizer2D_width; - } - } - - Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, 0, 0, var4 >> 14, var3 >> 14, var7, var19); - var3 += var16; - var4 += var15; - var7 += var20; - var1 += Rasterizer2D.Rasterizer2D_width; - } - } else { + if (var2 != var1 && var16 < var15 || var2 == var1 && var16 > var17) { var0 -= var2; var2 -= var1; var1 = Rasterizer3D_rowOffsets[var1]; @@ -543,6 +515,34 @@ public class Rasterizer3D extends Rasterizer2D { var7 += var20; var1 += Rasterizer2D.Rasterizer2D_width; } + } else { + var0 -= var2; + var2 -= var1; + var1 = Rasterizer3D_rowOffsets[var1]; + + while (true) { + --var2; + if (var2 < 0) { + while (true) { + --var0; + if (var0 < 0) { + return; + } + + Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, 0, 0, var5 >> 14, var3 >> 14, var7, var19); + var3 += var16; + var5 += var17; + var7 += var20; + var1 += Rasterizer2D.Rasterizer2D_width; + } + } + + Rasterizer3D_vertAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, 0, 0, var4 >> 14, var3 >> 14, var7, var19); + var3 += var16; + var4 += var15; + var7 += var20; + var1 += Rasterizer2D.Rasterizer2D_width; + } } } else { var5 = var4 <<= 14; @@ -777,10 +777,10 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("Rasterizer3D_vertAlpha") static final void Rasterizer3D_vertAlpha(int[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { - if (field1733) { + if (field1745) { if (var5 > Rasterizer3D_clipWidth) { var5 = Rasterizer3D_clipWidth; } @@ -796,7 +796,7 @@ public class Rasterizer3D extends Rasterizer2D { int var8; int var9; int var10; - if (field1754) { + if (field1739) { var3 = var5 - var4 >> 2; var7 <<= 2; if (Rasterizer3D_alpha == 0) { @@ -880,8 +880,8 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("b") - public static final void method2975(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { + @ObfuscatedName("p") + public static final void method3134(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { int var7 = 0; if (var0 != var1) { var7 = (var4 - var3 << 14) / (var1 - var0); @@ -921,33 +921,7 @@ public class Rasterizer3D extends Rasterizer2D { var1 = 0; } - if (var0 != var1 && var9 < var7 || var0 == var1 && var9 > var8) { - var2 -= var1; - var1 -= var0; - var0 = Rasterizer3D_rowOffsets[var0]; - - while (true) { - --var1; - if (var1 < 0) { - while (true) { - --var2; - if (var2 < 0) { - return; - } - - Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, var6, 0, var5 >> 14, var4 >> 14); - var5 += var9; - var4 += var8; - var0 += Rasterizer2D.Rasterizer2D_width; - } - } - - Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, var6, 0, var5 >> 14, var3 >> 14); - var5 += var9; - var3 += var7; - var0 += Rasterizer2D.Rasterizer2D_width; - } - } else { + if ((var0 == var1 || var9 >= var7) && (var0 != var1 || var9 <= var8)) { var2 -= var1; var1 -= var0; var0 = Rasterizer3D_rowOffsets[var0]; @@ -973,6 +947,32 @@ public class Rasterizer3D extends Rasterizer2D { var3 += var7; var0 += Rasterizer2D.Rasterizer2D_width; } + } else { + var2 -= var1; + var1 -= var0; + var0 = Rasterizer3D_rowOffsets[var0]; + + while (true) { + --var1; + if (var1 < 0) { + while (true) { + --var2; + if (var2 < 0) { + return; + } + + Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, var6, 0, var5 >> 14, var4 >> 14); + var5 += var9; + var4 += var8; + var0 += Rasterizer2D.Rasterizer2D_width; + } + } + + Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var0, var6, 0, var5 >> 14, var3 >> 14); + var5 += var9; + var3 += var7; + var0 += Rasterizer2D.Rasterizer2D_width; + } } } else { var4 = var3 <<= 14; @@ -1067,33 +1067,7 @@ public class Rasterizer3D extends Rasterizer2D { var2 = 0; } - if (var2 != var1 && var7 < var8 || var2 == var1 && var7 > var9) { - var0 -= var2; - var2 -= var1; - var1 = Rasterizer3D_rowOffsets[var1]; - - while (true) { - --var2; - if (var2 < 0) { - while (true) { - --var0; - if (var0 < 0) { - return; - } - - Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, var6, 0, var3 >> 14, var5 >> 14); - var3 += var7; - var5 += var9; - var1 += Rasterizer2D.Rasterizer2D_width; - } - } - - Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, var6, 0, var3 >> 14, var4 >> 14); - var3 += var7; - var4 += var8; - var1 += Rasterizer2D.Rasterizer2D_width; - } - } else { + if ((var2 == var1 || var7 >= var8) && (var2 != var1 || var7 <= var9)) { var0 -= var2; var2 -= var1; var1 = Rasterizer3D_rowOffsets[var1]; @@ -1119,6 +1093,32 @@ public class Rasterizer3D extends Rasterizer2D { var4 += var8; var1 += Rasterizer2D.Rasterizer2D_width; } + } else { + var0 -= var2; + var2 -= var1; + var1 = Rasterizer3D_rowOffsets[var1]; + + while (true) { + --var2; + if (var2 < 0) { + while (true) { + --var0; + if (var0 < 0) { + return; + } + + Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, var6, 0, var3 >> 14, var5 >> 14); + var3 += var7; + var5 += var9; + var1 += Rasterizer2D.Rasterizer2D_width; + } + } + + Rasterizer3D_horizAlpha(Rasterizer2D.Rasterizer2D_pixels, var1, var6, 0, var3 >> 14, var4 >> 14); + var3 += var7; + var4 += var8; + var1 += Rasterizer2D.Rasterizer2D_width; + } } } else { var5 = var4 <<= 14; @@ -1336,10 +1336,10 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("Rasterizer3D_horizAlpha") static final void Rasterizer3D_horizAlpha(int[] var0, int var1, int var2, int var3, int var4, int var5) { - if (field1733) { + if (field1745) { if (var5 > Rasterizer3D_clipWidth) { var5 = Rasterizer3D_clipWidth; } @@ -1431,16 +1431,16 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("a") - static final void method2977(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16, int var17, int var18) { + @ObfuscatedName("k") + static final void method3187(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16, int var17, int var18) { int[] var19 = Rasterizer3D_textureLoader.getTexturePixels(var18); int var20; if (var19 == null) { var20 = Rasterizer3D_textureLoader.getAverageTextureRGB(var18); - method2973(var0, var1, var2, var3, var4, var5, method2981(var20, var6), method2981(var20, var7), method2981(var20, var8)); + method3132(var0, var1, var2, var3, var4, var5, method3140(var20, var6), method3140(var20, var7), method3140(var20, var8)); } else { Rasterizer3D_isLowDetailTexture = Rasterizer3D_textureLoader.isLowDetail(var18); - field1730 = Rasterizer3D_textureLoader.vmethod3236(var18); + field1737 = Rasterizer3D_textureLoader.vmethod3403(var18); var20 = var4 - var3; int var21 = var1 - var0; int var22 = var5 - var3; @@ -1512,41 +1512,7 @@ public class Rasterizer3D extends Rasterizer2D { var32 += var34 * var41; var35 += var37 * var41; var38 += var40 * var41; - if ((var0 == var1 || var28 >= var26) && (var0 != var1 || var28 <= var27)) { - var2 -= var1; - var1 -= var0; - var0 = Rasterizer3D_rowOffsets[var0]; - - while (true) { - --var1; - if (var1 < 0) { - while (true) { - --var2; - if (var2 < 0) { - return; - } - - Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var4 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); - var5 += var28; - var4 += var27; - var6 += var31; - var0 += Rasterizer2D.Rasterizer2D_width; - var32 += var34; - var35 += var37; - var38 += var40; - } - } - - Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var3 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); - var5 += var28; - var3 += var26; - var6 += var31; - var0 += Rasterizer2D.Rasterizer2D_width; - var32 += var34; - var35 += var37; - var38 += var40; - } - } else { + if (var0 != var1 && var28 < var26 || var0 == var1 && var28 > var27) { var2 -= var1; var1 -= var0; var0 = Rasterizer3D_rowOffsets[var0]; @@ -1580,6 +1546,40 @@ public class Rasterizer3D extends Rasterizer2D { var35 += var37; var38 += var40; } + } else { + var2 -= var1; + var1 -= var0; + var0 = Rasterizer3D_rowOffsets[var0]; + + while (true) { + --var1; + if (var1 < 0) { + while (true) { + --var2; + if (var2 < 0) { + return; + } + + Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var4 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var28; + var4 += var27; + var6 += var31; + var0 += Rasterizer2D.Rasterizer2D_width; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var3 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var28; + var3 += var26; + var6 += var31; + var0 += Rasterizer2D.Rasterizer2D_width; + var32 += var34; + var35 += var37; + var38 += var40; + } } } else { var4 = var3 <<= 14; @@ -1701,41 +1701,7 @@ public class Rasterizer3D extends Rasterizer2D { var32 += var34 * var41; var35 += var37 * var41; var38 += var40 * var41; - if ((var2 == var1 || var26 >= var27) && (var2 != var1 || var26 <= var28)) { - var0 -= var2; - var2 -= var1; - var1 = Rasterizer3D_rowOffsets[var1]; - - while (true) { - --var2; - if (var2 < 0) { - while (true) { - --var0; - if (var0 < 0) { - return; - } - - Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var1, var5 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); - var3 += var26; - var5 += var28; - var7 += var31; - var1 += Rasterizer2D.Rasterizer2D_width; - var32 += var34; - var35 += var37; - var38 += var40; - } - } - - Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var1, var4 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); - var3 += var26; - var4 += var27; - var7 += var31; - var1 += Rasterizer2D.Rasterizer2D_width; - var32 += var34; - var35 += var37; - var38 += var40; - } - } else { + if (var2 != var1 && var26 < var27 || var2 == var1 && var26 > var28) { var0 -= var2; var2 -= var1; var1 = Rasterizer3D_rowOffsets[var1]; @@ -1769,6 +1735,40 @@ public class Rasterizer3D extends Rasterizer2D { var35 += var37; var38 += var40; } + } else { + var0 -= var2; + var2 -= var1; + var1 = Rasterizer3D_rowOffsets[var1]; + + while (true) { + --var2; + if (var2 < 0) { + while (true) { + --var0; + if (var0 < 0) { + return; + } + + Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var1, var5 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var26; + var5 += var28; + var7 += var31; + var1 += Rasterizer2D.Rasterizer2D_width; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + Rasterizer3D_iDontKnow(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var1, var4 >> 14, var3 >> 14, var7, var30, var32, var35, var38, var33, var36, var39); + var3 += var26; + var4 += var27; + var7 += var31; + var1 += Rasterizer2D.Rasterizer2D_width; + var32 += var34; + var35 += var37; + var38 += var40; + } } } else { var5 = var4 <<= 14; @@ -2052,10 +2052,10 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("Rasterizer3D_iDontKnow") static final void Rasterizer3D_iDontKnow(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14) { - if (field1733) { + if (field1745) { if (var6 > Rasterizer3D_clipWidth) { var6 = Rasterizer3D_clipWidth; } @@ -2119,7 +2119,7 @@ public class Rasterizer3D extends Rasterizer2D { var17 >>= 3; var8 <<= 3; var15 = var7 >> 8; - if (field1730) { + if (field1737) { if (var17 > 0) { do { var3 = var1[(var2 >>> 26) + (var2 & 4032)]; @@ -2314,7 +2314,7 @@ public class Rasterizer3D extends Rasterizer2D { var17 >>= 3; var8 <<= 3; var15 = var7 >> 8; - if (field1730) { + if (field1737) { if (var17 > 0) { do { var3 = var1[(var2 & 16256) + (var2 >>> 25)]; @@ -2473,17 +2473,17 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("x") + @ObfuscatedName("j") @Export("drawTexturedTile") static final void drawTexturedTile(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16, int var17, int var18) { int[] var19 = Rasterizer3D_textureLoader.getTexturePixels(var18); int var20; if (var19 == null) { var20 = Rasterizer3D_textureLoader.getAverageTextureRGB(var18); - method2973(var0, var1, var2, var3, var4, var5, method2981(var20, var6), method2981(var20, var7), method2981(var20, var8)); + method3132(var0, var1, var2, var3, var4, var5, method3140(var20, var6), method3140(var20, var7), method3140(var20, var8)); } else { Rasterizer3D_isLowDetailTexture = Rasterizer3D_textureLoader.isLowDetail(var18); - field1730 = Rasterizer3D_textureLoader.vmethod3236(var18); + field1737 = Rasterizer3D_textureLoader.vmethod3403(var18); var20 = var4 - var3; int var21 = var1 - var0; int var22 = var5 - var3; @@ -2643,41 +2643,7 @@ public class Rasterizer3D extends Rasterizer2D { var32 += var34 * var41; var35 += var37 * var41; var38 += var40 * var41; - if ((var0 == var2 || var28 >= var26) && (var0 != var2 || var27 <= var26)) { - var1 -= var2; - var2 -= var0; - var0 = Rasterizer3D_rowOffsets[var0]; - - while (true) { - --var2; - if (var2 < 0) { - while (true) { - --var1; - if (var1 < 0) { - return; - } - - Rasterizer3D_textureAlpha(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var3 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); - var5 += var27; - var3 += var26; - var6 += var31; - var0 += Rasterizer2D.Rasterizer2D_width; - var32 += var34; - var35 += var37; - var38 += var40; - } - } - - Rasterizer3D_textureAlpha(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var3 >> 14, var4 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); - var4 += var28; - var3 += var26; - var6 += var31; - var0 += Rasterizer2D.Rasterizer2D_width; - var32 += var34; - var35 += var37; - var38 += var40; - } - } else { + if (var0 != var2 && var28 < var26 || var0 == var2 && var27 > var26) { var1 -= var2; var2 -= var0; var0 = Rasterizer3D_rowOffsets[var0]; @@ -2711,6 +2677,40 @@ public class Rasterizer3D extends Rasterizer2D { var35 += var37; var38 += var40; } + } else { + var1 -= var2; + var2 -= var0; + var0 = Rasterizer3D_rowOffsets[var0]; + + while (true) { + --var2; + if (var2 < 0) { + while (true) { + --var1; + if (var1 < 0) { + return; + } + + Rasterizer3D_textureAlpha(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var3 >> 14, var5 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var5 += var27; + var3 += var26; + var6 += var31; + var0 += Rasterizer2D.Rasterizer2D_width; + var32 += var34; + var35 += var37; + var38 += var40; + } + } + + Rasterizer3D_textureAlpha(Rasterizer2D.Rasterizer2D_pixels, var19, 0, 0, var0, var3 >> 14, var4 >> 14, var6, var30, var32, var35, var38, var33, var36, var39); + var4 += var28; + var3 += var26; + var6 += var31; + var0 += Rasterizer2D.Rasterizer2D_width; + var32 += var34; + var35 += var37; + var38 += var40; + } } } } @@ -3095,10 +3095,10 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("h") + @ObfuscatedName("r") @Export("Rasterizer3D_textureAlpha") static final void Rasterizer3D_textureAlpha(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14) { - if (field1733) { + if (field1745) { if (var6 > Rasterizer3D_clipWidth) { var6 = Rasterizer3D_clipWidth; } @@ -3151,7 +3151,7 @@ public class Rasterizer3D extends Rasterizer2D { var17 >>= 3; var8 <<= 3; var15 = var7 >> 8; - if (field1730) { + if (field1737) { if (var17 > 0) { do { var3 = var1[(var2 >>> 26) + (var2 & 4032)]; @@ -3294,7 +3294,7 @@ public class Rasterizer3D extends Rasterizer2D { var17 >>= 3; var8 <<= 3; var15 = var7 >> 8; - if (field1730) { + if (field1737) { if (var17 > 0) { do { var3 = var1[(var2 & 16256) + (var2 >>> 25)]; @@ -3411,8 +3411,8 @@ public class Rasterizer3D extends Rasterizer2D { } } - @ObfuscatedName("s") - static final int method2981(int var0, int var1) { + @ObfuscatedName("e") + static final int method3140(int var0, int var1) { var1 = (var0 & 127) * var1 >> 7; if (var1 < 2) { var1 = 2; @@ -3423,33 +3423,33 @@ public class Rasterizer3D extends Rasterizer2D { return (var0 & 65408) + var1; } - @ObfuscatedName("f") - static final int method2982(int var0, int var1, int var2, int var3) { + @ObfuscatedName("s") + static final int method3141(int var0, int var1, int var2, int var3) { return var0 * var2 + var3 * var1 >> 16; } - @ObfuscatedName("j") - static final int method2983(int var0, int var1, int var2, int var3) { + @ObfuscatedName("b") + static final int method3142(int var0, int var1, int var2, int var3) { return var2 * var1 - var3 * var0 >> 16; } - @ObfuscatedName("d") - static final int method2984(int var0, int var1, int var2, int var3) { + @ObfuscatedName("w") + static final int method3148(int var0, int var1, int var2, int var3) { return var0 * var2 - var3 * var1 >> 16; } - @ObfuscatedName("l") - static final int method2985(int var0, int var1, int var2, int var3) { + @ObfuscatedName("u") + static final int method3144(int var0, int var1, int var2, int var3) { return var3 * var0 + var2 * var1 >> 16; } - @ObfuscatedName("k") - static final int method2986(int var0, int var1, int var2, int var3) { + @ObfuscatedName("ad") + static final int method3145(int var0, int var1, int var2, int var3) { return var0 * var2 + var3 * var1 >> 16; } - @ObfuscatedName("ac") - static final int method2978(int var0, int var1, int var2, int var3) { + @ObfuscatedName("ag") + static final int method3122(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 f39349c0d2..6f4efa54b3 100644 --- a/runescape-client/src/main/java/RawPcmStream.java +++ b/runescape-client/src/main/java/RawPcmStream.java @@ -3,107 +3,107 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("du") +@ObfuscatedName("ds") @Implements("RawPcmStream") public class RawPcmStream extends PcmStream { - @ObfuscatedName("z") - int field1445; + @ObfuscatedName("a") + int field1448; + @ObfuscatedName("t") + int field1441; @ObfuscatedName("n") - int field1435; - @ObfuscatedName("v") - int field1436; - @ObfuscatedName("u") - int field1443; - @ObfuscatedName("r") - int field1447; - @ObfuscatedName("p") - int field1439; - @ObfuscatedName("q") int field1440; - @ObfuscatedName("m") + @ObfuscatedName("q") + int field1442; + @ObfuscatedName("v") + int field1444; + @ObfuscatedName("l") + int field1445; + @ObfuscatedName("c") + int field1446; + @ObfuscatedName("o") @Export("numLoops") int numLoops; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("start") int start; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("end") int end; - @ObfuscatedName("c") - boolean field1444; - @ObfuscatedName("b") - int field1442; - @ObfuscatedName("o") - int field1434; - @ObfuscatedName("a") - int field1437; - @ObfuscatedName("e") - int field1448; + @ObfuscatedName("m") + boolean field1450; + @ObfuscatedName("p") + int field1451; + @ObfuscatedName("h") + int field1452; + @ObfuscatedName("k") + int field1454; + @ObfuscatedName("x") + int field1453; @ObfuscatedSignature( - signature = "(Lch;III)V" + signature = "(Lca;III)V" ) RawPcmStream(RawSound var1, int var2, int var3, int var4) { super.sound = var1; this.start = var1.start; this.end = var1.end; - this.field1444 = var1.field1369; - this.field1435 = var2; - this.field1436 = var3; - this.field1443 = var4; - this.field1445 = 0; - this.method2580(); + this.field1450 = var1.field1363; + this.field1441 = var2; + this.field1440 = var3; + this.field1442 = var4; + this.field1448 = 0; + this.method2700(); } @ObfuscatedSignature( - signature = "(Lch;II)V" + signature = "(Lca;II)V" ) RawPcmStream(RawSound var1, int var2, int var3) { super.sound = var1; this.start = var1.start; this.end = var1.end; - this.field1444 = var1.field1369; - this.field1435 = var2; - this.field1436 = var3; - this.field1443 = 8192; - this.field1445 = 0; - this.method2580(); + this.field1450 = var1.field1363; + this.field1441 = var2; + this.field1440 = var3; + this.field1442 = 8192; + this.field1448 = 0; + this.method2700(); } - @ObfuscatedName("r") - void method2580() { - this.field1447 = this.field1436; - this.field1439 = method2606(this.field1436, this.field1443); - this.field1440 = method2512(this.field1436, this.field1443); + @ObfuscatedName("v") + void method2700() { + this.field1444 = this.field1440; + this.field1445 = method2745(this.field1440, this.field1442); + this.field1446 = method2802(this.field1440, this.field1442); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("firstSubStream") protected PcmStream firstSubStream() { return null; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "()Ldc;" + signature = "()Ldj;" ) @Export("nextSubStream") protected PcmStream nextSubStream() { return null; } - @ObfuscatedName("m") - protected int vmethod3882() { - return this.field1436 == 0 && this.field1442 == 0 ? 0 : 1; + @ObfuscatedName("o") + protected int vmethod4063() { + return this.field1440 == 0 && this.field1451 == 0 ? 0 : 1; } - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("fill") public synchronized void fill(int[] var1, int var2, int var3) { - if (this.field1436 == 0 && this.field1442 == 0) { + if (this.field1440 == 0 && this.field1451 == 0) { this.skip(var3); } else { RawSound var4 = (RawSound)super.sound; @@ -117,163 +117,163 @@ public class RawPcmStream extends PcmStream { int var9 = var2; var3 += var2; - if (this.field1445 < 0) { - if (this.field1435 <= 0) { - this.method2641(); + if (this.field1448 < 0) { + if (this.field1441 <= 0) { + this.method2695(); this.remove(); return; } - this.field1445 = 0; + this.field1448 = 0; } - if (this.field1445 >= var7) { - if (this.field1435 >= 0) { - this.method2641(); + if (this.field1448 >= var7) { + if (this.field1441 >= 0) { + this.method2695(); this.remove(); return; } - this.field1445 = var7 - 1; + this.field1448 = var7 - 1; } if (this.numLoops < 0) { - if (this.field1444) { - if (this.field1435 < 0) { - var9 = this.method2571(var1, var2, var5, var3, var4.samples[this.start]); - if (this.field1445 >= var5) { + if (this.field1450) { + if (this.field1441 < 0) { + var9 = this.method2807(var1, var2, var5, var3, var4.samples[this.start]); + if (this.field1448 >= var5) { return; } - this.field1445 = var5 + var5 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var5 + var5 - 1 - this.field1448; + this.field1441 = -this.field1441; } while (true) { - var9 = this.method2539(var1, var9, var6, var3, var4.samples[this.end - 1]); - if (this.field1445 < var6) { + var9 = this.method2851(var1, var9, var6, var3, var4.samples[this.end - 1]); + if (this.field1448 < var6) { return; } - this.field1445 = var6 + var6 - 1 - this.field1445; - this.field1435 = -this.field1435; - var9 = this.method2571(var1, var9, var5, var3, var4.samples[this.start]); - if (this.field1445 >= var5) { + this.field1448 = var6 + var6 - 1 - this.field1448; + this.field1441 = -this.field1441; + var9 = this.method2807(var1, var9, var5, var3, var4.samples[this.start]); + if (this.field1448 >= var5) { return; } - this.field1445 = var5 + var5 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var5 + var5 - 1 - this.field1448; + this.field1441 = -this.field1441; } - } else if (this.field1435 < 0) { + } else if (this.field1441 < 0) { while (true) { - var9 = this.method2571(var1, var9, var5, var3, var4.samples[this.end - 1]); - if (this.field1445 >= var5) { + var9 = this.method2807(var1, var9, var5, var3, var4.samples[this.end - 1]); + if (this.field1448 >= var5) { return; } - this.field1445 = var6 - 1 - (var6 - 1 - this.field1445) % var8; + this.field1448 = var6 - 1 - (var6 - 1 - this.field1448) % var8; } } else { while (true) { - var9 = this.method2539(var1, var9, var6, var3, var4.samples[this.start]); - if (this.field1445 < var6) { + var9 = this.method2851(var1, var9, var6, var3, var4.samples[this.start]); + if (this.field1448 < var6) { return; } - this.field1445 = var5 + (this.field1445 - var5) % var8; + this.field1448 = var5 + (this.field1448 - var5) % var8; } } } else { if (this.numLoops > 0) { - if (this.field1444) { - label129: { - if (this.field1435 < 0) { - var9 = this.method2571(var1, var2, var5, var3, var4.samples[this.start]); - if (this.field1445 >= var5) { + if (this.field1450) { + label141: { + if (this.field1441 < 0) { + var9 = this.method2807(var1, var2, var5, var3, var4.samples[this.start]); + if (this.field1448 >= var5) { return; } - this.field1445 = var5 + var5 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var5 + var5 - 1 - this.field1448; + this.field1441 = -this.field1441; if (--this.numLoops == 0) { - break label129; + break label141; } } do { - var9 = this.method2539(var1, var9, var6, var3, var4.samples[this.end - 1]); - if (this.field1445 < var6) { + var9 = this.method2851(var1, var9, var6, var3, var4.samples[this.end - 1]); + if (this.field1448 < var6) { return; } - this.field1445 = var6 + var6 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var6 + var6 - 1 - this.field1448; + this.field1441 = -this.field1441; if (--this.numLoops == 0) { break; } - var9 = this.method2571(var1, var9, var5, var3, var4.samples[this.start]); - if (this.field1445 >= var5) { + var9 = this.method2807(var1, var9, var5, var3, var4.samples[this.start]); + if (this.field1448 >= var5) { return; } - this.field1445 = var5 + var5 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var5 + var5 - 1 - this.field1448; + this.field1441 = -this.field1441; } while(--this.numLoops != 0); } } else { int var10; - if (this.field1435 < 0) { + if (this.field1441 < 0) { while (true) { - var9 = this.method2571(var1, var9, var5, var3, var4.samples[this.end - 1]); - if (this.field1445 >= var5) { + var9 = this.method2807(var1, var9, var5, var3, var4.samples[this.end - 1]); + if (this.field1448 >= var5) { return; } - var10 = (var6 - 1 - this.field1445) / var8; + var10 = (var6 - 1 - this.field1448) / var8; if (var10 >= this.numLoops) { - this.field1445 += var8 * this.numLoops; + this.field1448 += var8 * this.numLoops; this.numLoops = 0; break; } - this.field1445 += var8 * var10; + this.field1448 += var8 * var10; this.numLoops -= var10; } } else { while (true) { - var9 = this.method2539(var1, var9, var6, var3, var4.samples[this.start]); - if (this.field1445 < var6) { + var9 = this.method2851(var1, var9, var6, var3, var4.samples[this.start]); + if (this.field1448 < var6) { return; } - var10 = (this.field1445 - var5) / var8; + var10 = (this.field1448 - var5) / var8; if (var10 >= this.numLoops) { - this.field1445 -= var8 * this.numLoops; + this.field1448 -= var8 * this.numLoops; this.numLoops = 0; break; } - this.field1445 -= var8 * var10; + this.field1448 -= var8 * var10; this.numLoops -= var10; } } } } - if (this.field1435 < 0) { - this.method2571(var1, var9, 0, var3, 0); - if (this.field1445 < 0) { - this.field1445 = -1; - this.method2641(); + if (this.field1441 < 0) { + this.method2807(var1, var9, 0, var3, 0); + if (this.field1448 < 0) { + this.field1448 = -1; + this.method2695(); this.remove(); } } else { - this.method2539(var1, var9, var7, var3, 0); - if (this.field1445 >= var7) { - this.field1445 = var7; - this.method2641(); + this.method2851(var1, var9, var7, var3, 0); + if (this.field1448 >= var7) { + this.field1448 = var7; + this.method2695(); this.remove(); } } @@ -282,33 +282,33 @@ public class RawPcmStream extends PcmStream { } } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("setNumLoops") public synchronized void setNumLoops(int var1) { this.numLoops = var1; } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("skip") public synchronized void skip(int var1) { - if (this.field1442 > 0) { - if (var1 >= this.field1442) { - if (this.field1436 == Integer.MIN_VALUE) { - this.field1436 = 0; + if (this.field1451 > 0) { + if (var1 >= this.field1451) { + if (this.field1440 == Integer.MIN_VALUE) { this.field1440 = 0; - this.field1439 = 0; - this.field1447 = 0; + this.field1446 = 0; + this.field1445 = 0; + this.field1444 = 0; this.remove(); - var1 = this.field1442; + var1 = this.field1451; } - this.field1442 = 0; - this.method2580(); + this.field1451 = 0; + this.method2700(); } else { - this.field1447 += this.field1434 * var1; - this.field1439 += this.field1437 * var1; - this.field1440 += this.field1448 * var1; - this.field1442 -= var1; + this.field1444 += this.field1452 * var1; + this.field1445 += this.field1454 * var1; + this.field1446 += this.field1453 * var1; + this.field1451 -= var1; } } @@ -321,179 +321,183 @@ public class RawPcmStream extends PcmStream { this.numLoops = 0; } - if (this.field1445 < 0) { - if (this.field1435 <= 0) { - this.method2641(); + if (this.field1448 < 0) { + if (this.field1441 <= 0) { + this.method2695(); this.remove(); return; } - this.field1445 = 0; + this.field1448 = 0; } - if (this.field1445 >= var5) { - if (this.field1435 >= 0) { - this.method2641(); + if (this.field1448 >= var5) { + if (this.field1441 >= 0) { + this.method2695(); this.remove(); return; } - this.field1445 = var5 - 1; + this.field1448 = var5 - 1; } - this.field1445 += this.field1435 * var1; + this.field1448 += this.field1441 * var1; if (this.numLoops < 0) { - if (!this.field1444) { - if (this.field1435 < 0) { - if (this.field1445 >= var3) { + if (!this.field1450) { + if (this.field1441 < 0) { + if (this.field1448 >= var3) { return; } - this.field1445 = var4 - 1 - (var4 - 1 - this.field1445) % var6; + this.field1448 = var4 - 1 - (var4 - 1 - this.field1448) % var6; } else { - if (this.field1445 < var4) { + if (this.field1448 < var4) { return; } - this.field1445 = var3 + (this.field1445 - var3) % var6; + this.field1448 = var3 + (this.field1448 - var3) % var6; } } else { - if (this.field1435 < 0) { - if (this.field1445 >= var3) { + if (this.field1441 < 0) { + if (this.field1448 >= var3) { return; } - this.field1445 = var3 + var3 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var3 + var3 - 1 - this.field1448; + this.field1441 = -this.field1441; } - while (this.field1445 >= var4) { - this.field1445 = var4 + var4 - 1 - this.field1445; - this.field1435 = -this.field1435; - if (this.field1445 >= var3) { + while (this.field1448 >= var4) { + this.field1448 = var4 + var4 - 1 - this.field1448; + this.field1441 = -this.field1441; + if (this.field1448 >= var3) { return; } - this.field1445 = var3 + var3 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var3 + var3 - 1 - this.field1448; + this.field1441 = -this.field1441; } } } else { if (this.numLoops > 0) { - if (this.field1444) { - label126: { - if (this.field1435 < 0) { - if (this.field1445 >= var3) { + if (this.field1450) { + label136: { + if (this.field1441 < 0) { + if (this.field1448 >= var3) { return; } - this.field1445 = var3 + var3 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var3 + var3 - 1 - this.field1448; + this.field1441 = -this.field1441; if (--this.numLoops == 0) { - break label126; + break label136; } } do { - if (this.field1445 < var4) { + if (this.field1448 < var4) { return; } - this.field1445 = var4 + var4 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var4 + var4 - 1 - this.field1448; + this.field1441 = -this.field1441; if (--this.numLoops == 0) { break; } - if (this.field1445 >= var3) { + if (this.field1448 >= var3) { return; } - this.field1445 = var3 + var3 - 1 - this.field1445; - this.field1435 = -this.field1435; + this.field1448 = var3 + var3 - 1 - this.field1448; + this.field1441 = -this.field1441; } while(--this.numLoops != 0); } } else { - int var7; - if (this.field1435 < 0) { - if (this.field1445 >= var3) { - return; - } + label168: { + int var7; + if (this.field1441 < 0) { + if (this.field1448 >= var3) { + return; + } - var7 = (var4 - 1 - this.field1445) / var6; - if (var7 < this.numLoops) { - this.field1445 += var6 * var7; + var7 = (var4 - 1 - this.field1448) / var6; + if (var7 >= this.numLoops) { + this.field1448 += var6 * this.numLoops; + this.numLoops = 0; + break label168; + } + + this.field1448 += var6 * var7; this.numLoops -= var7; - return; - } + } else { + if (this.field1448 < var4) { + return; + } - this.field1445 += var6 * this.numLoops; - this.numLoops = 0; - } else { - if (this.field1445 < var4) { - return; - } + var7 = (this.field1448 - var3) / var6; + if (var7 >= this.numLoops) { + this.field1448 -= var6 * this.numLoops; + this.numLoops = 0; + break label168; + } - var7 = (this.field1445 - var3) / var6; - if (var7 < this.numLoops) { - this.field1445 -= var6 * var7; + this.field1448 -= var6 * var7; this.numLoops -= var7; - return; } - this.field1445 -= var6 * this.numLoops; - this.numLoops = 0; + return; } } } - if (this.field1435 < 0) { - if (this.field1445 < 0) { - this.field1445 = -1; - this.method2641(); + if (this.field1441 < 0) { + if (this.field1448 < 0) { + this.field1448 = -1; + this.method2695(); this.remove(); } - } else if (this.field1445 >= var5) { - this.field1445 = var5; - this.method2641(); + } else if (this.field1448 >= var5) { + this.field1448 = var5; + this.method2695(); this.remove(); } } } - @ObfuscatedName("b") - public synchronized void method2519(int var1) { - this.method2521(var1 << 6, this.method2523()); - } - - @ObfuscatedName("o") - synchronized void method2520(int var1) { - this.method2521(var1, this.method2523()); - } - - @ObfuscatedName("a") - synchronized void method2521(int var1, int var2) { - this.field1436 = var1; - this.field1443 = var2; - this.field1442 = 0; - this.method2580(); - } - - @ObfuscatedName("e") - public synchronized int method2522() { - return this.field1436 == Integer.MIN_VALUE ? 0 : this.field1436; - } - - @ObfuscatedName("x") - public synchronized int method2523() { - return this.field1443 < 0 ? -1 : this.field1443; + @ObfuscatedName("p") + public synchronized void method2702(int var1) { + this.method2704(var1 << 6, this.method2844()); } @ObfuscatedName("h") - public synchronized void method2581(int var1) { + synchronized void method2841(int var1) { + this.method2704(var1, this.method2844()); + } + + @ObfuscatedName("k") + synchronized void method2704(int var1, int var2) { + this.field1440 = var1; + this.field1442 = var2; + this.field1451 = 0; + this.method2700(); + } + + @ObfuscatedName("x") + public synchronized int method2705() { + return this.field1440 == Integer.MIN_VALUE ? 0 : this.field1440; + } + + @ObfuscatedName("j") + public synchronized int method2844() { + return this.field1442 < 0 ? -1 : this.field1442; + } + + @ObfuscatedName("r") + public synchronized void method2707(int var1) { int var2 = ((RawSound)super.sound).samples.length << 8; if (var1 < -1) { var1 = -1; @@ -503,267 +507,254 @@ public class RawPcmStream extends PcmStream { var1 = var2; } - this.field1445 = var1; + this.field1448 = var1; } - @ObfuscatedName("s") + @ObfuscatedName("e") @ObfuscatedSignature( signature = "(Z)V", garbageValue = "1" ) - public synchronized void method2525() { - this.field1435 = (this.field1435 ^ this.field1435 >> 31) + (this.field1435 >>> 31); - this.field1435 = -this.field1435; + public synchronized void method2708() { + this.field1441 = (this.field1441 ^ this.field1441 >> 31) + (this.field1441 >>> 31); + this.field1441 = -this.field1441; } - @ObfuscatedName("f") - void method2641() { - if (this.field1442 != 0) { - if (this.field1436 == Integer.MIN_VALUE) { - this.field1436 = 0; + @ObfuscatedName("s") + void method2695() { + if (this.field1451 != 0) { + if (this.field1440 == Integer.MIN_VALUE) { + this.field1440 = 0; } - this.field1442 = 0; - this.method2580(); + this.field1451 = 0; + this.method2700(); } } - @ObfuscatedName("j") - public synchronized void method2527(int var1, int var2) { - this.method2528(var1, var2, this.method2523()); + @ObfuscatedName("b") + public synchronized void method2706(int var1, int var2) { + this.method2711(var1, var2, this.method2844()); } - @ObfuscatedName("d") - public synchronized void method2528(int var1, int var2, int var3) { + @ObfuscatedName("w") + public synchronized void method2711(int var1, int var2, int var3) { if (var1 == 0) { - this.method2521(var2, var3); + this.method2704(var2, var3); } else { - int var4 = method2606(var2, var3); - int var5 = method2512(var2, var3); - if (var4 == this.field1439 && var5 == this.field1440) { - this.field1442 = 0; + int var4 = method2745(var2, var3); + int var5 = method2802(var2, var3); + if (var4 == this.field1445 && var5 == this.field1446) { + this.field1451 = 0; } else { - int var6 = var2 - this.field1447; - if (this.field1447 - var2 > var6) { - var6 = this.field1447 - var2; + int var6 = var2 - this.field1444; + if (this.field1444 - var2 > var6) { + var6 = this.field1444 - var2; } - if (var4 - this.field1439 > var6) { - var6 = var4 - this.field1439; + if (var4 - this.field1445 > var6) { + var6 = var4 - this.field1445; } - if (this.field1439 - var4 > var6) { - var6 = this.field1439 - var4; + if (this.field1445 - var4 > var6) { + var6 = this.field1445 - var4; } - if (var5 - this.field1440 > var6) { - var6 = var5 - this.field1440; + if (var5 - this.field1446 > var6) { + var6 = var5 - this.field1446; } - if (this.field1440 - var5 > var6) { - var6 = this.field1440 - var5; + if (this.field1446 - var5 > var6) { + var6 = this.field1446 - var5; } if (var1 > var6) { var1 = var6; } - this.field1442 = var1; - this.field1436 = var2; - this.field1443 = var3; - this.field1434 = (var2 - this.field1447) / var1; - this.field1437 = (var4 - this.field1439) / var1; - this.field1448 = (var5 - this.field1440) / var1; + this.field1451 = var1; + this.field1440 = var2; + this.field1442 = var3; + this.field1452 = (var2 - this.field1444) / var1; + this.field1454 = (var4 - this.field1445) / var1; + this.field1453 = (var5 - this.field1446) / var1; } } } - @ObfuscatedName("l") - public synchronized void method2529(int var1) { + @ObfuscatedName("u") + public synchronized void method2722(int var1) { if (var1 == 0) { - this.method2520(0); + this.method2841(0); this.remove(); - } else if (this.field1439 == 0 && this.field1440 == 0) { - this.field1442 = 0; - this.field1436 = 0; - this.field1447 = 0; + } else if (this.field1445 == 0 && this.field1446 == 0) { + this.field1451 = 0; + this.field1440 = 0; + this.field1444 = 0; this.remove(); } else { - int var2 = -this.field1447; - if (this.field1447 > var2) { - var2 = this.field1447; + int var2 = -this.field1444; + if (this.field1444 > var2) { + var2 = this.field1444; } - if (-this.field1439 > var2) { - var2 = -this.field1439; + if (-this.field1445 > var2) { + var2 = -this.field1445; } - if (this.field1439 > var2) { - var2 = this.field1439; + if (this.field1445 > var2) { + var2 = this.field1445; } - if (-this.field1440 > var2) { - var2 = -this.field1440; + if (-this.field1446 > var2) { + var2 = -this.field1446; } - if (this.field1440 > var2) { - var2 = this.field1440; + if (this.field1446 > var2) { + var2 = this.field1446; } if (var1 > var2) { var1 = var2; } - this.field1442 = var1; - this.field1436 = Integer.MIN_VALUE; - this.field1434 = -this.field1447 / var1; - this.field1437 = -this.field1439 / var1; - this.field1448 = -this.field1440 / var1; + this.field1451 = var1; + this.field1440 = Integer.MIN_VALUE; + this.field1452 = -this.field1444 / var1; + this.field1454 = -this.field1445 / var1; + this.field1453 = -this.field1446 / var1; } } - @ObfuscatedName("k") - public synchronized void method2530(int var1) { - if (this.field1435 < 0) { - this.field1435 = -var1; + @ObfuscatedName("ad") + public synchronized void method2743(int var1) { + if (this.field1441 < 0) { + this.field1441 = -var1; } else { - this.field1435 = var1; + this.field1441 = var1; } } - @ObfuscatedName("ai") - public synchronized int method2531() { - return this.field1435 < 0 ? -this.field1435 : this.field1435; - } - - @ObfuscatedName("ak") - public boolean method2532() { - return this.field1445 < 0 || this.field1445 >= ((RawSound)super.sound).samples.length << 8; - } - - @ObfuscatedName("ae") - public boolean method2533() { - return this.field1442 != 0; - } - - @ObfuscatedName("av") - int method2539(int[] var1, int var2, int var3, int var4, int var5) { - while (true) { - if (this.field1442 > 0) { - int var6 = var2 + this.field1442; - if (var6 > var4) { - var6 = var4; - } - - this.field1442 += var2; - if (this.field1435 == 256 && (this.field1445 & 255) == 0) { - if (PcmPlayer.PcmPlayer_stereo) { - var2 = method2551(0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, this.field1437, this.field1448, 0, var6, var3, this); - } else { - var2 = method2550(((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, this.field1434, 0, var6, var3, this); - } - } else if (PcmPlayer.PcmPlayer_stereo) { - var2 = method2584(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, this.field1437, this.field1448, 0, var6, var3, this, this.field1435, var5); - } else { - var2 = method2621(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, this.field1434, 0, var6, var3, this, this.field1435, var5); - } - - this.field1442 -= var2; - if (this.field1442 != 0) { - return var2; - } - - if (!this.method2541()) { - continue; - } - - return var4; - } - - if (this.field1435 == 256 && (this.field1445 & 255) == 0) { - if (PcmPlayer.PcmPlayer_stereo) { - return method2543(0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, 0, var4, var3, this); - } - - return method2542(((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, 0, var4, var3, this); - } - - if (PcmPlayer.PcmPlayer_stereo) { - return method2547(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, 0, var4, var3, this, this.field1435, var5); - } - - return method2546(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, 0, var4, var3, this, this.field1435, var5); - } - } - @ObfuscatedName("ah") - int vmethod2691() { - int var1 = this.field1447 * 3 >> 6; - var1 = (var1 ^ var1 >> 31) + (var1 >>> 31); - if (this.numLoops == 0) { - var1 -= var1 * this.field1445 / (((RawSound)super.sound).samples.length << 8); - } else if (this.numLoops >= 0) { - var1 -= var1 * this.start / ((RawSound)super.sound).samples.length; - } - - return var1 > 255 ? 255 : var1; + public synchronized int method2714() { + return this.field1441 < 0 ? -this.field1441 : this.field1441; } - @ObfuscatedName("ag") - int method2571(int[] var1, int var2, int var3, int var4, int var5) { + @ObfuscatedName("an") + public boolean method2789() { + return this.field1448 < 0 || this.field1448 >= ((RawSound)super.sound).samples.length << 8; + } + + @ObfuscatedName("af") + public boolean method2716() { + return this.field1451 != 0; + } + + @ObfuscatedName("ai") + int method2851(int[] var1, int var2, int var3, int var4, int var5) { while (true) { - if (this.field1442 > 0) { - int var6 = var2 + this.field1442; + if (this.field1451 > 0) { + int var6 = var2 + this.field1451; if (var6 > var4) { var6 = var4; } - this.field1442 += var2; - if (this.field1435 == -256 && (this.field1445 & 255) == 0) { - if (PcmPlayer.PcmPlayer_stereo) { - var2 = method2511(0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, this.field1437, this.field1448, 0, var6, var3, this); + this.field1451 += var2; + if (this.field1441 == 256 && (this.field1448 & 255) == 0) { + if (InterfaceParent.PcmPlayer_stereo) { + var2 = method2715(0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, this.field1454, this.field1453, 0, var6, var3, this); } else { - var2 = method2552(((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, this.field1434, 0, var6, var3, this); + var2 = method2733(((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, this.field1452, 0, var6, var3, this); } - } else if (PcmPlayer.PcmPlayer_stereo) { - var2 = method2586(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, this.field1437, this.field1448, 0, var6, var3, this, this.field1435, var5); + } else if (InterfaceParent.PcmPlayer_stereo) { + var2 = method2738(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, this.field1454, this.field1453, 0, var6, var3, this, this.field1441, var5); } else { - var2 = method2556(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, this.field1434, 0, var6, var3, this, this.field1435, var5); + var2 = method2761(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, this.field1452, 0, var6, var3, this, this.field1441, var5); } - this.field1442 -= var2; - if (this.field1442 != 0) { + this.field1451 -= var2; + if (this.field1451 != 0) { return var2; } - if (!this.method2541()) { + if (!this.method2726()) { continue; } return var4; } - if (this.field1435 == -256 && (this.field1445 & 255) == 0) { - if (PcmPlayer.PcmPlayer_stereo) { - return method2545(0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, 0, var4, var3, this); + if (this.field1441 == 256 && (this.field1448 & 255) == 0) { + if (InterfaceParent.PcmPlayer_stereo) { + return method2739(0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, 0, var4, var3, this); } - return method2544(((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, 0, var4, var3, this); + return method2806(((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, 0, var4, var3, this); } - if (PcmPlayer.PcmPlayer_stereo) { - return method2568(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1439, this.field1440, 0, var4, var3, this, this.field1435, var5); + if (InterfaceParent.PcmPlayer_stereo) { + return method2730(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, 0, var4, var3, this, this.field1441, var5); } - return method2582(0, 0, ((RawSound)super.sound).samples, var1, this.field1445, var2, this.field1447, 0, var4, var3, this, this.field1435, var5); + return method2729(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, 0, var4, var3, this, this.field1441, var5); } } - @ObfuscatedName("aj") - boolean method2541() { - int var1 = this.field1436; + @ObfuscatedName("ac") + int method2807(int[] var1, int var2, int var3, int var4, int var5) { + while (true) { + if (this.field1451 > 0) { + int var6 = var2 + this.field1451; + if (var6 > var4) { + var6 = var4; + } + + this.field1451 += var2; + if (this.field1441 == -256 && (this.field1448 & 255) == 0) { + if (InterfaceParent.PcmPlayer_stereo) { + var2 = method2753(0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, this.field1454, this.field1453, 0, var6, var3, this); + } else { + var2 = method2842(((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, this.field1452, 0, var6, var3, this); + } + } else if (InterfaceParent.PcmPlayer_stereo) { + var2 = method2826(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, this.field1454, this.field1453, 0, var6, var3, this, this.field1441, var5); + } else { + var2 = method2701(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, this.field1452, 0, var6, var3, this, this.field1441, var5); + } + + this.field1451 -= var2; + if (this.field1451 != 0) { + return var2; + } + + if (!this.method2726()) { + continue; + } + + return var4; + } + + if (this.field1441 == -256 && (this.field1448 & 255) == 0) { + if (InterfaceParent.PcmPlayer_stereo) { + return method2728(0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, 0, var4, var3, this); + } + + return method2727(((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, 0, var4, var3, this); + } + + if (InterfaceParent.PcmPlayer_stereo) { + return method2795(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1445, this.field1446, 0, var4, var3, this, this.field1441, var5); + } + + return method2731(0, 0, ((RawSound)super.sound).samples, var1, this.field1448, var2, this.field1444, 0, var4, var3, this, this.field1441, var5); + } + } + + @ObfuscatedName("at") + boolean method2726() { + int var1 = this.field1440; int var2; int var3; if (var1 == Integer.MIN_VALUE) { @@ -771,97 +762,110 @@ public class RawPcmStream extends PcmStream { var2 = 0; var1 = 0; } else { - var2 = method2606(var1, this.field1443); - var3 = method2512(var1, this.field1443); + var2 = method2745(var1, this.field1442); + var3 = method2802(var1, this.field1442); } - if (var1 == this.field1447 && var2 == this.field1439 && var3 == this.field1440) { - if (this.field1436 == Integer.MIN_VALUE) { - this.field1436 = 0; + if (var1 == this.field1444 && var2 == this.field1445 && var3 == this.field1446) { + if (this.field1440 == Integer.MIN_VALUE) { this.field1440 = 0; - this.field1439 = 0; - this.field1447 = 0; + this.field1446 = 0; + this.field1445 = 0; + this.field1444 = 0; this.remove(); return true; } else { - this.method2580(); + this.method2700(); return false; } } else { - if (this.field1447 < var1) { - this.field1434 = 1; - this.field1442 = var1 - this.field1447; - } else if (this.field1447 > var1) { - this.field1434 = -1; - this.field1442 = this.field1447 - var1; + if (this.field1444 < var1) { + this.field1452 = 1; + this.field1451 = var1 - this.field1444; + } else if (this.field1444 > var1) { + this.field1452 = -1; + this.field1451 = this.field1444 - var1; } else { - this.field1434 = 0; + this.field1452 = 0; } - if (this.field1439 < var2) { - this.field1437 = 1; - if (this.field1442 == 0 || this.field1442 > var2 - this.field1439) { - this.field1442 = var2 - this.field1439; + if (this.field1445 < var2) { + this.field1454 = 1; + if (this.field1451 == 0 || this.field1451 > var2 - this.field1445) { + this.field1451 = var2 - this.field1445; } - } else if (this.field1439 > var2) { - this.field1437 = -1; - if (this.field1442 == 0 || this.field1442 > this.field1439 - var2) { - this.field1442 = this.field1439 - var2; + } else if (this.field1445 > var2) { + this.field1454 = -1; + if (this.field1451 == 0 || this.field1451 > this.field1445 - var2) { + this.field1451 = this.field1445 - var2; } } else { - this.field1437 = 0; + this.field1454 = 0; } - if (this.field1440 < var3) { - this.field1448 = 1; - if (this.field1442 == 0 || this.field1442 > var3 - this.field1440) { - this.field1442 = var3 - this.field1440; + if (this.field1446 < var3) { + this.field1453 = 1; + if (this.field1451 == 0 || this.field1451 > var3 - this.field1446) { + this.field1451 = var3 - this.field1446; } - } else if (this.field1440 > var3) { - this.field1448 = -1; - if (this.field1442 == 0 || this.field1442 > this.field1440 - var3) { - this.field1442 = this.field1440 - var3; + } else if (this.field1446 > var3) { + this.field1453 = -1; + if (this.field1451 == 0 || this.field1451 > this.field1446 - var3) { + this.field1451 = this.field1446 - var3; } } else { - this.field1448 = 0; + this.field1453 = 0; } return false; } } - @ObfuscatedName("z") - static int method2606(int var0, int var1) { + @ObfuscatedName("as") + int vmethod2868() { + int var1 = this.field1444 * 3 >> 6; + var1 = (var1 ^ var1 >> 31) + (var1 >>> 31); + if (this.numLoops == 0) { + var1 -= var1 * this.field1448 / (((RawSound)super.sound).samples.length << 8); + } else if (this.numLoops >= 0) { + var1 -= var1 * this.start / ((RawSound)super.sound).samples.length; + } + + return var1 > 255 ? 255 : var1; + } + + @ObfuscatedName("a") + static int method2745(int var0, int var1) { return var1 < 0 ? var0 : (int)((double)var0 * Math.sqrt((double)(16384 - var1) * 1.220703125E-4D) + 0.5D); } - @ObfuscatedName("n") - static int method2512(int var0, int var1) { + @ObfuscatedName("t") + static int method2802(int var0, int var1) { return var1 < 0 ? -var0 : (int)((double)var0 * Math.sqrt((double)var1 * 1.220703125E-4D) + 0.5D); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lch;II)Ldu;" + signature = "(Lca;II)Lds;" ) @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)(UrlRequest.PcmPlayer_sampleRate * 100)), var2 << 6) : null; + return var0.samples != null && var0.samples.length != 0 ? new RawPcmStream(var0, (int)((long)var0.sampleRate * 256L * (long)var1 / (long)(PcmPlayer.PcmPlayer_sampleRate * 2205000)), var2 << 6) : null; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lch;III)Ldu;" + signature = "(Lca;III)Lds;" ) - public static RawPcmStream method2548(RawSound var0, int var1, int var2, int var3) { + public static RawPcmStream method2767(RawSound var0, int var1, int var2, int var3) { return var0.samples != null && var0.samples.length != 0 ? new RawPcmStream(var0, var1, var2, var3) : null; } - @ObfuscatedName("ay") + @ObfuscatedName("ba") @ObfuscatedSignature( - signature = "([B[IIIIIIILdu;)I" + signature = "([B[IIIIIIILds;)I" ) - static int method2542(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, RawPcmStream var8) { + static int method2806(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, RawPcmStream var8) { var2 >>= 8; var7 >>= 8; var4 <<= 2; @@ -884,15 +888,15 @@ public class RawPcmStream extends PcmStream { var10001 = var3++; } - var8.field1445 = var2 << 8; + var8.field1448 = var2 << 8; return var3; } - @ObfuscatedName("au") + @ObfuscatedName("bg") @ObfuscatedSignature( - signature = "(I[B[IIIIIIIILdu;)I" + signature = "(I[B[IIIIIIIILds;)I" ) - static int method2543(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10) { + static int method2739(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10) { var3 >>= 8; var9 >>= 8; var5 <<= 2; @@ -935,15 +939,15 @@ public class RawPcmStream extends PcmStream { var10001 = var4++; } - var10.field1445 = var3 << 8; + var10.field1448 = var3 << 8; return var4 >> 1; } - @ObfuscatedName("af") + @ObfuscatedName("bc") @ObfuscatedSignature( - signature = "([B[IIIIIIILdu;)I" + signature = "([B[IIIIIIILds;)I" ) - static int method2544(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, RawPcmStream var8) { + static int method2727(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, RawPcmStream var8) { var2 >>= 8; var7 >>= 8; var4 <<= 2; @@ -966,15 +970,15 @@ public class RawPcmStream extends PcmStream { var10001 = var3++; } - var8.field1445 = var2 << 8; + var8.field1448 = var2 << 8; return var3; } - @ObfuscatedName("at") + @ObfuscatedName("bd") @ObfuscatedSignature( - signature = "(I[B[IIIIIIIILdu;)I" + signature = "(I[B[IIIIIIIILds;)I" ) - static int method2545(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10) { + static int method2728(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10) { var3 >>= 8; var9 >>= 8; var5 <<= 2; @@ -1017,15 +1021,15 @@ public class RawPcmStream extends PcmStream { var10001 = var4++; } - var10.field1445 = var3 << 8; + var10.field1448 = var3 << 8; return var4 >> 1; } @ObfuscatedName("bx") @ObfuscatedSignature( - signature = "(II[B[IIIIIIILdu;II)I" + signature = "(II[B[IIIIIIILds;II)I" ) - static int method2546(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10, int var11, int var12) { + static int method2729(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10, int var11, int var12) { if (var11 == 0 || (var7 = var5 + (var11 + (var9 - var4) - 257) / var11) > var8) { var7 = var8; } @@ -1050,15 +1054,15 @@ public class RawPcmStream extends PcmStream { var3[var10001] += ((var13 << 8) + (var1 - var13) * (var4 & 255)) * var6 >> 6; } - var10.field1445 = var4; + var10.field1448 = var4; return var5; } - @ObfuscatedName("bh") + @ObfuscatedName("bl") @ObfuscatedSignature( - signature = "(II[B[IIIIIIIILdu;II)I" + signature = "(II[B[IIIIIIIILds;II)I" ) - static int method2547(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { + static int method2730(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { if (var12 == 0 || (var8 = var5 + (var10 - var4 + var12 - 257) / var12) > var9) { var8 = var9; } @@ -1092,15 +1096,15 @@ public class RawPcmStream extends PcmStream { var3[var10001] += var0 * var7 >> 6; } - var11.field1445 = var4; + var11.field1448 = var4; return var5 >> 1; } - @ObfuscatedName("bd") + @ObfuscatedName("bh") @ObfuscatedSignature( - signature = "(II[B[IIIIIIILdu;II)I" + signature = "(II[B[IIIIIIILds;II)I" ) - static int method2582(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10, int var11, int var12) { + static int method2731(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, RawPcmStream var10, int var11, int var12) { if (var11 == 0 || (var7 = var5 + (var11 + (var9 + 256 - var4)) / var11) > var8) { var7 = var8; } @@ -1125,15 +1129,15 @@ public class RawPcmStream extends PcmStream { var3[var10001] += ((var0 << 8) + (var2[var4 >> 8] - var0) * (var4 & 255)) * var6 >> 6; } - var10.field1445 = var4; + var10.field1448 = var4; return var5; } - @ObfuscatedName("bm") + @ObfuscatedName("bu") @ObfuscatedSignature( - signature = "(II[B[IIIIIIIILdu;II)I" + signature = "(II[B[IIIIIIIILds;II)I" ) - static int method2568(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { + static int method2795(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { if (var12 == 0 || (var8 = var5 + (var10 + 256 - var4 + var12) / var12) > var9) { var8 = var9; } @@ -1165,15 +1169,15 @@ public class RawPcmStream extends PcmStream { var3[var10001] += var0 * var7 >> 6; } - var11.field1445 = var4; + var11.field1448 = var4; return var5 >> 1; } - @ObfuscatedName("bv") + @ObfuscatedName("br") @ObfuscatedSignature( - signature = "([B[IIIIIIIILdu;)I" + signature = "([B[IIIIIIIILds;)I" ) - static int method2550(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, RawPcmStream var9) { + static int method2733(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, RawPcmStream var9) { var2 >>= 8; var8 >>= 8; var4 <<= 2; @@ -1182,8 +1186,8 @@ public class RawPcmStream extends PcmStream { var6 = var7; } - var9.field1439 += var9.field1437 * (var6 - var3); - var9.field1440 += var9.field1448 * (var6 - var3); + var9.field1445 += var9.field1454 * (var6 - var3); + var9.field1446 += var9.field1453 * (var6 - var3); int var10001; for (var6 -= 3; var3 < var6; var4 += var5) { @@ -1205,16 +1209,16 @@ public class RawPcmStream extends PcmStream { var1[var10001] += var0[var2++] * var4; } - var9.field1447 = var4 >> 2; - var9.field1445 = var2 << 8; + var9.field1444 = var4 >> 2; + var9.field1448 = var2 << 8; return var3; } - @ObfuscatedName("bj") + @ObfuscatedName("bq") @ObfuscatedSignature( - signature = "(I[B[IIIIIIIIIILdu;)I" + signature = "(I[B[IIIIIIIIIILds;)I" ) - static int method2551(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, RawPcmStream var12) { + static int method2715(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, RawPcmStream var12) { var3 >>= 8; var11 >>= 8; var5 <<= 2; @@ -1225,7 +1229,7 @@ public class RawPcmStream extends PcmStream { var9 = var10; } - var12.field1447 += var12.field1434 * (var9 - var4); + var12.field1444 += var12.field1452 * (var9 - var4); var4 <<= 1; var9 <<= 1; @@ -1270,17 +1274,17 @@ public class RawPcmStream extends PcmStream { var2[var10001] += var13 * var6; } - var12.field1439 = var5 >> 2; - var12.field1440 = var6 >> 2; - var12.field1445 = var3 << 8; + var12.field1445 = var5 >> 2; + var12.field1446 = var6 >> 2; + var12.field1448 = var3 << 8; return var4 >> 1; } - @ObfuscatedName("bs") + @ObfuscatedName("bi") @ObfuscatedSignature( - signature = "([B[IIIIIIIILdu;)I" + signature = "([B[IIIIIIIILds;)I" ) - static int method2552(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, RawPcmStream var9) { + static int method2842(byte[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, RawPcmStream var9) { var2 >>= 8; var8 >>= 8; var4 <<= 2; @@ -1289,8 +1293,8 @@ public class RawPcmStream extends PcmStream { var6 = var7; } - var9.field1439 += var9.field1437 * (var6 - var3); - var9.field1440 += var9.field1448 * (var6 - var3); + var9.field1445 += var9.field1454 * (var6 - var3); + var9.field1446 += var9.field1453 * (var6 - var3); int var10001; for (var6 -= 3; var3 < var6; var4 += var5) { @@ -1312,16 +1316,16 @@ public class RawPcmStream extends PcmStream { var1[var10001] += var0[var2--] * var4; } - var9.field1447 = var4 >> 2; - var9.field1445 = var2 << 8; + var9.field1444 = var4 >> 2; + var9.field1448 = var2 << 8; return var3; } - @ObfuscatedName("bz") + @ObfuscatedName("be") @ObfuscatedSignature( - signature = "(I[B[IIIIIIIIIILdu;)I" + signature = "(I[B[IIIIIIIIIILds;)I" ) - static int method2511(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, RawPcmStream var12) { + static int method2753(int var0, byte[] var1, int[] var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, RawPcmStream var12) { var3 >>= 8; var11 >>= 8; var5 <<= 2; @@ -1332,7 +1336,7 @@ public class RawPcmStream extends PcmStream { var9 = var10; } - var12.field1447 += var12.field1434 * (var9 - var4); + var12.field1444 += var12.field1452 * (var9 - var4); var4 <<= 1; var9 <<= 1; @@ -1377,19 +1381,19 @@ public class RawPcmStream extends PcmStream { var2[var10001] += var13 * var6; } - var12.field1439 = var5 >> 2; - var12.field1440 = var6 >> 2; - var12.field1445 = var3 << 8; + var12.field1445 = var5 >> 2; + var12.field1446 = var6 >> 2; + var12.field1448 = var3 << 8; return var4 >> 1; } - @ObfuscatedName("bc") + @ObfuscatedName("bt") @ObfuscatedSignature( - signature = "(II[B[IIIIIIIILdu;II)I" + signature = "(II[B[IIIIIIIILds;II)I" ) - static int method2621(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { - var11.field1439 -= var11.field1437 * var5; - var11.field1440 -= var11.field1448 * var5; + static int method2761(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { + var11.field1445 -= var11.field1454 * var5; + var11.field1446 -= var11.field1453 * var5; if (var12 == 0 || (var8 = var5 + (var10 - var4 + var12 - 257) / var12) > var9) { var8 = var9; } @@ -1416,19 +1420,19 @@ public class RawPcmStream extends PcmStream { var6 += var7; } - var11.field1439 += var11.field1437 * var5; - var11.field1440 += var11.field1448 * var5; - var11.field1447 = var6; - var11.field1445 = var4; + var11.field1445 += var11.field1454 * var5; + var11.field1446 += var11.field1453 * var5; + var11.field1444 = var6; + var11.field1448 = var4; return var5; } - @ObfuscatedName("bk") + @ObfuscatedName("bs") @ObfuscatedSignature( - signature = "(II[B[IIIIIIIIIILdu;II)I" + signature = "(II[B[IIIIIIIIIILds;II)I" ) - static int method2584(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, RawPcmStream var13, int var14, int var15) { - var13.field1447 -= var5 * var13.field1434; + static int method2738(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, RawPcmStream var13, int var14, int var15) { + var13.field1444 -= var5 * var13.field1452; if (var14 == 0 || (var10 = var5 + (var12 - var4 + var14 - 257) / var14) > var11) { var10 = var11; } @@ -1467,20 +1471,20 @@ public class RawPcmStream extends PcmStream { } var5 >>= 1; - var13.field1447 += var13.field1434 * var5; - var13.field1439 = var6; - var13.field1440 = var7; - var13.field1445 = var4; + var13.field1444 += var13.field1452 * var5; + var13.field1445 = var6; + var13.field1446 = var7; + var13.field1448 = var4; return var5; } - @ObfuscatedName("ba") + @ObfuscatedName("bj") @ObfuscatedSignature( - signature = "(II[B[IIIIIIIILdu;II)I" + signature = "(II[B[IIIIIIIILds;II)I" ) - static int method2556(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { - var11.field1439 -= var11.field1437 * var5; - var11.field1440 -= var11.field1448 * var5; + static int method2701(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, RawPcmStream var11, int var12, int var13) { + var11.field1445 -= var11.field1454 * var5; + var11.field1446 -= var11.field1453 * var5; if (var12 == 0 || (var8 = var5 + (var10 + 256 - var4 + var12) / var12) > var9) { var8 = var9; } @@ -1507,19 +1511,19 @@ public class RawPcmStream extends PcmStream { var6 += var7; } - var11.field1439 += var11.field1437 * var5; - var11.field1440 += var11.field1448 * var5; - var11.field1447 = var6; - var11.field1445 = var4; + var11.field1445 += var11.field1454 * var5; + var11.field1446 += var11.field1453 * var5; + var11.field1444 = var6; + var11.field1448 = var4; return var5; } - @ObfuscatedName("bn") + @ObfuscatedName("bm") @ObfuscatedSignature( - signature = "(II[B[IIIIIIIIIILdu;II)I" + signature = "(II[B[IIIIIIIIIILds;II)I" ) - static int method2586(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, RawPcmStream var13, int var14, int var15) { - var13.field1447 -= var5 * var13.field1434; + static int method2826(int var0, int var1, byte[] var2, int[] var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, RawPcmStream var13, int var14, int var15) { + var13.field1444 -= var5 * var13.field1452; if (var14 == 0 || (var10 = var5 + (var12 + 256 - var4 + var14) / var14) > var11) { var10 = var11; } @@ -1556,10 +1560,10 @@ public class RawPcmStream extends PcmStream { } var5 >>= 1; - var13.field1447 += var13.field1434 * var5; - var13.field1439 = var6; - var13.field1440 = var7; - var13.field1445 = var4; + var13.field1444 += var13.field1452 * var5; + var13.field1445 = var6; + var13.field1446 = var7; + var13.field1448 = var4; return var5; } } diff --git a/runescape-client/src/main/java/RawSound.java b/runescape-client/src/main/java/RawSound.java index aeff93aeea..7eec8c2672 100644 --- a/runescape-client/src/main/java/RawSound.java +++ b/runescape-client/src/main/java/RawSound.java @@ -3,23 +3,23 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ch") +@ObfuscatedName("ca") @Implements("RawSound") public class RawSound extends AbstractSound { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("sampleRate") public int sampleRate; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("samples") public byte[] samples; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("start") public int start; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("end") int end; - @ObfuscatedName("r") - public boolean field1369; + @ObfuscatedName("v") + public boolean field1363; RawSound(int var1, byte[] var2, int var3, int var4) { this.sampleRate = var1; @@ -33,12 +33,12 @@ public class RawSound extends AbstractSound { this.samples = var2; this.start = var3; this.end = var4; - this.field1369 = var5; + this.field1363 = var5; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ldr;)Lch;" + signature = "(Ldo;)Lca;" ) @Export("resample") public RawSound resample(Decimator var1) { diff --git a/runescape-client/src/main/java/ReflectionCheck.java b/runescape-client/src/main/java/ReflectionCheck.java index 1049997a3e..70c56b5c72 100644 --- a/runescape-client/src/main/java/ReflectionCheck.java +++ b/runescape-client/src/main/java/ReflectionCheck.java @@ -5,76 +5,73 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("cq") +@ObfuscatedName("ck") @Implements("ReflectionCheck") public class ReflectionCheck extends Node { - @ObfuscatedName("sf") - @ObfuscatedGetter( - intValue = 1327402685 - ) - @Export("foundItemIndex") - static int foundItemIndex; - @ObfuscatedName("gp") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "[Llf;" + signature = "Lhi;" ) - @Export("headIconHintSprites") - static Sprite[] headIconHintSprites; - @ObfuscatedName("z") + static Widget field1310; + @ObfuscatedName("dc") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive19") + static Archive archive19; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 85422493 + intValue = 1464057187 ) @Export("id") int id; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 198207431 + intValue = -828282983 ) @Export("size") int size; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("operations") int[] operations; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("creationErrors") int[] creationErrors; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("fields") Field[] fields; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("intReplaceValues") int[] intReplaceValues; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("methods") Method[] methods; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("arguments") byte[][][] arguments; ReflectionCheck() { } - @ObfuscatedName("k") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-884073904" + signature = "(B)V", + garbageValue = "-2" ) - static int method2271(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.SOUND_SYNTH) { - Interpreter.Interpreter_intStackSize -= 3; - Message.queueSoundEffect(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]); - return 1; - } else if (var0 == ScriptOpcodes.SOUND_SONG) { - MusicPatchNode2.playSong(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - return 1; - } else if (var0 == ScriptOpcodes.SOUND_JINGLE) { - Interpreter.Interpreter_intStackSize -= 2; - ClientPacket.playSoundJingle(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - return 1; - } else { - return 2; - } + public static void method2438() { + class197.midiPcmStream.clear(); + class197.field2377 = 1; + class247.musicTrackArchive = null; + } + + @ObfuscatedName("jv") + @ObfuscatedSignature( + signature = "(ZI)V", + garbageValue = "-1720039753" + ) + @Export("setTapToDrop") + static void setTapToDrop(boolean var0) { + Client.tapToDrop = var0; } } diff --git a/runescape-client/src/main/java/RouteStrategy.java b/runescape-client/src/main/java/RouteStrategy.java index cd7ee5e392..7bcd12f11c 100644 --- a/runescape-client/src/main/java/RouteStrategy.java +++ b/runescape-client/src/main/java/RouteStrategy.java @@ -1,33 +1,34 @@ +import java.util.Date; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fi") +@ObfuscatedName("fc") @Implements("RouteStrategy") public abstract class RouteStrategy { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 942047679 + intValue = -1359594725 ) @Export("approxDestinationX") public int approxDestinationX; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1911711911 + intValue = 1078998847 ) @Export("approxDestinationY") public int approxDestinationY; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -969700339 + intValue = 1265963087 ) @Export("approxDestinationSizeX") public int approxDestinationSizeX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1794388549 + intValue = 1331790243 ) @Export("approxDestinationSizeY") public int approxDestinationSizeY; @@ -35,118 +36,120 @@ public abstract class RouteStrategy { protected RouteStrategy() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIILfa;B)Z", - garbageValue = "27" + signature = "(IIILfm;B)Z", + garbageValue = "16" ) @Export("hasArrived") protected abstract boolean hasArrived(int var1, int var2, int var3, CollisionMap var4); - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IILfi;Lfa;I)Z", - garbageValue = "-1798427460" + signature = "([Ljava/lang/String;[SIII)V", + garbageValue = "1742711992" ) - static final boolean method3561(int var0, int var1, RouteStrategy var2, CollisionMap var3) { - int var4 = var0; - int var5 = var1; - byte var6 = 64; - byte var7 = 64; - int var8 = var0 - var6; - int var9 = var1 - var7; - class173.directions[var6][var7] = 99; - class173.distances[var6][var7] = 0; - byte var10 = 0; - int var11 = 0; - class173.bufferX[var10] = var0; - byte var10001 = var10; - int var18 = var10 + 1; - class173.bufferY[var10001] = var1; - int[][] var12 = var3.flags; + @Export("sortItemsByName") + public static void sortItemsByName(String[] var0, short[] var1, int var2, int var3) { + if (var2 < var3) { + int var4 = (var3 + var2) / 2; + int var5 = var2; + String var6 = var0[var4]; + var0[var4] = var0[var3]; + var0[var3] = var6; + short var7 = var1[var4]; + var1[var4] = var1[var3]; + var1[var3] = var7; - while (var11 != var18) { - var4 = class173.bufferX[var11]; - var5 = class173.bufferY[var11]; - var11 = var11 + 1 & 4095; - int var16 = var4 - var8; - int var17 = var5 - var9; - int var13 = var4 - var3.xInset; - int var14 = var5 - var3.yInset; - if (var2.hasArrived(2, var4, var5, var3)) { - UserComparator10.field1956 = var4; - class173.field2075 = var5; - return true; + for (int var8 = var2; var8 < var3; ++var8) { + if (var6 == null || var0[var8] != null && var0[var8].compareTo(var6) < (var8 & 1)) { + String var9 = var0[var8]; + var0[var8] = var0[var5]; + var0[var5] = var9; + short var10 = var1[var8]; + var1[var8] = var1[var5]; + var1[var5++] = var10; + } } - int var15 = class173.distances[var16][var17] + 1; - if (var16 > 0 && class173.directions[var16 - 1][var17] == 0 && (var12[var13 - 1][var14] & 19136782) == 0 && (var12[var13 - 1][var14 + 1] & 19136824) == 0) { - class173.bufferX[var18] = var4 - 1; - class173.bufferY[var18] = var5; - var18 = var18 + 1 & 4095; - class173.directions[var16 - 1][var17] = 2; - class173.distances[var16 - 1][var17] = var15; - } - - if (var16 < 126 && class173.directions[var16 + 1][var17] == 0 && (var12[var13 + 2][var14] & 19136899) == 0 && (var12[var13 + 2][var14 + 1] & 19136992) == 0) { - class173.bufferX[var18] = var4 + 1; - class173.bufferY[var18] = var5; - var18 = var18 + 1 & 4095; - class173.directions[var16 + 1][var17] = 8; - class173.distances[var16 + 1][var17] = var15; - } - - if (var17 > 0 && class173.directions[var16][var17 - 1] == 0 && (var12[var13][var14 - 1] & 19136782) == 0 && (var12[var13 + 1][var14 - 1] & 19136899) == 0) { - class173.bufferX[var18] = var4; - class173.bufferY[var18] = var5 - 1; - var18 = var18 + 1 & 4095; - class173.directions[var16][var17 - 1] = 1; - class173.distances[var16][var17 - 1] = var15; - } - - if (var17 < 126 && class173.directions[var16][var17 + 1] == 0 && (var12[var13][var14 + 2] & 19136824) == 0 && (var12[var13 + 1][var14 + 2] & 19136992) == 0) { - class173.bufferX[var18] = var4; - class173.bufferY[var18] = var5 + 1; - var18 = var18 + 1 & 4095; - class173.directions[var16][var17 + 1] = 4; - class173.distances[var16][var17 + 1] = var15; - } - - if (var16 > 0 && var17 > 0 && class173.directions[var16 - 1][var17 - 1] == 0 && (var12[var13 - 1][var14] & 19136830) == 0 && (var12[var13 - 1][var14 - 1] & 19136782) == 0 && (var12[var13][var14 - 1] & 19136911) == 0) { - class173.bufferX[var18] = var4 - 1; - class173.bufferY[var18] = var5 - 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 - 1][var17 - 1] = 3; - class173.distances[var16 - 1][var17 - 1] = var15; - } - - if (var16 < 126 && var17 > 0 && class173.directions[var16 + 1][var17 - 1] == 0 && (var12[var13 + 1][var14 - 1] & 19136911) == 0 && (var12[var13 + 2][var14 - 1] & 19136899) == 0 && (var12[var13 + 2][var14] & 19136995) == 0) { - class173.bufferX[var18] = var4 + 1; - class173.bufferY[var18] = var5 - 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 + 1][var17 - 1] = 9; - class173.distances[var16 + 1][var17 - 1] = var15; - } - - if (var16 > 0 && var17 < 126 && class173.directions[var16 - 1][var17 + 1] == 0 && (var12[var13 - 1][var14 + 1] & 19136830) == 0 && (var12[var13 - 1][var14 + 2] & 19136824) == 0 && (var12[var13][var14 + 2] & 19137016) == 0) { - class173.bufferX[var18] = var4 - 1; - class173.bufferY[var18] = var5 + 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 - 1][var17 + 1] = 6; - class173.distances[var16 - 1][var17 + 1] = var15; - } - - if (var16 < 126 && var17 < 126 && class173.directions[var16 + 1][var17 + 1] == 0 && (var12[var13 + 1][var14 + 2] & 19137016) == 0 && (var12[var13 + 2][var14 + 2] & 19136992) == 0 && (var12[var13 + 2][var14 + 1] & 19136995) == 0) { - class173.bufferX[var18] = var4 + 1; - class173.bufferY[var18] = var5 + 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 + 1][var17 + 1] = 12; - class173.distances[var16 + 1][var17 + 1] = var15; - } + var0[var3] = var0[var5]; + var0[var5] = var6; + var1[var3] = var1[var5]; + var1[var5] = var7; + sortItemsByName(var0, var1, var2, var5 - 1); + sortItemsByName(var0, var1, var5 + 1, var3); + } + + } + + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "([BI)Lks;", + garbageValue = "-794293590" + ) + static Font method3738(byte[] var0) { + if (var0 == null) { + return null; + } else { + Font var1 = new Font(var0, SecureRandomFuture.SpriteBuffer_xOffsets, HealthBar.SpriteBuffer_yOffsets, SecureRandomCallable.SpriteBuffer_spriteWidths, AttackOption.SpriteBuffer_spriteHeights, class325.SpriteBuffer_spritePalette, class325.SpriteBuffer_pixels); + WorldMapData_1.method787(); + return var1; + } + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "-1542036969" + ) + static final int method3736(int var0, int var1) { + int var2 = DevicePcmPlayerProvider.method918(var0 - 1, var1 - 1) + DevicePcmPlayerProvider.method918(1 + var0, var1 - 1) + DevicePcmPlayerProvider.method918(var0 - 1, 1 + var1) + DevicePcmPlayerProvider.method918(1 + var0, 1 + var1); + int var3 = DevicePcmPlayerProvider.method918(var0 - 1, var1) + DevicePcmPlayerProvider.method918(var0 + 1, var1) + DevicePcmPlayerProvider.method918(var0, var1 - 1) + DevicePcmPlayerProvider.method918(var0, 1 + var1); + int var4 = DevicePcmPlayerProvider.method918(var0, var1); + return var2 / 16 + var3 / 8 + var4 / 4; + } + + @ObfuscatedName("he") + @ObfuscatedSignature( + signature = "(IIIIB)V", + garbageValue = "-39" + ) + static final void method3734(int var0, int var1, int var2, int var3) { + WorldMapSection1.method622(); + } + + @ObfuscatedName("lt") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;S)V", + garbageValue = "-1363" + ) + static void method3735(String var0) { + MilliClock.field1994 = var0; + + try { + String var1 = WorldMapID.client.getParameter(Integer.toString(18)); + String var2 = WorldMapID.client.getParameter(Integer.toString(13)); + String var3 = var1 + "settings=" + var0 + "; version=1; path=/; domain=" + var2; + if (var0.length() == 0) { + var3 = var3 + "; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0"; + } else { + String var4 = var3 + "; Expires="; + long var6 = PlayerAppearance.currentTimeMillis() + 94608000000L; + Calendar.Calendar_calendar.setTime(new Date(var6)); + int var8 = Calendar.Calendar_calendar.get(7); + int var9 = Calendar.Calendar_calendar.get(5); + int var10 = Calendar.Calendar_calendar.get(2); + int var11 = Calendar.Calendar_calendar.get(1); + int var12 = Calendar.Calendar_calendar.get(11); + int var13 = Calendar.Calendar_calendar.get(12); + int var14 = Calendar.Calendar_calendar.get(13); + String var5 = Calendar.DAYS_OF_THE_WEEK[var8 - 1] + ", " + var9 / 10 + var9 % 10 + "-" + Calendar.MONTH_NAMES_ENGLISH_GERMAN[0][var10] + "-" + var11 + " " + var12 / 10 + var12 % 10 + ":" + var13 / 10 + var13 % 10 + ":" + var14 / 10 + var14 % 10 + " GMT"; + var3 = var4 + var5 + "; Max-Age=" + 94608000L; + } + + class47.method922(WorldMapID.client, "document.cookie=\"" + var3 + "\""); + } catch (Throwable var15) { } - UserComparator10.field1956 = var4; - class173.field2075 = var5; - return false; } } diff --git a/runescape-client/src/main/java/RunException.java b/runescape-client/src/main/java/RunException.java index c091f5025d..bc6878d7b2 100644 --- a/runescape-client/src/main/java/RunException.java +++ b/runescape-client/src/main/java/RunException.java @@ -3,36 +3,26 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("mf") @Implements("RunException") public class RunException extends RuntimeException { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("RunException_applet") public static Applet RunException_applet; @ObfuscatedName("n") @Export("localPlayerName") public static String localPlayerName; - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1228960845 + intValue = 2085181929 ) @Export("RunException_revision") public static int RunException_revision; - @ObfuscatedName("q") - @Export("SpriteBuffer_spriteHeights") - public static int[] SpriteBuffer_spriteHeights; - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "Ldn;" - ) - @Export("soundSystem") - static SoundSystem soundSystem; - @ObfuscatedName("r") + @ObfuscatedName("l") @Export("message") String message; - @ObfuscatedName("p") + @ObfuscatedName("c") @Export("throwable") Throwable throwable; diff --git a/runescape-client/src/main/java/Scene.java b/runescape-client/src/main/java/Scene.java index cde552f69b..be7dca252d 100644 --- a/runescape-client/src/main/java/Scene.java +++ b/runescape-client/src/main/java/Scene.java @@ -3,188 +3,188 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ex") +@ObfuscatedName("ek") @Implements("Scene") public class Scene { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("Scene_isLowDetail") public static boolean Scene_isLowDetail; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("tileUpdateCount") static int tileUpdateCount; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("Scene_plane") static int Scene_plane; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("Scene_drawnCount") static int Scene_drawnCount; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("Scene_cameraXTileMin") static int Scene_cameraXTileMin; - @ObfuscatedName("x") + @ObfuscatedName("s") @Export("Scene_cameraXTileMax") static int Scene_cameraXTileMax; - @ObfuscatedName("h") + @ObfuscatedName("b") @Export("Scene_cameraYTileMin") static int Scene_cameraYTileMin; - @ObfuscatedName("s") + @ObfuscatedName("z") @Export("Scene_cameraYTileMax") static int Scene_cameraYTileMax; @ObfuscatedName("f") @Export("Scene_cameraXTile") static int Scene_cameraXTile; - @ObfuscatedName("j") + @ObfuscatedName("g") @Export("Scene_cameraYTile") static int Scene_cameraYTile; - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("Scene_cameraX") static int Scene_cameraX; - @ObfuscatedName("l") + @ObfuscatedName("u") @Export("Scene_cameraY") static int Scene_cameraY; - @ObfuscatedName("k") + @ObfuscatedName("y") @Export("Scene_cameraZ") static int Scene_cameraZ; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @Export("Scene_cameraPitchSine") static int Scene_cameraPitchSine; - @ObfuscatedName("az") + @ObfuscatedName("aw") @Export("Scene_cameraPitchCosine") static int Scene_cameraPitchCosine; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @Export("Scene_cameraYawSine") static int Scene_cameraYawSine; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @Export("Scene_cameraYawCosine") static int Scene_cameraYawCosine; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedSignature( - signature = "[Lej;" + signature = "[Lex;" ) @Export("gameObjects") static GameObject[] gameObjects; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @Export("checkClick") static boolean checkClick; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @Export("Scene_selectedPlane") static int Scene_selectedPlane; - @ObfuscatedName("ax") + @ObfuscatedName("av") @Export("Scene_selectedScreenX") static int Scene_selectedScreenX; - @ObfuscatedName("as") + @ObfuscatedName("am") @Export("Scene_selectedScreenY") static int Scene_selectedScreenY; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @Export("Scene_selectedX") public static int Scene_selectedX; - @ObfuscatedName("al") + @ObfuscatedName("ax") @Export("Scene_selectedY") public static int Scene_selectedY; - @ObfuscatedName("ad") + @ObfuscatedName("al") @Export("viewportWalking") static boolean viewportWalking; - @ObfuscatedName("ak") + @ObfuscatedName("ae") @Export("Scene_planesCount") static int Scene_planesCount; - @ObfuscatedName("aq") + @ObfuscatedName("au") @Export("Scene_planeOccluderCounts") static int[] Scene_planeOccluderCounts; - @ObfuscatedName("am") + @ObfuscatedName("ah") @ObfuscatedSignature( - signature = "[[Les;" + signature = "[[Leh;" ) @Export("Scene_planeOccluders") static Occluder[][] Scene_planeOccluders; - @ObfuscatedName("ae") + @ObfuscatedName("an") @Export("Scene_currentOccludersCount") static int Scene_currentOccludersCount; - @ObfuscatedName("av") + @ObfuscatedName("af") @ObfuscatedSignature( - signature = "[Les;" + signature = "[Leh;" ) @Export("Scene_currentOccluders") static Occluder[] Scene_currentOccluders; - @ObfuscatedName("ah") + @ObfuscatedName("ay") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("Scene_tilesDeque") static NodeDeque Scene_tilesDeque; - @ObfuscatedName("ag") - static final int[] field1833; - @ObfuscatedName("aj") - static final int[] field1816; - @ObfuscatedName("ay") - static final int[] field1769; - @ObfuscatedName("au") - static final int[] field1818; - @ObfuscatedName("af") - static final int[] field1815; + @ObfuscatedName("az") + static final int[] field1824; + @ObfuscatedName("ao") + static final int[] field1829; + @ObfuscatedName("ai") + static final int[] field1826; + @ObfuscatedName("ac") + static final int[] field1780; @ObfuscatedName("at") - static final int[] field1814; - @ObfuscatedName("bx") - static final int[] field1821; - @ObfuscatedName("bz") + static final int[] field1828; + @ObfuscatedName("as") + static final int[] field1836; + @ObfuscatedName("ba") + static final int[] field1830; + @ObfuscatedName("bu") @Export("visibilityMap") static boolean[][][][] visibilityMap; - @ObfuscatedName("bc") + @ObfuscatedName("br") @Export("visibleTiles") static boolean[][] visibleTiles; - @ObfuscatedName("bk") + @ObfuscatedName("bq") @Export("Scene_viewportXCenter") static int Scene_viewportXCenter; - @ObfuscatedName("ba") + @ObfuscatedName("bi") @Export("Scene_viewportYCenter") static int Scene_viewportYCenter; - @ObfuscatedName("bn") + @ObfuscatedName("be") @Export("Scene_viewportXMin") static int Scene_viewportXMin; - @ObfuscatedName("be") + @ObfuscatedName("bt") @Export("Scene_viewportYMin") static int Scene_viewportYMin; - @ObfuscatedName("bu") + @ObfuscatedName("bs") @Export("Scene_viewportXMax") static int Scene_viewportXMax; - @ObfuscatedName("bi") + @ObfuscatedName("bj") @Export("Scene_viewportYMax") static int Scene_viewportYMax; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("planes") int planes; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("xSize") int xSize; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("ySize") int ySize; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("tileHeights") int[][][] tileHeights; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "[[[Ldl;" + signature = "[[[Ldh;" ) @Export("tiles") Tile[][][] tiles; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("minPlane") int minPlane; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("tempGameObjectsCount") int tempGameObjectsCount; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "[Lej;" + signature = "[Lex;" ) @Export("tempGameObjects") GameObject[] tempGameObjects; - @ObfuscatedName("i") - int[][][] field1778; - @ObfuscatedName("bj") + @ObfuscatedName("d") + int[][][] field1809; + @ObfuscatedName("bl") @Export("tileShape2D") int[][] tileShape2D; - @ObfuscatedName("bs") + @ObfuscatedName("bh") @Export("tileRotation2D") int[][] tileRotation2D; @@ -206,13 +206,13 @@ public class Scene { Scene_currentOccludersCount = 0; Scene_currentOccluders = new Occluder[500]; Scene_tilesDeque = new NodeDeque(); - field1833 = new int[]{19, 55, 38, 155, 255, 110, 137, 205, 76}; - field1816 = new int[]{160, 192, 80, 96, 0, 144, 80, 48, 160}; - field1769 = new int[]{76, 8, 137, 4, 0, 1, 38, 2, 19}; - field1818 = new int[]{0, 0, 2, 0, 0, 2, 1, 1, 0}; - field1815 = new int[]{2, 0, 0, 2, 0, 0, 0, 4, 4}; - field1814 = new int[]{0, 4, 4, 8, 0, 0, 8, 0, 0}; - field1821 = new int[]{1, 1, 0, 0, 0, 8, 0, 0, 8}; + field1824 = new int[]{19, 55, 38, 155, 255, 110, 137, 205, 76}; + field1829 = new int[]{160, 192, 80, 96, 0, 144, 80, 48, 160}; + field1826 = new int[]{76, 8, 137, 4, 0, 1, 38, 2, 19}; + field1780 = new int[]{0, 0, 2, 0, 0, 2, 1, 1, 0}; + field1828 = new int[]{2, 0, 0, 2, 0, 0, 0, 4, 4}; + field1836 = new int[]{0, 4, 4, 8, 0, 0, 8, 0, 0}; + field1830 = new int[]{1, 1, 0, 0, 0, 8, 0, 0, 8}; visibilityMap = new boolean[8][32][51][51]; } @@ -226,12 +226,12 @@ public class Scene { this.xSize = var2; this.ySize = var3; this.tiles = new Tile[var1][var2][var3]; - this.field1778 = new int[var1][var2 + 1][var3 + 1]; + this.field1809 = new int[var1][var2 + 1][var3 + 1]; this.tileHeights = var4; this.clear(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("clear") public void clear() { int var1; @@ -264,7 +264,7 @@ public class Scene { } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("init") public void init(int var1) { this.minPlane = var1; @@ -279,7 +279,7 @@ public class Scene { } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("setLinkBelow") public void setLinkBelow(int var1, int var2) { Tile var3 = this.tiles[0][var1][var2]; @@ -291,7 +291,7 @@ public class Scene { for (int var6 = 0; var6 < var5.gameObjectsCount; ++var6) { GameObject var7 = var5.gameObjects[var6]; - if (WorldMapDecoration.method346(var7.tag) && var7.startX == var1 && var2 == var7.startY) { + if (class188.method3793(var7.tag) && var7.startX == var1 && var2 == var7.startY) { --var7.plane; } } @@ -306,7 +306,7 @@ public class Scene { this.tiles[3][var1][var2] = null; } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("setTileMinPlane") public void setTileMinPlane(int var1, int var2, int var3, int var4) { Tile var5 = this.tiles[var1][var2][var3]; @@ -315,50 +315,47 @@ public class Scene { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("addTile") - public void addTile(int z, int x, int y, int shape, int rotation, int texture, int heightSw, int heightNw, - int heightNe, int heightSe, int underlaySwColor, int underlayNwColor, int underlayNeColor, - int underlaySeColor, int overlaySwColor, int overlayNwColor, int overlayNeColor, - int overlaySeColor, int underlayRgb, int overlayRgb) { + public void addTile(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16, int var17, int var18, int var19, int var20) { TilePaint var21; int var22; - if (shape == 0) { - var21 = new TilePaint(underlaySwColor, underlayNwColor, underlayNeColor, underlaySeColor, -1, underlayRgb, false); + if (var4 == 0) { + var21 = new TilePaint(var11, var12, var13, var14, -1, var19, false); - for (var22 = z; var22 >= 0; --var22) { - if (this.tiles[var22][x][y] == null) { - this.tiles[var22][x][y] = new Tile(var22, x, y); + for (var22 = var1; var22 >= 0; --var22) { + if (this.tiles[var22][var2][var3] == null) { + this.tiles[var22][var2][var3] = new Tile(var22, var2, var3); } } - this.tiles[z][x][y].paint = var21; - } else if (shape != 1) { - TileModel var23 = new TileModel(shape, rotation, texture, x, y, heightSw, heightNw, heightNe, heightSe, underlaySwColor, underlayNwColor, underlayNeColor, underlaySeColor, overlaySwColor, overlayNwColor, overlayNeColor, overlaySeColor, underlayRgb, overlayRgb); + this.tiles[var1][var2][var3].paint = var21; + } else if (var4 != 1) { + TileModel var23 = new TileModel(var4, var5, var6, var2, var3, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20); - for (var22 = z; var22 >= 0; --var22) { - if (this.tiles[var22][x][y] == null) { - this.tiles[var22][x][y] = new Tile(var22, x, y); + for (var22 = var1; var22 >= 0; --var22) { + if (this.tiles[var22][var2][var3] == null) { + this.tiles[var22][var2][var3] = new Tile(var22, var2, var3); } } - this.tiles[z][x][y].model = var23; + this.tiles[var1][var2][var3].model = var23; } else { - var21 = new TilePaint(overlaySwColor, overlayNwColor, overlayNeColor, overlaySeColor, texture, overlayRgb, heightNw == heightSw && heightSw == heightNe && heightSe == heightSw); + var21 = new TilePaint(var15, var16, var17, var18, var6, var20, var8 == var7 && var7 == var9 && var10 == var7); - for (var22 = z; var22 >= 0; --var22) { - if (this.tiles[var22][x][y] == null) { - this.tiles[var22][x][y] = new Tile(var22, x, y); + for (var22 = var1; var22 >= 0; --var22) { + if (this.tiles[var22][var2][var3] == null) { + this.tiles[var22][var2][var3] = new Tile(var22, var2, var3); } } - this.tiles[z][x][y].paint = var21; + this.tiles[var1][var2][var3].paint = var21; } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(IIIILer;JI)V" + signature = "(IIIILep;JI)V" ) @Export("newFloorDecoration") public void newFloorDecoration(int var1, int var2, int var3, int var4, Entity var5, long var6, int var8) { @@ -378,9 +375,9 @@ public class Scene { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(IIIILer;JLer;Ler;)V" + signature = "(IIIILep;JLep;Lep;)V" ) @Export("newGroundItemPile") public void newGroundItemPile(int var1, int var2, int var3, int var4, Entity var5, long var6, Entity var8, Entity var9) { @@ -414,9 +411,9 @@ public class Scene { this.tiles[var1][var2][var3].tileItemPile = var10; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(IIIILer;Ler;IIJI)V" + signature = "(IIIILep;Lep;IIJI)V" ) @Export("newBoundaryObject") public void newBoundaryObject(int var1, int var2, int var3, int var4, Entity var5, Entity var6, int var7, int var8, long var9, int var11) { @@ -442,9 +439,9 @@ public class Scene { } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(IIIILer;Ler;IIIIJI)V" + signature = "(IIIILep;Lep;IIIIJI)V" ) @Export("newWallDecoration") public void newWallDecoration(int var1, int var2, int var3, int var4, Entity var5, Entity var6, int var7, int var8, int var9, int var10, long var11, int var13) { @@ -472,11 +469,11 @@ public class Scene { } } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(IIIIIILer;IJI)Z" + signature = "(IIIIIILep;IJI)Z" ) - public boolean method3056(int var1, int var2, int var3, int var4, int var5, int var6, Entity var7, int var8, long var9, int var11) { + public boolean method3213(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; } else { @@ -486,9 +483,9 @@ public class Scene { } } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(IIIIILer;IJZ)Z" + signature = "(IIIIILep;IJZ)Z" ) @Export("drawEntity") public boolean drawEntity(int var1, int var2, int var3, int var4, int var5, Entity var6, int var7, long var8, boolean var10) { @@ -525,18 +522,18 @@ public class Scene { } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(IIIIILer;IJIIII)Z" + signature = "(IIIIILep;IJIIII)Z" ) @Export("addNullableObject") public boolean addNullableObject(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); } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(IIIIIIIILer;IZJI)Z" + signature = "(IIIIIIIILep;IZJI)Z" ) @Export("newGameObject") boolean newGameObject(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, Entity var9, int var10, boolean var11, long var12, int var14) { @@ -608,7 +605,7 @@ public class Scene { return true; } - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("clearTempGameObjects") public void clearTempGameObjects() { for (int var1 = 0; var1 < this.tempGameObjectsCount; ++var1) { @@ -620,9 +617,9 @@ public class Scene { this.tempGameObjectsCount = 0; } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(Lej;)V" + signature = "(Lex;)V" ) @Export("removeGameObject") void removeGameObject(GameObject var1) { @@ -656,8 +653,8 @@ public class Scene { } - @ObfuscatedName("h") - public void method3127(int var1, int var2, int var3, int var4) { + @ObfuscatedName("r") + public void method3327(int var1, int var2, int var3, int var4) { Tile var5 = this.tiles[var1][var2][var3]; if (var5 != null) { WallDecoration var6 = var5.wallDecoration; @@ -668,7 +665,7 @@ public class Scene { } } - @ObfuscatedName("s") + @ObfuscatedName("e") @Export("removeBoundaryObject") public void removeBoundaryObject(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; @@ -677,7 +674,7 @@ public class Scene { } } - @ObfuscatedName("f") + @ObfuscatedName("s") @Export("removeWallDecoration") public void removeWallDecoration(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; @@ -686,14 +683,14 @@ public class Scene { } } - @ObfuscatedName("j") + @ObfuscatedName("b") @Export("removeGameObject") public void removeGameObject(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if (var4 != null) { for (int var5 = 0; var5 < var4.gameObjectsCount; ++var5) { GameObject var6 = var4.gameObjects[var5]; - if (WorldMapDecoration.method346(var6.tag) && var2 == var6.startX && var3 == var6.startY) { + if (class188.method3793(var6.tag) && var2 == var6.startX && var3 == var6.startY) { this.removeGameObject(var6); return; } @@ -702,7 +699,7 @@ public class Scene { } } - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("removeFloorDecoration") public void removeFloorDecoration(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; @@ -711,7 +708,7 @@ public class Scene { } } - @ObfuscatedName("l") + @ObfuscatedName("u") @Export("removeGroundItemPile") public void removeGroundItemPile(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; @@ -720,36 +717,36 @@ public class Scene { } } - @ObfuscatedName("k") + @ObfuscatedName("ad") @ObfuscatedSignature( - signature = "(III)Leo;" + signature = "(III)Let;" ) - public BoundaryObject method3068(int var1, int var2, int var3) { + public BoundaryObject method3225(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 == null ? null : var4.boundaryObject; } - @ObfuscatedName("ac") + @ObfuscatedName("ag") @ObfuscatedSignature( - signature = "(III)Leg;" + signature = "(III)Lei;" ) - public WallDecoration method3069(int var1, int var2, int var3) { + public WallDecoration method3339(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 == null ? null : var4.wallDecoration; } - @ObfuscatedName("aa") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(III)Lej;" + signature = "(III)Lex;" ) - public GameObject method3070(int var1, int var2, int var3) { + public GameObject method3227(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if (var4 == null) { return null; } else { for (int var5 = 0; var5 < var4.gameObjectsCount; ++var5) { GameObject var6 = var4.gameObjects[var5]; - if (WorldMapDecoration.method346(var6.tag) && var2 == var6.startX && var3 == var6.startY) { + if (class188.method3793(var6.tag) && var2 == var6.startX && var3 == var6.startY) { return var6; } } @@ -758,9 +755,9 @@ public class Scene { } } - @ObfuscatedName("ap") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(III)Ldj;" + signature = "(III)Ldx;" ) @Export("getFloorDecoration") public FloorDecoration getFloorDecoration(int var1, int var2, int var3) { @@ -768,7 +765,7 @@ public class Scene { return var4 != null && var4.floorDecoration != null ? var4.floorDecoration : null; } - @ObfuscatedName("ar") + @ObfuscatedName("am") @Export("getBoundaryObjectTag") public long getBoundaryObjectTag(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; @@ -791,7 +788,7 @@ public class Scene { } else { for (int var5 = 0; var5 < var4.gameObjectsCount; ++var5) { GameObject var6 = var4.gameObjects[var5]; - if (WorldMapDecoration.method346(var6.tag) && var2 == var6.startX && var3 == var6.startY) { + if (class188.method3793(var6.tag) && var2 == var6.startX && var3 == var6.startY) { return var6.tag; } } @@ -800,14 +797,14 @@ public class Scene { } } - @ObfuscatedName("as") + @ObfuscatedName("al") @Export("getFloorDecorationTag") public long getFloorDecorationTag(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 != null && var4.floorDecoration != null ? var4.floorDecoration.tag : 0L; } - @ObfuscatedName("ao") + @ObfuscatedName("ap") @Export("getObjectFlags") public int getObjectFlags(int var1, int var2, int var3, long var4) { Tile var6 = this.tiles[var1][var2][var3]; @@ -830,8 +827,8 @@ public class Scene { } } - @ObfuscatedName("al") - public void method3071(int var1, int var2, int var3) { + @ObfuscatedName("aj") + public void method3234(int var1, int var2, int var3) { for (int var4 = 0; var4 < this.planes; ++var4) { for (int var5 = 0; var5 < this.xSize; ++var5) { for (int var6 = 0; var6 < this.ySize; ++var6) { @@ -841,11 +838,11 @@ public class Scene { ModelData var10; if (var8 != null && var8.entity1 instanceof ModelData) { ModelData var9 = (ModelData)var8.entity1; - this.method3112(var9, var4, var5, var6, 1, 1); + this.method3236(var9, var4, var5, var6, 1, 1); if (var8.entity2 instanceof ModelData) { var10 = (ModelData)var8.entity2; - this.method3112(var10, var4, var5, var6, 1, 1); - ModelData.method2779(var9, var10, 0, 0, 0, false); + this.method3236(var10, var4, var5, var6, 1, 1); + ModelData.method2956(var9, var10, 0, 0, 0, false); var8.entity2 = var10.toModel(var10.ambient, var10.contrast, var1, var2, var3); } @@ -856,7 +853,7 @@ public class Scene { GameObject var14 = var7.gameObjects[var12]; if (var14 != null && var14.entity instanceof ModelData) { ModelData var11 = (ModelData)var14.entity; - this.method3112(var11, var4, var5, var6, var14.endX - var14.startX + 1, var14.endY - var14.startY + 1); + this.method3236(var11, var4, var5, var6, var14.endX - var14.startX + 1, var14.endY - var14.startY + 1); var14.entity = var11.toModel(var11.ambient, var11.contrast, var1, var2, var3); } } @@ -864,7 +861,7 @@ public class Scene { FloorDecoration var13 = var7.floorDecoration; if (var13 != null && var13.entity instanceof ModelData) { var10 = (ModelData)var13.entity; - this.method3078(var10, var4, var5, var6); + this.method3235(var10, var4, var5, var6); var13.entity = var10.toModel(var10.ambient, var10.contrast, var1, var2, var3); } } @@ -874,18 +871,18 @@ public class Scene { } - @ObfuscatedName("ad") + @ObfuscatedName("ae") @ObfuscatedSignature( - signature = "(Ldw;III)V" + signature = "(Ldu;III)V" ) - void method3078(ModelData var1, int var2, int var3, int var4) { + void method3235(ModelData var1, int var2, int var3, int var4) { Tile var5; ModelData var6; if (var3 < this.xSize) { var5 = this.tiles[var2][var3 + 1][var4]; if (var5 != null && var5.floorDecoration != null && var5.floorDecoration.entity instanceof ModelData) { var6 = (ModelData)var5.floorDecoration.entity; - ModelData.method2779(var1, var6, 128, 0, 0, true); + ModelData.method2956(var1, var6, 128, 0, 0, true); } } @@ -893,7 +890,7 @@ public class Scene { var5 = this.tiles[var2][var3][var4 + 1]; if (var5 != null && var5.floorDecoration != null && var5.floorDecoration.entity instanceof ModelData) { var6 = (ModelData)var5.floorDecoration.entity; - ModelData.method2779(var1, var6, 0, 0, 128, true); + ModelData.method2956(var1, var6, 0, 0, 128, true); } } @@ -901,7 +898,7 @@ public class Scene { var5 = this.tiles[var2][var3 + 1][var4 + 1]; if (var5 != null && var5.floorDecoration != null && var5.floorDecoration.entity instanceof ModelData) { var6 = (ModelData)var5.floorDecoration.entity; - ModelData.method2779(var1, var6, 128, 0, 128, true); + ModelData.method2956(var1, var6, 128, 0, 128, true); } } @@ -909,17 +906,17 @@ public class Scene { var5 = this.tiles[var2][var3 + 1][var4 - 1]; if (var5 != null && var5.floorDecoration != null && var5.floorDecoration.entity instanceof ModelData) { var6 = (ModelData)var5.floorDecoration.entity; - ModelData.method2779(var1, var6, 128, 0, -128, true); + ModelData.method2956(var1, var6, 128, 0, -128, true); } } } - @ObfuscatedName("an") + @ObfuscatedName("au") @ObfuscatedSignature( - signature = "(Ldw;IIIII)V" + signature = "(Ldu;IIIII)V" ) - void method3112(ModelData var1, int var2, int var3, int var4, int var5, int var6) { + void method3236(ModelData var1, int var2, int var3, int var4, int var5, int var6) { boolean var7 = true; int var8 = var3; int var9 = var3 + var5; @@ -940,12 +937,12 @@ public class Scene { ModelData var18; if (var17.entity1 instanceof ModelData) { var18 = (ModelData)var17.entity1; - ModelData.method2779(var1, var18, (1 - var5) * 64 + (var13 - var3) * 128, var16, (var14 - var4) * 128 + (1 - var6) * 64, var7); + ModelData.method2956(var1, var18, (1 - var5) * 64 + (var13 - var3) * 128, var16, (var14 - var4) * 128 + (1 - var6) * 64, var7); } if (var17.entity2 instanceof ModelData) { var18 = (ModelData)var17.entity2; - ModelData.method2779(var1, var18, (1 - var5) * 64 + (var13 - var3) * 128, var16, (var14 - var4) * 128 + (1 - var6) * 64, var7); + ModelData.method2956(var1, var18, (1 - var5) * 64 + (var13 - var3) * 128, var16, (var14 - var4) * 128 + (1 - var6) * 64, var7); } } @@ -955,7 +952,7 @@ public class Scene { ModelData var20 = (ModelData)var19.entity; int var21 = var19.endX - var19.startX + 1; int var22 = var19.endY - var19.startY + 1; - ModelData.method2779(var1, var20, (var21 - var5) * 64 + (var19.startX - var3) * 128, var16, (var19.startY - var4) * 128 + (var22 - var6) * 64, var7); + ModelData.method2956(var1, var20, (var21 - var5) * 64 + (var19.startX - var3) * 128, var16, (var19.startY - var4) * 128 + (var22 - var6) * 64, var7); } } } @@ -971,63 +968,63 @@ public class Scene { } - @ObfuscatedName("ai") + @ObfuscatedName("ah") @Export("drawTileMinimap") - public void drawTileMinimap(int[] pixels, int index, int width, int plane, int x, int y) { - Tile tile = this.tiles[plane][x][y]; - if (tile != null) { - TilePaint tilePaint = tile.paint; - int shape; - if (tilePaint != null) { - int rgb = tilePaint.rgb; - if (rgb != 0) { - for (shape = 0; shape < 4; ++shape) { - pixels[index] = rgb; - pixels[index + 1] = rgb; - pixels[index + 2] = rgb; - pixels[index + 3] = rgb; - index += width; + public void drawTileMinimap(int[] var1, int var2, int var3, int var4, int var5, int var6) { + Tile var7 = this.tiles[var4][var5][var6]; + if (var7 != null) { + TilePaint var8 = var7.paint; + int var10; + if (var8 != null) { + int var9 = var8.rgb; + if (var9 != 0) { + for (var10 = 0; var10 < 4; ++var10) { + var1[var2] = var9; + var1[var2 + 1] = var9; + var1[var2 + 2] = var9; + var1[var2 + 3] = var9; + var2 += var3; } } } else { - TileModel tileModel = tile.model; - if (tileModel != null) { - shape = tileModel.shape; - int rotation = tileModel.rotation; - int underlayRgb = tileModel.underlayRgb; - int overlayRgb = tileModel.overlayRgb; - int[] shapes = this.tileShape2D[shape]; - int[] rotations = this.tileRotation2D[rotation]; + TileModel var18 = var7.model; + if (var18 != null) { + var10 = var18.shape; + int var11 = var18.rotation; + int var12 = var18.underlayRgb; + int var13 = var18.overlayRgb; + int[] var14 = this.tileShape2D[var10]; + int[] var15 = this.tileRotation2D[var11]; int var16 = 0; int var17; - if (underlayRgb != 0) { + if (var12 != 0) { for (var17 = 0; var17 < 4; ++var17) { - pixels[index] = shapes[rotations[var16++]] == 0 ? underlayRgb : overlayRgb; - pixels[index + 1] = shapes[rotations[var16++]] == 0 ? underlayRgb : overlayRgb; - pixels[index + 2] = shapes[rotations[var16++]] == 0 ? underlayRgb : overlayRgb; - pixels[index + 3] = shapes[rotations[var16++]] == 0 ? underlayRgb : overlayRgb; - index += width; + var1[var2] = var14[var15[var16++]] == 0 ? var12 : var13; + var1[var2 + 1] = var14[var15[var16++]] == 0 ? var12 : var13; + var1[var2 + 2] = var14[var15[var16++]] == 0 ? var12 : var13; + var1[var2 + 3] = var14[var15[var16++]] == 0 ? var12 : var13; + var2 += var3; } } else { for (var17 = 0; var17 < 4; ++var17) { - if (shapes[rotations[var16++]] != 0) { - pixels[index] = overlayRgb; + if (var14[var15[var16++]] != 0) { + var1[var2] = var13; } - if (shapes[rotations[var16++]] != 0) { - pixels[index + 1] = overlayRgb; + if (var14[var15[var16++]] != 0) { + var1[var2 + 1] = var13; } - if (shapes[rotations[var16++]] != 0) { - pixels[index + 2] = overlayRgb; + if (var14[var15[var16++]] != 0) { + var1[var2 + 2] = var13; } - if (shapes[rotations[var16++]] != 0) { - pixels[index + 3] = overlayRgb; + if (var14[var15[var16++]] != 0) { + var1[var2 + 3] = var13; } - index += width; + var2 += var3; } } @@ -1036,27 +1033,27 @@ public class Scene { } } - @ObfuscatedName("am") + @ObfuscatedName("ay") @Export("menuOpen") - public void menuOpen(int plane, int screenX, int screenY, boolean walking) { - if (!method3085() || walking) { + public void menuOpen(int var1, int var2, int var3, boolean var4) { + if (!method3252() || var4) { checkClick = true; - viewportWalking = walking; - Scene_selectedPlane = plane; - Scene_selectedScreenX = screenX; - Scene_selectedScreenY = screenY; + viewportWalking = var4; + Scene_selectedPlane = var1; + Scene_selectedScreenX = var2; + Scene_selectedScreenY = var3; Scene_selectedX = -1; Scene_selectedY = -1; } } - @ObfuscatedName("ae") + @ObfuscatedName("az") @Export("setViewportWalking") public void setViewportWalking() { viewportWalking = true; } - @ObfuscatedName("ag") + @ObfuscatedName("ac") @Export("draw") public void draw(int var1, int var2, int var3, int var4, int var5, int var6) { if (var1 < 0) { @@ -1123,7 +1120,11 @@ public class Scene { for (var10 = Scene_cameraYTileMin; var10 < Scene_cameraYTileMax; ++var10) { Tile var11 = var8[var9][var10]; if (var11 != null) { - if (var11.minPlane <= var6 && (visibleTiles[var9 - Scene_cameraXTile + 25][var10 - Scene_cameraYTile + 25] || this.tileHeights[var7][var9][var10] - var2 >= 2000)) { + if (var11.minPlane > var6 || !visibleTiles[var9 - Scene_cameraXTile + 25][var10 - Scene_cameraYTile + 25] && this.tileHeights[var7][var9][var10] - var2 < 2000) { + var11.drawPrimary = false; + var11.drawSecondary = false; + var11.drawGameObjectEdges = 0; + } else { var11.drawPrimary = true; var11.drawSecondary = true; if (var11.gameObjectsCount > 0) { @@ -1133,10 +1134,6 @@ public class Scene { } ++tileUpdateCount; - } else { - var11.drawPrimary = false; - var11.drawSecondary = false; - var11.drawGameObjectEdges = 0; } } } @@ -1253,9 +1250,9 @@ public class Scene { checkClick = false; } - @ObfuscatedName("aj") + @ObfuscatedName("at") @ObfuscatedSignature( - signature = "(Ldl;Z)V" + signature = "(Ldh;Z)V" ) @Export("drawTile") void drawTile(Tile var1, boolean var2) { @@ -1349,10 +1346,10 @@ public class Scene { if (var3.linkedBelowTile != null) { var9 = var3.linkedBelowTile; if (var9.paint != null) { - if (!this.method3051(0, var4, var5)) { + if (!this.method3251(0, var4, var5)) { this.drawTileUnderlay(var9.paint, 0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var4, var5); } - } else if (var9.model != null && !this.method3051(0, var4, var5)) { + } else if (var9.model != null && !this.method3251(0, var4, var5)) { this.drawTileOverlay(var9.model, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var4, var5); } @@ -1371,13 +1368,13 @@ public class Scene { var20 = false; if (var3.paint != null) { - if (!this.method3051(var7, var4, var5)) { + if (!this.method3251(var7, var4, var5)) { var20 = true; if (var3.paint.neColor != 12345678 || checkClick && var6 <= Scene_selectedPlane) { this.drawTileUnderlay(var3.paint, var7, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var4, var5); } } - } else if (var3.model != null && !this.method3051(var7, var4, var5)) { + } else if (var3.model != null && !this.method3251(var7, var4, var5)) { var20 = true; this.drawTileOverlay(var3.model, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var4, var5); } @@ -1399,43 +1396,43 @@ public class Scene { var21 += 6; } - var11 = field1833[var21]; - var3.field1629 = field1769[var21]; + var11 = field1824[var21]; + var3.field1637 = field1826[var21]; } if (var31 != null) { - if ((var31.orientationA & field1816[var21]) != 0) { + if ((var31.orientationA & field1829[var21]) != 0) { if (var31.orientationA == 16) { var3.drawGameObjectEdges = 3; - var3.field1610 = field1818[var21]; - var3.field1624 = 3 - var3.field1610; + var3.field1638 = field1780[var21]; + var3.field1639 = 3 - var3.field1638; } else if (var31.orientationA == 32) { var3.drawGameObjectEdges = 6; - var3.field1610 = field1815[var21]; - var3.field1624 = 6 - var3.field1610; + var3.field1638 = field1828[var21]; + var3.field1639 = 6 - var3.field1638; } else if (var31.orientationA == 64) { var3.drawGameObjectEdges = 12; - var3.field1610 = field1814[var21]; - var3.field1624 = 12 - var3.field1610; + var3.field1638 = field1836[var21]; + var3.field1639 = 12 - var3.field1638; } else { var3.drawGameObjectEdges = 9; - var3.field1610 = field1821[var21]; - var3.field1624 = 9 - var3.field1610; + var3.field1638 = field1830[var21]; + var3.field1639 = 9 - var3.field1638; } } else { var3.drawGameObjectEdges = 0; } - if ((var31.orientationA & var11) != 0 && !this.method3094(var7, var4, var5, var31.orientationA)) { + if ((var31.orientationA & var11) != 0 && !this.method3272(var7, var4, var5, var31.orientationA)) { var31.entity1.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var31.x * 4096 - Scene_cameraX, var31.tileHeight - Scene_cameraY, var31.y * 4096 - Scene_cameraZ, var31.tag); } - if ((var31.orientationB & var11) != 0 && !this.method3094(var7, var4, var5, var31.orientationB)) { + if ((var31.orientationB & var11) != 0 && !this.method3272(var7, var4, var5, var31.orientationB)) { var31.entity2.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var31.x * 4096 - Scene_cameraX, var31.tileHeight - Scene_cameraY, var31.y * 4096 - Scene_cameraZ, var31.tag); } } - if (var13 != null && !this.method3132(var7, var4, var5, var13.entity1.height)) { + if (var13 != null && !this.method3244(var7, var4, var5, var13.entity1.height)) { if ((var13.orientation & var11) != 0) { var13.entity1.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var13.xOffset + (var13.x * 4096 - Scene_cameraX), var13.tileHeight - Scene_cameraY, var13.yOffset + (var13.y * 4096 - Scene_cameraZ), var13.tag); } else if (var13.orientation == 256) { @@ -1523,7 +1520,7 @@ public class Scene { var20 = true; for (var21 = 0; var21 < var3.gameObjectsCount; ++var21) { - if (var3.gameObjects[var21].lastDrawn != Scene_drawnCount && (var3.gameObjectEdgeMasks[var21] & var3.drawGameObjectEdges) == var3.field1610) { + if (var3.gameObjects[var21].lastDrawn != Scene_drawnCount && (var3.gameObjectEdgeMasks[var21] & var3.drawGameObjectEdges) == var3.field1638) { var20 = false; break; } @@ -1531,7 +1528,7 @@ public class Scene { if (var20) { var10 = var3.boundaryObject; - if (!this.method3094(var7, var4, var5, var10.orientationA)) { + if (!this.method3272(var7, var4, var5, var10.orientationA)) { var10.entity1.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var10.x * 4096 - Scene_cameraX, var10.tileHeight - Scene_cameraY, var10.y * 4096 - Scene_cameraZ, var10.tag); } @@ -1578,7 +1575,7 @@ public class Scene { var16 += 2; } - if ((var16 & var36.drawGameObjectEdges) == var3.field1624) { + if ((var16 & var36.drawGameObjectEdges) == var3.field1639) { var3.drawGameObjects = true; continue label563; } @@ -1596,9 +1593,9 @@ public class Scene { var15 = Scene_cameraYTile - var12.startY; var16 = var12.endY - Scene_cameraYTile; if (var16 > var15) { - var12.field1914 = var24 + var16; + var12.field1912 = var24 + var16; } else { - var12.field1914 = var24 + var15; + var12.field1912 = var24 + var15; } } } @@ -1610,10 +1607,10 @@ public class Scene { for (var24 = 0; var24 < var21; ++var24) { GameObject var35 = gameObjects[var24]; if (var35.lastDrawn != Scene_drawnCount) { - if (var35.field1914 > var11) { - var11 = var35.field1914; + if (var35.field1912 > var11) { + var11 = var35.field1912; var25 = var24; - } else if (var11 == var35.field1914) { + } else if (var11 == var35.field1912) { var15 = var35.centerX - Scene_cameraX; var16 = var35.centerY - Scene_cameraZ; var17 = gameObjects[var25].centerX - Scene_cameraX; @@ -1631,7 +1628,7 @@ public class Scene { GameObject var33 = gameObjects[var25]; var33.lastDrawn = Scene_drawnCount; - if (!this.method3096(var7, var33.startX, var33.endX, var33.startY, var33.endY, var33.entity.height)) { + if (!this.method3240(var7, var33.startX, var33.endX, var33.startY, var33.endY, var33.entity.height)) { var33.entity.draw(var33.orientation, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var33.centerX - Scene_cameraX, var33.height - Scene_cameraY, var33.centerY - Scene_cameraZ, var33.tag); } @@ -1703,10 +1700,10 @@ public class Scene { } } - if (var3.field1629 != 0) { + if (var3.field1637 != 0) { WallDecoration var29 = var3.wallDecoration; - if (var29 != null && !this.method3132(var7, var4, var5, var29.entity1.height)) { - if ((var29.orientation & var3.field1629) != 0) { + if (var29 != null && !this.method3244(var7, var4, var5, var29.entity1.height)) { + if ((var29.orientation & var3.field1637) != 0) { var29.entity1.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var29.xOffset + (var29.x * 4096 - Scene_cameraX), var29.tileHeight - Scene_cameraY, var29.yOffset + (var29.y * 4096 - Scene_cameraZ), var29.tag); } else if (var29.orientation == 256) { var11 = var29.x * 4096 - Scene_cameraX; @@ -1735,11 +1732,11 @@ public class Scene { BoundaryObject var27 = var3.boundaryObject; if (var27 != null) { - if ((var27.orientationB & var3.field1629) != 0 && !this.method3094(var7, var4, var5, var27.orientationB)) { + if ((var27.orientationB & var3.field1637) != 0 && !this.method3272(var7, var4, var5, var27.orientationB)) { var27.entity2.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var27.x * 4096 - Scene_cameraX, var27.tileHeight - Scene_cameraY, var27.y * 4096 - Scene_cameraZ, var27.tag); } - if ((var27.orientationA & var3.field1629) != 0 && !this.method3094(var7, var4, var5, var27.orientationA)) { + if ((var27.orientationA & var3.field1637) != 0 && !this.method3272(var7, var4, var5, var27.orientationA)) { var27.entity1.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var27.x * 4096 - Scene_cameraX, var27.tileHeight - Scene_cameraY, var27.y * 4096 - Scene_cameraZ, var27.tag); } } @@ -1783,9 +1780,9 @@ public class Scene { } } - @ObfuscatedName("ay") + @ObfuscatedName("as") @ObfuscatedSignature( - signature = "(Lef;IIIIIII)V" + signature = "(Leg;IIIIIII)V" ) @Export("drawTileUnderlay") void drawTileUnderlay(TilePaint var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { @@ -1839,9 +1836,9 @@ public class Scene { Rasterizer3D.Rasterizer3D_alpha = 0; int var30; if ((var26 - var28) * (var25 - var29) - (var27 - var29) * (var24 - var28) > 0) { - Rasterizer3D.field1733 = false; + Rasterizer3D.field1745 = false; if (var26 < 0 || var28 < 0 || var24 < 0 || var26 > Rasterizer3D.Rasterizer3D_clipWidth || var28 > Rasterizer3D.Rasterizer3D_clipWidth || var24 > Rasterizer3D.Rasterizer3D_clipWidth) { - Rasterizer3D.field1733 = true; + Rasterizer3D.field1745 = true; } if (checkClick && containsBounds(Scene_selectedScreenX, Scene_selectedScreenY, var27, var29, var25, var26, var28, var24)) { @@ -1851,7 +1848,7 @@ public class Scene { if (var1.texture == -1) { if (var1.neColor != 12345678) { - Rasterizer3D.method2973(var27, var29, var25, var26, var28, var24, var1.neColor, var1.nwColor, var1.seColor); + Rasterizer3D.method3132(var27, var29, var25, var26, var28, var24, var1.neColor, var1.nwColor, var1.seColor); } } else if (!Scene_isLowDetail) { if (var1.isFlat) { @@ -1861,14 +1858,14 @@ public class Scene { } } else { var30 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var1.texture); - Rasterizer3D.method2973(var27, var29, var25, var26, var28, var24, method3090(var30, var1.neColor), method3090(var30, var1.nwColor), method3090(var30, var1.seColor)); + Rasterizer3D.method3132(var27, var29, var25, var26, var28, var24, method3357(var30, var1.neColor), method3357(var30, var1.nwColor), method3357(var30, var1.seColor)); } } if ((var22 - var24) * (var29 - var25) - (var23 - var25) * (var28 - var24) > 0) { - Rasterizer3D.field1733 = false; + Rasterizer3D.field1745 = false; if (var22 < 0 || var24 < 0 || var28 < 0 || var22 > Rasterizer3D.Rasterizer3D_clipWidth || var24 > Rasterizer3D.Rasterizer3D_clipWidth || var28 > Rasterizer3D.Rasterizer3D_clipWidth) { - Rasterizer3D.field1733 = true; + Rasterizer3D.field1745 = true; } if (checkClick && containsBounds(Scene_selectedScreenX, Scene_selectedScreenY, var23, var25, var29, var22, var24, var28)) { @@ -1878,13 +1875,13 @@ public class Scene { if (var1.texture == -1) { if (var1.swColor != 12345678) { - Rasterizer3D.method2973(var23, var25, var29, var22, var24, var28, var1.swColor, var1.seColor, var1.nwColor); + Rasterizer3D.method3132(var23, var25, var29, var22, var24, var28, var1.swColor, var1.seColor, var1.nwColor); } } else if (!Scene_isLowDetail) { Rasterizer3D.drawTexturedTile(var23, var25, var29, var22, var24, var28, var1.swColor, var1.seColor, var1.nwColor, var10, var14, var9, var17, var18, var21, var12, var11, var15, var1.texture); } else { var30 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var1.texture); - Rasterizer3D.method2973(var23, var25, var29, var22, var24, var28, method3090(var30, var1.swColor), method3090(var30, var1.seColor), method3090(var30, var1.nwColor)); + Rasterizer3D.method3132(var23, var25, var29, var22, var24, var28, method3357(var30, var1.swColor), method3357(var30, var1.seColor), method3357(var30, var1.nwColor)); } } @@ -1894,9 +1891,9 @@ public class Scene { } } - @ObfuscatedName("au") + @ObfuscatedName("ba") @ObfuscatedSignature( - signature = "(Ldd;IIIIII)V" + signature = "(Ldk;IIIIII)V" ) @Export("drawTileOverlay") void drawTileOverlay(TileModel var1, int var2, int var3, int var4, int var5, int var6, int var7) { @@ -1921,13 +1918,13 @@ public class Scene { } if (var1.triangleTextureId != null) { - TileModel.field1570[var9] = var10; - TileModel.field1571[var9] = var13; + TileModel.field1562[var9] = var10; + TileModel.field1580[var9] = var13; TileModel.field1573[var9] = var12; } - TileModel.field1553[var9] = var10 * Rasterizer3D.Rasterizer3D_zoom / var12 + Rasterizer3D.Rasterizer3D_clipMidX; - TileModel.field1569[var9] = var13 * Rasterizer3D.Rasterizer3D_zoom / var12 + Rasterizer3D.Rasterizer3D_clipMidY; + TileModel.field1577[var9] = var10 * Rasterizer3D.Rasterizer3D_zoom / var12 + Rasterizer3D.Rasterizer3D_clipMidX; + TileModel.field1578[var9] = var13 * Rasterizer3D.Rasterizer3D_zoom / var12 + Rasterizer3D.Rasterizer3D_clipMidY; } Rasterizer3D.Rasterizer3D_alpha = 0; @@ -1937,16 +1934,16 @@ public class Scene { var10 = var1.faceX[var9]; var11 = var1.faceY[var9]; var12 = var1.faceZ[var9]; - var13 = TileModel.field1553[var10]; - int var14 = TileModel.field1553[var11]; - int var15 = TileModel.field1553[var12]; - int var16 = TileModel.field1569[var10]; - int var17 = TileModel.field1569[var11]; - int var18 = TileModel.field1569[var12]; + var13 = TileModel.field1577[var10]; + int var14 = TileModel.field1577[var11]; + int var15 = TileModel.field1577[var12]; + int var16 = TileModel.field1578[var10]; + int var17 = TileModel.field1578[var11]; + int var18 = TileModel.field1578[var12]; if ((var13 - var14) * (var18 - var17) - (var16 - var17) * (var15 - var14) > 0) { - Rasterizer3D.field1733 = false; + Rasterizer3D.field1745 = false; if (var13 < 0 || var14 < 0 || var15 < 0 || var13 > Rasterizer3D.Rasterizer3D_clipWidth || var14 > Rasterizer3D.Rasterizer3D_clipWidth || var15 > Rasterizer3D.Rasterizer3D_clipWidth) { - Rasterizer3D.field1733 = true; + Rasterizer3D.field1745 = true; } if (checkClick && containsBounds(Scene_selectedScreenX, Scene_selectedScreenY, var16, var17, var18, var13, var14, var15)) { @@ -1957,23 +1954,23 @@ public class Scene { if (var1.triangleTextureId != null && var1.triangleTextureId[var9] != -1) { if (!Scene_isLowDetail) { if (var1.isFlat) { - Rasterizer3D.drawTexturedTile(var16, var17, var18, var13, var14, var15, var1.triangleColorA[var9], var1.triangleColorB[var9], var1.triangleColorC[var9], TileModel.field1570[0], TileModel.field1570[1], TileModel.field1570[3], TileModel.field1571[0], TileModel.field1571[1], TileModel.field1571[3], TileModel.field1573[0], TileModel.field1573[1], TileModel.field1573[3], var1.triangleTextureId[var9]); + Rasterizer3D.drawTexturedTile(var16, var17, var18, var13, var14, var15, var1.triangleColorA[var9], var1.triangleColorB[var9], var1.triangleColorC[var9], TileModel.field1562[0], TileModel.field1562[1], TileModel.field1562[3], TileModel.field1580[0], TileModel.field1580[1], TileModel.field1580[3], TileModel.field1573[0], TileModel.field1573[1], TileModel.field1573[3], var1.triangleTextureId[var9]); } else { - Rasterizer3D.drawTexturedTile(var16, var17, var18, var13, var14, var15, var1.triangleColorA[var9], var1.triangleColorB[var9], var1.triangleColorC[var9], TileModel.field1570[var10], TileModel.field1570[var11], TileModel.field1570[var12], TileModel.field1571[var10], TileModel.field1571[var11], TileModel.field1571[var12], TileModel.field1573[var10], TileModel.field1573[var11], TileModel.field1573[var12], var1.triangleTextureId[var9]); + Rasterizer3D.drawTexturedTile(var16, var17, var18, var13, var14, var15, var1.triangleColorA[var9], var1.triangleColorB[var9], var1.triangleColorC[var9], TileModel.field1562[var10], TileModel.field1562[var11], TileModel.field1562[var12], TileModel.field1580[var10], TileModel.field1580[var11], TileModel.field1580[var12], TileModel.field1573[var10], TileModel.field1573[var11], TileModel.field1573[var12], var1.triangleTextureId[var9]); } } else { int var19 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var1.triangleTextureId[var9]); - Rasterizer3D.method2973(var16, var17, var18, var13, var14, var15, method3090(var19, var1.triangleColorA[var9]), method3090(var19, var1.triangleColorB[var9]), method3090(var19, var1.triangleColorC[var9])); + Rasterizer3D.method3132(var16, var17, var18, var13, var14, var15, method3357(var19, var1.triangleColorA[var9]), method3357(var19, var1.triangleColorB[var9]), method3357(var19, var1.triangleColorC[var9])); } } else if (var1.triangleColorA[var9] != 12345678) { - Rasterizer3D.method2973(var16, var17, var18, var13, var14, var15, var1.triangleColorA[var9], var1.triangleColorB[var9], var1.triangleColorC[var9]); + Rasterizer3D.method3132(var16, var17, var18, var13, var14, var15, var1.triangleColorA[var9], var1.triangleColorB[var9], var1.triangleColorC[var9]); } } } } - @ObfuscatedName("bx") + @ObfuscatedName("bd") @Export("occlude") void occlude() { int var1 = Scene_planeOccluderCounts[Scene_plane]; @@ -2012,20 +2009,20 @@ public class Scene { if (var13) { var9 = Scene_cameraX - var4.minX; if (var9 > 32) { - var4.field1882 = 1; + var4.field1869 = 1; } else { if (var9 >= -32) { continue; } - var4.field1882 = 2; + var4.field1869 = 2; var9 = -var9; } - var4.field1885 = (var4.minZ - Scene_cameraZ << 8) / var9; - var4.field1886 = (var4.maxZ - Scene_cameraZ << 8) / var9; - var4.field1879 = (var4.minY - Scene_cameraY << 8) / var9; - var4.field1887 = (var4.maxY - Scene_cameraY << 8) / var9; + var4.field1883 = (var4.minZ - Scene_cameraZ << 8) / var9; + var4.field1884 = (var4.maxZ - Scene_cameraZ << 8) / var9; + var4.field1882 = (var4.minY - Scene_cameraY << 8) / var9; + var4.field1885 = (var4.maxY - Scene_cameraY << 8) / var9; Scene_currentOccluders[Scene_currentOccludersCount++] = var4; } } @@ -2054,20 +2051,20 @@ public class Scene { if (var13) { var9 = Scene_cameraZ - var4.minZ; if (var9 > 32) { - var4.field1882 = 3; + var4.field1869 = 3; } else { if (var9 >= -32) { continue; } - var4.field1882 = 4; + var4.field1869 = 4; var9 = -var9; } - var4.field1884 = (var4.minX - Scene_cameraX << 8) / var9; - var4.field1871 = (var4.maxX - Scene_cameraX << 8) / var9; - var4.field1879 = (var4.minY - Scene_cameraY << 8) / var9; - var4.field1887 = (var4.maxY - Scene_cameraY << 8) / var9; + var4.field1887 = (var4.minX - Scene_cameraX << 8) / var9; + var4.field1880 = (var4.maxX - Scene_cameraX << 8) / var9; + var4.field1882 = (var4.minY - Scene_cameraY << 8) / var9; + var4.field1885 = (var4.maxY - Scene_cameraY << 8) / var9; Scene_currentOccluders[Scene_currentOccludersCount++] = var4; } } @@ -2097,22 +2094,22 @@ public class Scene { boolean var10 = false; - label144: + label146: for (int var11 = var8; var11 <= var9; ++var11) { for (int var12 = var6; var12 <= var7; ++var12) { if (visibleTiles[var11][var12]) { var10 = true; - break label144; + break label146; } } } if (var10) { - var4.field1882 = 5; - var4.field1884 = (var4.minX - Scene_cameraX << 8) / var5; - var4.field1871 = (var4.maxX - Scene_cameraX << 8) / var5; - var4.field1885 = (var4.minZ - Scene_cameraZ << 8) / var5; - var4.field1886 = (var4.maxZ - Scene_cameraZ << 8) / var5; + var4.field1869 = 5; + var4.field1887 = (var4.minX - Scene_cameraX << 8) / var5; + var4.field1880 = (var4.maxX - Scene_cameraX << 8) / var5; + var4.field1883 = (var4.minZ - Scene_cameraZ << 8) / var5; + var4.field1884 = (var4.maxZ - Scene_cameraZ << 8) / var5; Scene_currentOccluders[Scene_currentOccludersCount++] = var4; } } @@ -2122,9 +2119,9 @@ public class Scene { } - @ObfuscatedName("bh") - boolean method3051(int var1, int var2, int var3) { - int var4 = this.field1778[var1][var2][var3]; + @ObfuscatedName("bx") + boolean method3251(int var1, int var2, int var3) { + int var4 = this.field1809[var1][var2][var3]; if (var4 == -Scene_drawnCount) { return false; } else if (var4 == Scene_drawnCount) { @@ -2132,19 +2129,19 @@ public class Scene { } else { int var5 = var2 << 7; int var6 = var3 << 7; - if (this.method3097(var5 + 1, this.tileHeights[var1][var2][var3], var6 + 1) && this.method3097(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3], var6 + 1) && this.method3097(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3 + 1], var6 + 128 - 1) && this.method3097(var5 + 1, this.tileHeights[var1][var2][var3 + 1], var6 + 128 - 1)) { - this.field1778[var1][var2][var3] = Scene_drawnCount; + if (this.method3237(var5 + 1, this.tileHeights[var1][var2][var3], var6 + 1) && this.method3237(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3], var6 + 1) && this.method3237(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3 + 1], var6 + 128 - 1) && this.method3237(var5 + 1, this.tileHeights[var1][var2][var3 + 1], var6 + 128 - 1)) { + this.field1809[var1][var2][var3] = Scene_drawnCount; return true; } else { - this.field1778[var1][var2][var3] = -Scene_drawnCount; + this.field1809[var1][var2][var3] = -Scene_drawnCount; return false; } } } - @ObfuscatedName("bd") - boolean method3094(int var1, int var2, int var3, int var4) { - if (!this.method3051(var1, var2, var3)) { + @ObfuscatedName("bl") + boolean method3272(int var1, int var2, int var3, int var4) { + if (!this.method3251(var1, var2, var3)) { return false; } else { int var5 = var2 << 7; @@ -2156,30 +2153,30 @@ public class Scene { if (var4 < 16) { if (var4 == 1) { if (var5 > Scene_cameraX) { - if (!this.method3097(var5, var7, var6)) { + if (!this.method3237(var5, var7, var6)) { return false; } - if (!this.method3097(var5, var7, var6 + 128)) { + if (!this.method3237(var5, var7, var6 + 128)) { return false; } } if (var1 > 0) { - if (!this.method3097(var5, var8, var6)) { + if (!this.method3237(var5, var8, var6)) { return false; } - if (!this.method3097(var5, var8, var6 + 128)) { + if (!this.method3237(var5, var8, var6 + 128)) { return false; } } - if (!this.method3097(var5, var9, var6)) { + if (!this.method3237(var5, var9, var6)) { return false; } - if (!this.method3097(var5, var9, var6 + 128)) { + if (!this.method3237(var5, var9, var6 + 128)) { return false; } @@ -2188,30 +2185,30 @@ public class Scene { if (var4 == 2) { if (var6 < Scene_cameraZ) { - if (!this.method3097(var5, var7, var6 + 128)) { + if (!this.method3237(var5, var7, var6 + 128)) { return false; } - if (!this.method3097(var5 + 128, var7, var6 + 128)) { + if (!this.method3237(var5 + 128, var7, var6 + 128)) { return false; } } if (var1 > 0) { - if (!this.method3097(var5, var8, var6 + 128)) { + if (!this.method3237(var5, var8, var6 + 128)) { return false; } - if (!this.method3097(var5 + 128, var8, var6 + 128)) { + if (!this.method3237(var5 + 128, var8, var6 + 128)) { return false; } } - if (!this.method3097(var5, var9, var6 + 128)) { + if (!this.method3237(var5, var9, var6 + 128)) { return false; } - if (!this.method3097(var5 + 128, var9, var6 + 128)) { + if (!this.method3237(var5 + 128, var9, var6 + 128)) { return false; } @@ -2220,30 +2217,30 @@ public class Scene { if (var4 == 4) { if (var5 < Scene_cameraX) { - if (!this.method3097(var5 + 128, var7, var6)) { + if (!this.method3237(var5 + 128, var7, var6)) { return false; } - if (!this.method3097(var5 + 128, var7, var6 + 128)) { + if (!this.method3237(var5 + 128, var7, var6 + 128)) { return false; } } if (var1 > 0) { - if (!this.method3097(var5 + 128, var8, var6)) { + if (!this.method3237(var5 + 128, var8, var6)) { return false; } - if (!this.method3097(var5 + 128, var8, var6 + 128)) { + if (!this.method3237(var5 + 128, var8, var6 + 128)) { return false; } } - if (!this.method3097(var5 + 128, var9, var6)) { + if (!this.method3237(var5 + 128, var9, var6)) { return false; } - if (!this.method3097(var5 + 128, var9, var6 + 128)) { + if (!this.method3237(var5 + 128, var9, var6 + 128)) { return false; } @@ -2252,30 +2249,30 @@ public class Scene { if (var4 == 8) { if (var6 > Scene_cameraZ) { - if (!this.method3097(var5, var7, var6)) { + if (!this.method3237(var5, var7, var6)) { return false; } - if (!this.method3097(var5 + 128, var7, var6)) { + if (!this.method3237(var5 + 128, var7, var6)) { return false; } } if (var1 > 0) { - if (!this.method3097(var5, var8, var6)) { + if (!this.method3237(var5, var8, var6)) { return false; } - if (!this.method3097(var5 + 128, var8, var6)) { + if (!this.method3237(var5 + 128, var8, var6)) { return false; } } - if (!this.method3097(var5, var9, var6)) { + if (!this.method3237(var5, var9, var6)) { return false; } - if (!this.method3097(var5 + 128, var9, var6)) { + if (!this.method3237(var5 + 128, var9, var6)) { return false; } @@ -2283,49 +2280,49 @@ public class Scene { } } - if (!this.method3097(var5 + 64, var10, var6 + 64)) { + if (!this.method3237(var5 + 64, var10, var6 + 64)) { return false; } else if (var4 == 16) { - return this.method3097(var5, var9, var6 + 128); + return this.method3237(var5, var9, var6 + 128); } else if (var4 == 32) { - return this.method3097(var5 + 128, var9, var6 + 128); + return this.method3237(var5 + 128, var9, var6 + 128); } else if (var4 == 64) { - return this.method3097(var5 + 128, var9, var6); + return this.method3237(var5 + 128, var9, var6); } else if (var4 == 128) { - return this.method3097(var5, var9, var6); + return this.method3237(var5, var9, var6); } else { return true; } } } - @ObfuscatedName("bm") - boolean method3132(int var1, int var2, int var3, int var4) { - if (!this.method3051(var1, var2, var3)) { + @ObfuscatedName("bh") + boolean method3244(int var1, int var2, int var3, int var4) { + if (!this.method3251(var1, var2, var3)) { return false; } else { int var5 = var2 << 7; int var6 = var3 << 7; - return this.method3097(var5 + 1, this.tileHeights[var1][var2][var3] - var4, var6 + 1) && this.method3097(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3] - var4, var6 + 1) && this.method3097(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3 + 1] - var4, var6 + 128 - 1) && this.method3097(var5 + 1, this.tileHeights[var1][var2][var3 + 1] - var4, var6 + 128 - 1); + return this.method3237(var5 + 1, this.tileHeights[var1][var2][var3] - var4, var6 + 1) && this.method3237(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3] - var4, var6 + 1) && this.method3237(var5 + 128 - 1, this.tileHeights[var1][var2 + 1][var3 + 1] - var4, var6 + 128 - 1) && this.method3237(var5 + 1, this.tileHeights[var1][var2][var3 + 1] - var4, var6 + 128 - 1); } } - @ObfuscatedName("bv") - boolean method3096(int var1, int var2, int var3, int var4, int var5, int var6) { + @ObfuscatedName("bu") + boolean method3240(int var1, int var2, int var3, int var4, int var5, int var6) { int var7; int var8; if (var3 == var2 && var5 == var4) { - if (!this.method3051(var1, var2, var4)) { + if (!this.method3251(var1, var2, var4)) { return false; } else { var7 = var2 << 7; var8 = var4 << 7; - return this.method3097(var7 + 1, this.tileHeights[var1][var2][var4] - var6, var8 + 1) && this.method3097(var7 + 128 - 1, this.tileHeights[var1][var2 + 1][var4] - var6, var8 + 1) && this.method3097(var7 + 128 - 1, this.tileHeights[var1][var2 + 1][var4 + 1] - var6, var8 + 128 - 1) && this.method3097(var7 + 1, this.tileHeights[var1][var2][var4 + 1] - var6, var8 + 128 - 1); + return this.method3237(var7 + 1, this.tileHeights[var1][var2][var4] - var6, var8 + 1) && this.method3237(var7 + 128 - 1, this.tileHeights[var1][var2 + 1][var4] - var6, var8 + 1) && this.method3237(var7 + 128 - 1, this.tileHeights[var1][var2 + 1][var4 + 1] - var6, var8 + 128 - 1) && this.method3237(var7 + 1, this.tileHeights[var1][var2][var4 + 1] - var6, var8 + 128 - 1); } } else { for (var7 = var2; var7 <= var3; ++var7) { for (var8 = var4; var8 <= var5; ++var8) { - if (this.field1778[var1][var7][var8] == -Scene_drawnCount) { + if (this.field1809[var1][var7][var8] == -Scene_drawnCount) { return false; } } @@ -2334,17 +2331,17 @@ public class Scene { var7 = (var2 << 7) + 1; var8 = (var4 << 7) + 2; int var9 = this.tileHeights[var1][var2][var4] - var6; - if (!this.method3097(var7, var9, var8)) { + if (!this.method3237(var7, var9, var8)) { return false; } else { int var10 = (var3 << 7) - 1; - if (!this.method3097(var10, var9, var8)) { + if (!this.method3237(var10, var9, var8)) { return false; } else { int var11 = (var5 << 7) - 1; - if (!this.method3097(var7, var9, var11)) { + if (!this.method3237(var7, var9, var11)) { return false; - } else if (!this.method3097(var10, var9, var11)) { + } else if (!this.method3237(var10, var9, var11)) { return false; } else { return true; @@ -2354,8 +2351,8 @@ public class Scene { } } - @ObfuscatedName("bj") - boolean method3097(int var1, int var2, int var3) { + @ObfuscatedName("br") + boolean method3237(int var1, int var2, int var3) { for (int var4 = 0; var4 < Scene_currentOccludersCount; ++var4) { Occluder var5 = Scene_currentOccluders[var4]; int var6; @@ -2363,57 +2360,57 @@ public class Scene { int var8; int var9; int var10; - if (var5.field1882 == 1) { + if (var5.field1869 == 1) { var6 = var5.minX - var1; if (var6 > 0) { - var7 = (var6 * var5.field1885 >> 8) + var5.minZ; - var8 = (var6 * var5.field1886 >> 8) + var5.maxZ; - var9 = (var6 * var5.field1879 >> 8) + var5.minY; - var10 = (var6 * var5.field1887 >> 8) + var5.maxY; + var7 = (var6 * var5.field1883 >> 8) + var5.minZ; + var8 = (var6 * var5.field1884 >> 8) + var5.maxZ; + var9 = (var6 * var5.field1882 >> 8) + var5.minY; + var10 = (var6 * var5.field1885 >> 8) + var5.maxY; if (var3 >= var7 && var3 <= var8 && var2 >= var9 && var2 <= var10) { return true; } } - } else if (var5.field1882 == 2) { + } else if (var5.field1869 == 2) { var6 = var1 - var5.minX; if (var6 > 0) { - var7 = (var6 * var5.field1885 >> 8) + var5.minZ; - var8 = (var6 * var5.field1886 >> 8) + var5.maxZ; - var9 = (var6 * var5.field1879 >> 8) + var5.minY; - var10 = (var6 * var5.field1887 >> 8) + var5.maxY; + var7 = (var6 * var5.field1883 >> 8) + var5.minZ; + var8 = (var6 * var5.field1884 >> 8) + var5.maxZ; + var9 = (var6 * var5.field1882 >> 8) + var5.minY; + var10 = (var6 * var5.field1885 >> 8) + var5.maxY; if (var3 >= var7 && var3 <= var8 && var2 >= var9 && var2 <= var10) { return true; } } - } else if (var5.field1882 == 3) { + } else if (var5.field1869 == 3) { var6 = var5.minZ - var3; if (var6 > 0) { - var7 = (var6 * var5.field1884 >> 8) + var5.minX; - var8 = (var6 * var5.field1871 >> 8) + var5.maxX; - var9 = (var6 * var5.field1879 >> 8) + var5.minY; - var10 = (var6 * var5.field1887 >> 8) + var5.maxY; + var7 = (var6 * var5.field1887 >> 8) + var5.minX; + var8 = (var6 * var5.field1880 >> 8) + var5.maxX; + var9 = (var6 * var5.field1882 >> 8) + var5.minY; + var10 = (var6 * var5.field1885 >> 8) + var5.maxY; if (var1 >= var7 && var1 <= var8 && var2 >= var9 && var2 <= var10) { return true; } } - } else if (var5.field1882 == 4) { + } else if (var5.field1869 == 4) { var6 = var3 - var5.minZ; if (var6 > 0) { - var7 = (var6 * var5.field1884 >> 8) + var5.minX; - var8 = (var6 * var5.field1871 >> 8) + var5.maxX; - var9 = (var6 * var5.field1879 >> 8) + var5.minY; - var10 = (var6 * var5.field1887 >> 8) + var5.maxY; + var7 = (var6 * var5.field1887 >> 8) + var5.minX; + var8 = (var6 * var5.field1880 >> 8) + var5.maxX; + var9 = (var6 * var5.field1882 >> 8) + var5.minY; + var10 = (var6 * var5.field1885 >> 8) + var5.maxY; if (var1 >= var7 && var1 <= var8 && var2 >= var9 && var2 <= var10) { return true; } } - } else if (var5.field1882 == 5) { + } else if (var5.field1869 == 5) { var6 = var2 - var5.minY; if (var6 > 0) { - var7 = (var6 * var5.field1884 >> 8) + var5.minX; - var8 = (var6 * var5.field1871 >> 8) + var5.maxX; - var9 = (var6 * var5.field1885 >> 8) + var5.minZ; - var10 = (var6 * var5.field1886 >> 8) + var5.maxZ; + var7 = (var6 * var5.field1887 >> 8) + var5.minX; + var8 = (var6 * var5.field1880 >> 8) + var5.maxX; + var9 = (var6 * var5.field1883 >> 8) + var5.minZ; + var10 = (var6 * var5.field1884 >> 8) + var5.maxZ; if (var1 >= var7 && var1 <= var8 && var3 >= var9 && var3 <= var10) { return true; } @@ -2424,7 +2421,7 @@ public class Scene { return false; } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("Scene_addOccluder") public static void Scene_addOccluder(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { Occluder var8 = new Occluder(); @@ -2442,7 +2439,7 @@ public class Scene { Scene_planeOccluders[var0][Scene_planeOccluderCounts[var0]++] = var8; } - @ObfuscatedName("ak") + @ObfuscatedName("an") @Export("Scene_buildVisiblityMap") public static void Scene_buildVisiblityMap(int[] var0, int var1, int var2, int var3, int var4) { Scene_viewportXMin = 0; @@ -2475,7 +2472,7 @@ public class Scene { boolean var14 = false; for (int var15 = -var1; var15 <= var2; var15 += 128) { - if (method3053(var12, var0[var8] + var15, var13)) { + if (method3239(var12, var0[var8] + var15, var13)) { var14 = true; break; } @@ -2526,8 +2523,8 @@ public class Scene { } - @ObfuscatedName("aq") - static boolean method3053(int var0, int var1, int var2) { + @ObfuscatedName("af") + static boolean method3239(int var0, int var1, int var2) { int var3 = var0 * Scene_cameraYawCosine + var2 * Scene_cameraYawSine >> 16; int var4 = var2 * Scene_cameraYawCosine - var0 * Scene_cameraYawSine >> 16; int var5 = var4 * Scene_cameraPitchCosine + Scene_cameraPitchSine * var1 >> 16; @@ -2541,19 +2538,19 @@ public class Scene { } } - @ObfuscatedName("av") - public static boolean method3085() { + @ObfuscatedName("ao") + public static boolean method3252() { return viewportWalking && Scene_selectedX != -1; } - @ObfuscatedName("ah") - public static void method3086() { + @ObfuscatedName("ai") + public static void method3281() { Scene_selectedX = -1; viewportWalking = false; } - @ObfuscatedName("af") - static final int method3090(int var0, int var1) { + @ObfuscatedName("bg") + static final int method3357(int var0, int var1) { var1 = (var0 & 127) * var1 >> 7; if (var1 < 2) { var1 = 2; @@ -2564,7 +2561,7 @@ public class Scene { return (var0 & 65408) + var1; } - @ObfuscatedName("at") + @ObfuscatedName("bc") @Export("containsBounds") static boolean containsBounds(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { if (var1 < var2 && var1 < var3 && var1 < var4) { diff --git a/runescape-client/src/main/java/Script.java b/runescape-client/src/main/java/Script.java index 4fe551e5ef..40c2aa6117 100644 --- a/runescape-client/src/main/java/Script.java +++ b/runescape-client/src/main/java/Script.java @@ -4,57 +4,51 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cu") +@ObfuscatedName("cj") @Implements("Script") public class Script extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("Script_cached") static EvictingDualNodeHashTable Script_cached; - @ObfuscatedName("dh") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive15") - static Archive archive15; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("opcodes") int[] opcodes; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("intOperands") int[] intOperands; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("stringOperands") String[] stringOperands; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1534316869 + intValue = -435727749 ) @Export("localIntCount") int localIntCount; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -473600855 + intValue = -291180187 ) @Export("localStringCount") int localStringCount; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -171399011 + intValue = 970489761 ) @Export("intArgumentCount") int intArgumentCount; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -1063868631 + intValue = 1827947623 ) @Export("stringArgumentCount") int stringArgumentCount; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "[Llb;" + signature = "[Llr;" ) @Export("switches") IterableNodeHashTable[] switches; @@ -66,13 +60,153 @@ public class Script extends DualNode { Script() { } - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(II)[Llb;", - garbageValue = "1885034841" + signature = "(IB)[Llr;", + garbageValue = "-39" ) @Export("newIterableNodeHashTable") IterableNodeHashTable[] newIterableNodeHashTable(int var1) { return new IterableNodeHashTable[var1]; } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;Lhq;I)V", + garbageValue = "-1167924124" + ) + public static void method2373(AbstractArchive var0, AbstractArchive var1) { + NPCDefinition.NpcDefinition_archive = var0; + NPCDefinition.NpcDefinition_modelArchive = var1; + } + + @ObfuscatedName("gn") + @ObfuscatedSignature( + signature = "(S)V", + garbageValue = "3316" + ) + static final void method2383() { + int var0 = class14.field88 * 128 + 64; + int var1 = class42.field360 * 128 + 64; + int var2 = GraphicsObject.getTileHeight(var0, var1, Player.Scene_plane) - WorldMapLabel.field231; + if (UrlRequester.cameraX < var0) { + UrlRequester.cameraX = (var0 - UrlRequester.cameraX) * Interpreter.field1068 / 1000 + UrlRequester.cameraX + WorldMapAreaData.field323; + if (UrlRequester.cameraX > var0) { + UrlRequester.cameraX = var0; + } + } + + if (UrlRequester.cameraX > var0) { + UrlRequester.cameraX -= Interpreter.field1068 * (UrlRequester.cameraX - var0) / 1000 + WorldMapAreaData.field323; + if (UrlRequester.cameraX < var0) { + UrlRequester.cameraX = var0; + } + } + + if (class16.cameraY < var2) { + class16.cameraY = (var2 - class16.cameraY) * Interpreter.field1068 / 1000 + class16.cameraY + WorldMapAreaData.field323; + if (class16.cameraY > var2) { + class16.cameraY = var2; + } + } + + if (class16.cameraY > var2) { + class16.cameraY -= Interpreter.field1068 * (class16.cameraY - var2) / 1000 + WorldMapAreaData.field323; + if (class16.cameraY < var2) { + class16.cameraY = var2; + } + } + + if (GrandExchangeOfferAgeComparator.cameraZ < var1) { + GrandExchangeOfferAgeComparator.cameraZ = (var1 - GrandExchangeOfferAgeComparator.cameraZ) * Interpreter.field1068 / 1000 + GrandExchangeOfferAgeComparator.cameraZ + WorldMapAreaData.field323; + if (GrandExchangeOfferAgeComparator.cameraZ > var1) { + GrandExchangeOfferAgeComparator.cameraZ = var1; + } + } + + if (GrandExchangeOfferAgeComparator.cameraZ > var1) { + GrandExchangeOfferAgeComparator.cameraZ -= Interpreter.field1068 * (GrandExchangeOfferAgeComparator.cameraZ - var1) / 1000 + WorldMapAreaData.field323; + if (GrandExchangeOfferAgeComparator.cameraZ < var1) { + GrandExchangeOfferAgeComparator.cameraZ = var1; + } + } + + var0 = AbstractUserComparator.field3583 * 16384 + 64; + var1 = class49.field401 * 128 + 64; + var2 = GraphicsObject.getTileHeight(var0, var1, Player.Scene_plane) - ViewportMouse.field1713; + int var3 = var0 - UrlRequester.cameraX; + int var4 = var2 - class16.cameraY; + int var5 = var1 - GrandExchangeOfferAgeComparator.cameraZ; + int var6 = (int)Math.sqrt((double)(var5 * var5 + var3 * var3)); + int var7 = (int)(Math.atan2((double)var4, (double)var6) * 325.949D) & 2047; + int var8 = (int)(Math.atan2((double)var3, (double)var5) * -325.949D) & 2047; + if (var7 < 128) { + var7 = 128; + } + + if (var7 > 383) { + var7 = 383; + } + + if (class247.cameraPitch < var7) { + class247.cameraPitch = (var7 - class247.cameraPitch) * SecureRandomCallable.field510 / 1000 + class247.cameraPitch + Clock.field2036; + if (class247.cameraPitch > var7) { + class247.cameraPitch = var7; + } + } + + if (class247.cameraPitch > var7) { + class247.cameraPitch -= SecureRandomCallable.field510 * (class247.cameraPitch - var7) / 1000 + Clock.field2036; + if (class247.cameraPitch < var7) { + class247.cameraPitch = var7; + } + } + + int var9 = var8 - WorldMapData_1.cameraYaw; + if (var9 > 1024) { + var9 -= 2048; + } + + if (var9 < -1024) { + var9 += 2048; + } + + if (var9 > 0) { + WorldMapData_1.cameraYaw = var9 * SecureRandomCallable.field510 / 1000 + WorldMapData_1.cameraYaw + Clock.field2036; + WorldMapData_1.cameraYaw &= 2047; + } + + if (var9 < 0) { + WorldMapData_1.cameraYaw -= Clock.field2036 + -var9 * SecureRandomCallable.field510 / 1000; + WorldMapData_1.cameraYaw &= 2047; + } + + int var10 = var8 - WorldMapData_1.cameraYaw; + if (var10 > 1024) { + var10 -= 2048; + } + + if (var10 < -1024) { + var10 += 2048; + } + + if (var10 < 0 && var9 > 0 || var10 > 0 && var9 < 0) { + WorldMapData_1.cameraYaw = var8; + } + + } + + @ObfuscatedName("kh") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-1862071000" + ) + static void method2384(int var0) { + StudioGame.tempMenuAction = new MenuAction(); + StudioGame.tempMenuAction.argument1 = Client.menuArguments1[var0]; + StudioGame.tempMenuAction.argument2 = Client.menuArguments2[var0]; + StudioGame.tempMenuAction.opcode = Client.menuOpcodes[var0]; + StudioGame.tempMenuAction.argument0 = Client.menuIdentifiers[var0]; + StudioGame.tempMenuAction.action = Client.menuActions[var0]; + } } diff --git a/runescape-client/src/main/java/ScriptEvent.java b/runescape-client/src/main/java/ScriptEvent.java index a1b05bebca..e88e8ba8e7 100644 --- a/runescape-client/src/main/java/ScriptEvent.java +++ b/runescape-client/src/main/java/ScriptEvent.java @@ -3,74 +3,81 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ba") +@ObfuscatedName("bi") @Implements("ScriptEvent") public class ScriptEvent extends Node { - @ObfuscatedName("rn") - @ObfuscatedGetter( - intValue = -1797586275 + @ObfuscatedName("sc") + @ObfuscatedSignature( + signature = "Lbw;" ) - static int field570; - @ObfuscatedName("z") + @Export("clientPreferences") + static ClientPreferences clientPreferences; + @ObfuscatedName("fz") + @ObfuscatedGetter( + intValue = -1497740127 + ) + static int field563; + @ObfuscatedName("a") @Export("args") Object[] args; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("isMouseInputEvent") boolean isMouseInputEvent; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhi;" ) @Export("widget") Widget widget; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -536253001 + intValue = -2022022571 ) @Export("mouseX") int mouseX; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 339811595 + intValue = 2109741703 ) @Export("mouseY") int mouseY; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 523814267 + intValue = -668858451 ) @Export("opIndex") int opIndex; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhi;" ) @Export("dragTarget") Widget dragTarget; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 890448357 + intValue = -649087669 ) @Export("keyTyped") int keyTyped; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -463436489 + intValue = -1510622969 ) @Export("keyPressed") int keyPressed; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("targetName") String targetName; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -1373208137 + intValue = -1448697707 ) - int field568; - @ObfuscatedName("b") + int field550; + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 1041391975 + intValue = 251797665 ) @Export("type") int type; @@ -79,755 +86,307 @@ public class ScriptEvent extends Node { this.type = 76; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([Ljava/lang/Object;I)V", - garbageValue = "345377680" + signature = "([Ljava/lang/Object;B)V", + garbageValue = "0" ) @Export("setArgs") public void setArgs(Object[] var1) { this.args = var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "2089299641" + garbageValue = "-1079010061" ) @Export("setType") public void setType(int var1) { this.type = var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;Lli;I)Ljava/lang/String;", - garbageValue = "254330677" + signature = "(IIILix;IB)V", + garbageValue = "24" ) - public static String method1198(CharSequence var0, LoginType var1) { - if (var0 == null) { + static void method1274(int var0, int var1, int var2, ObjectDefinition var3, int var4) { + ObjectSound var5 = new ObjectSound(); + var5.plane = var0; + var5.x = var1 * 128; + var5.y = var2 * 16384; + int var6 = var3.sizeX; + int var7 = var3.sizeY; + if (var4 == 1 || var4 == 3) { + var6 = var3.sizeY; + var7 = var3.sizeX; + } + + var5.field1060 = (var6 + var1) * 16384; + var5.field1053 = (var7 + var2) * 16384; + var5.soundEffectId = var3.ambientSoundId; + var5.field1052 = var3.int4 * 128; + var5.field1057 = var3.int5; + var5.field1058 = var3.int6; + var5.soundEffectIds = var3.soundEffectIds; + if (var3.transforms != null) { + var5.obj = var3; + var5.set(); + } + + ObjectSound.objectSounds.addFirst(var5); + if (var5.soundEffectIds != null) { + var5.field1054 = var5.field1057 + (int)(Math.random() * (double)(var5.field1058 - var5.field1057)); + } + + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(I)Ljava/lang/String;", + garbageValue = "-1199782761" + ) + static String method1277() { + String var0; + if (clientPreferences.hideUsername) { + String var2 = Login.Login_username; + int var4 = var2.length(); + char[] var5 = new char[var4]; + + for (int var6 = 0; var6 < var4; ++var6) { + var5[var6] = '*'; + } + + String var3 = new String(var5); + var0 = var3; + } else { + var0 = Login.Login_username; + } + + return var0; + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(CLgw;B)I", + garbageValue = "86" + ) + @Export("lowercaseChar") + static int lowercaseChar(char var0, Language var1) { + int var2 = var0 << 4; + if (Character.isUpperCase(var0) || Character.isTitleCase(var0)) { + var0 = Character.toLowerCase(var0); + var2 = (var0 << 4) + 1; + } + + if (var0 == 241 && var1 == Language.Language_ES) { + var2 = 1762; + } + + return var2; + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(II)I", + garbageValue = "-1588093923" + ) + public static int method1272(int var0) { + return UserComparator8.Entity_unpackID(ViewportMouse.ViewportMouse_entityTags[var0]); + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(IIIIIZB)Llx;", + garbageValue = "1" + ) + @Export("getItemSprite") + public static final Sprite getItemSprite(int var0, int var1, int var2, int var3, int var4, boolean var5) { + if (var1 == -1) { + var4 = 0; + } else if (var4 == 2 && var1 != 1) { + var4 = 1; + } + + long var6 = ((long)var3 << 42) + ((long)var4 << 40) + ((long)var1 << 16) + (long)var0 + ((long)var2 << 38); + Sprite var8; + if (!var5) { + var8 = (Sprite)ItemDefinition.ItemDefinition_cachedSprites.get(var6); + if (var8 != null) { + return var8; + } + } + + ItemDefinition var9 = class222.ItemDefinition_get(var0); + if (var1 > 1 && var9.countobj != null) { + int var10 = -1; + + for (int var11 = 0; var11 < 10; ++var11) { + if (var1 >= var9.countco[var11] && var9.countco[var11] != 0) { + var10 = var9.countobj[var11]; + } + } + + if (var10 != -1) { + var9 = class222.ItemDefinition_get(var10); + } + } + + Model var21 = var9.getModel(1); + if (var21 == null) { return null; } else { - int var2 = 0; - - int var3; - for (var3 = var0.length(); var2 < var3 && BoundaryObject.method3226(var0.charAt(var2)); ++var2) { - } - - while (var3 > var2 && BoundaryObject.method3226(var0.charAt(var3 - 1))) { - --var3; - } - - int var4 = var3 - var2; - if (var4 >= 1 && var4 <= BufferedSink.method5794(var1)) { - StringBuilder var5 = new StringBuilder(var4); - - for (int var6 = var2; var6 < var3; ++var6) { - char var7 = var0.charAt(var6); - boolean var8; - if (Character.isISOControl(var7)) { - var8 = false; - } else if (AbstractArchive.isAlphaNumeric(var7)) { - var8 = true; - } else { - char[] var12 = class338.field4036; - int var10 = 0; - - label73: - while (true) { - char var11; - if (var10 >= var12.length) { - var12 = class338.field4037; - - for (var10 = 0; var10 < var12.length; ++var10) { - var11 = var12[var10]; - if (var7 == var11) { - var8 = true; - break label73; - } - } - - var8 = false; - break; - } - - var11 = var12[var10]; - if (var11 == var7) { - var8 = true; - break; - } - - ++var10; - } - } - - if (var8) { - char var9 = class32.method577(var7); - if (var9 != 0) { - var5.append(var9); - } - } - } - - if (var5.length() == 0) { + Sprite var22 = null; + if (var9.noteTemplate != -1) { + var22 = getItemSprite(var9.note, 10, 1, 0, 0, true); + if (var22 == null) { return null; - } else { - return var5.toString(); } + } else if (var9.notedId != -1) { + var22 = getItemSprite(var9.unnotedId, var1, var2, var3, 0, false); + if (var22 == null) { + return null; + } + } else if (var9.placeholderTemplate != -1) { + var22 = getItemSprite(var9.placeholder, var1, 0, 0, 0, false); + if (var22 == null) { + return null; + } + } + + int[] var12 = Rasterizer2D.Rasterizer2D_pixels; + int var13 = Rasterizer2D.Rasterizer2D_width; + int var14 = Rasterizer2D.Rasterizer2D_height; + int[] var15 = new int[4]; + Rasterizer2D.Rasterizer2D_getClipArray(var15); + var8 = new Sprite(36, 32); + Rasterizer2D.Rasterizer2D_replace(var8.pixels, 36, 32); + Rasterizer2D.Rasterizer2D_clear(); + Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); + Rasterizer3D.method3131(16, 16); + Rasterizer3D.field1739 = false; + if (var9.placeholderTemplate != -1) { + var22.drawTransBgAt(0, 0); + } + + int var16 = var9.zoom2d; + if (var5) { + var16 = (int)(1.5D * (double)var16); + } else if (var2 == 2) { + var16 = (int)(1.04D * (double)var16); + } + + int var17 = var16 * Rasterizer3D.Rasterizer3D_sine[var9.xan2d] >> 16; + int var18 = var16 * Rasterizer3D.Rasterizer3D_cosine[var9.xan2d] >> 16; + var21.calculateBoundsCylinder(); + var21.method3044(0, var9.yan2d, var9.zan2d, var9.xan2d, var9.offsetX2d, var21.height / 2 + var17 + var9.offsetY2d, var18 + var9.offsetY2d); + if (var9.notedId != -1) { + var22.drawTransBgAt(0, 0); + } + + if (var2 >= 1) { + var8.outline(1); + } + + if (var2 >= 2) { + var8.outline(16777215); + } + + if (var3 != 0) { + var8.shadow(var3); + } + + Rasterizer2D.Rasterizer2D_replace(var8.pixels, 36, 32); + if (var9.noteTemplate != -1) { + var22.drawTransBgAt(0, 0); + } + + if (var4 == 1 || var4 == 2 && var9.isStackable == 1) { + Font var19 = class30.ItemDefinition_fontPlain11; + String var20; + if (var1 < 100000) { + var20 = "" + var1 + ""; + } else if (var1 < 10000000) { + var20 = "" + var1 / 1000 + "K" + ""; + } else { + var20 = "" + var1 / 1000000 + "M" + ""; + } + + var19.draw(var20, 0, 9, 16776960, 1); + } + + if (!var5) { + ItemDefinition.ItemDefinition_cachedSprites.put(var8, var6); + } + + Rasterizer2D.Rasterizer2D_replace(var12, var13, var14); + Rasterizer2D.Rasterizer2D_setClipArray(var15); + Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); + Rasterizer3D.field1739 = true; + return var8; + } + } + + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "(ILcj;ZB)I", + garbageValue = "-66" + ) + static int method1263(int var0, Script var1, boolean var2) { + Widget var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + if (var0 == ScriptOpcodes.CC_GETTARGETMASK) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator5.method3551(class195.getWidgetClickMask(var3)); + return 1; + } else if (var0 != ScriptOpcodes.CC_GETOP) { + if (var0 == ScriptOpcodes.CC_GETOPBASE) { + if (var3.dataText == null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.dataText; + } + + return 1; } else { - return null; + return 2; } + } else { + int var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + --var4; + if (var3.actions != null && var4 < var3.actions.length && var3.actions[var4] != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.actions[var4]; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; } } - @ObfuscatedName("hb") + @ObfuscatedName("jb") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-2065771075" + signature = "(IIIIIIIII)V", + garbageValue = "-1558725091" ) - static void method1205() { - Client.menuOptionsCount = 0; - Client.isMenuOpen = false; - } - - @ObfuscatedName("ib") - @ObfuscatedSignature( - signature = "([Lho;IIIIIIIIB)V", - garbageValue = "50" - ) - @Export("drawInterface") - static final void drawInterface(Widget[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); - Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); - - for (int var9 = 0; var9 < var0.length; ++var9) { - Widget var10 = var0[var9]; - if (var10 != null && (var10.parentId == var1 || var1 == -1412584499 && var10 == Client.clickedWidget)) { - int var11; - if (var8 == -1) { - Client.rootWidgetXs[Client.rootWidgetCount] = var10.x + var6; - Client.rootWidgetYs[Client.rootWidgetCount] = var7 + var10.y; - Client.rootWidgetWidths[Client.rootWidgetCount] = var10.width; - Client.rootWidgetHeights[Client.rootWidgetCount] = var10.height; - var11 = ++Client.rootWidgetCount - 1; - } else { - var11 = var8; - } - - var10.rootIndex = var11; - var10.cycle = Client.cycle; - if (!var10.isIf3 || !WorldMapSectionType.isComponentHidden(var10)) { - if (var10.contentType > 0) { - WorldMapIcon_0.method221(var10); - } - - int var12 = var10.x + var6; - int var13 = var7 + var10.y; - int var14 = var10.transparencyTop; - int var15; - int var16; - if (var10 == Client.clickedWidget) { - if (var1 != -1412584499 && !var10.isScrollBar) { - GrandExchangeOffer.field61 = var0; - class227.field3061 = var6; - Occluder.field1889 = var7; - continue; - } - - if (Client.isDraggingWidget && Client.field814) { - var15 = MouseHandler.MouseHandler_x; - var16 = MouseHandler.MouseHandler_y; - var15 -= Client.widgetClickX; - var16 -= Client.widgetClickY; - if (var15 < Client.field695) { - var15 = Client.field695; - } - - if (var15 + var10.width > Client.field695 + Client.clickedWidgetParent.width) { - var15 = Client.field695 + Client.clickedWidgetParent.width - var10.width; - } - - if (var16 < Client.field816) { - var16 = Client.field816; - } - - if (var16 + var10.height > Client.field816 + Client.clickedWidgetParent.height) { - var16 = Client.field816 + Client.clickedWidgetParent.height - var10.height; - } - - var12 = var15; - var13 = var16; - } - - if (!var10.isScrollBar) { - var14 = 128; - } - } - - int var17; - int var18; - int var19; - int var20; - int var21; - int var22; - if (var10.type == 2) { - var15 = var2; - var16 = var3; - var17 = var4; - var18 = var5; - } else if (var10.type == 9) { - var19 = var12; - var20 = var13; - var21 = var12 + var10.width; - var22 = var13 + var10.height; - if (var21 < var12) { - var19 = var21; - var21 = var12; - } - - if (var22 < var13) { - var20 = var22; - var22 = var13; - } - - ++var21; - ++var22; - var15 = var19 > var2 ? var19 : var2; - var16 = var20 > var3 ? var20 : var3; - var17 = var21 < var4 ? var21 : var4; - var18 = var22 < var5 ? var22 : var5; - } else { - var19 = var12 + var10.width; - var20 = var13 + var10.height; - var15 = var12 > var2 ? var12 : var2; - var16 = var13 > var3 ? var13 : var3; - var17 = var19 < var4 ? var19 : var4; - var18 = var20 < var5 ? var20 : var5; - } - - if (!var10.isIf3 || var15 < var17 && var16 < var18) { - if (var10.contentType != 0) { - if (var10.contentType == 1336) { - if (Client.displayFps) { - var13 += 15; - GraphicsDefaults.fontPlain12.drawRightAligned("Fps:" + GameShell.fps, var12 + var10.width, var13, 16776960, -1); - var13 += 15; - Runtime var41 = Runtime.getRuntime(); - var20 = (int)((var41.totalMemory() - var41.freeMemory()) / 1024L); - var21 = 16776960; - if (var20 > 327680 && !Client.isLowDetail) { - var21 = 16711680; - } - - GraphicsDefaults.fontPlain12.drawRightAligned("Mem:" + var20 + "k", var12 + var10.width, var13, var21, -1); - var13 += 15; - } - continue; - } - - if (var10.contentType == 1337) { - Client.viewportX = var12; - Client.viewportY = var13; - Friend.drawEntities(var12, var13, var10.width, var10.height); - Client.field841[var10.rootIndex] = true; - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); - continue; - } - - if (var10.contentType == 1338) { - ClientPreferences.drawMinimap(var10, var12, var13, var11); - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); - continue; - } - - if (var10.contentType == 1339) { - SoundSystem.drawCompass(var10, var12, var13, var11); - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); - continue; - } - - if (var10.contentType == 1400) { - Tiles.worldMap.draw(var12, var13, var10.width, var10.height, Client.cycle); - } - - if (var10.contentType == 1401) { - Tiles.worldMap.drawOverview(var12, var13, var10.width, var10.height); - } - - if (var10.contentType == 1402) { - BufferedSink.loginScreenRunesAnimation.draw(var12, Client.cycle); - } - } - - if (var10.type == 0) { - if (!var10.isIf3 && WorldMapSectionType.isComponentHidden(var10) && var10 != NetSocket.mousedOverWidgetIf1) { - continue; - } - - if (!var10.isIf3) { - if (var10.scrollY > var10.scrollHeight - var10.height) { - var10.scrollY = var10.scrollHeight - var10.height; - } - - if (var10.scrollY < 0) { - var10.scrollY = 0; - } - } - - drawInterface(var0, var10.id, var15, var16, var17, var18, var12 - var10.scrollX, var13 - var10.scrollY, var11); - if (var10.children != null) { - drawInterface(var10.children, var10.id, var15, var16, var17, var18, var12 - var10.scrollX, var13 - var10.scrollY, var11); - } - - InterfaceParent var30 = (InterfaceParent)Client.interfaceParents.get((long)var10.id); - if (var30 != null) { - ItemContainer.drawWidgets(var30.group, var15, var16, var17, var18, var12, var13, var11); - } - - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); - Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); - } - - if (Client.isResizable || Client.field847[var11] || Client.gameDrawingMode > 1) { - if (var10.type == 0 && !var10.isIf3 && var10.scrollHeight > var10.height) { - GameShell.drawScrollBar(var12 + var10.width, var13, var10.scrollY, var10.height, var10.scrollHeight); - } - - if (var10.type != 1) { - int var23; - int var24; - int var25; - int var26; - if (var10.type == 2) { - var19 = 0; - - for (var20 = 0; var20 < var10.rawHeight; ++var20) { - for (var21 = 0; var21 < var10.rawWidth; ++var21) { - var22 = var12 + var21 * (var10.paddingX + 32); - var23 = var13 + var20 * (var10.paddingY + 32); - if (var19 < 20) { - var22 += var10.inventoryXOffsets[var19]; - var23 += var10.inventoryYOffsets[var19]; - } - - if (var10.itemIds[var19] <= 0) { - if (var10.inventorySprites != null && var19 < 20) { - Sprite var43 = var10.getInventorySprite(var19); - if (var43 != null) { - var43.drawTransBgAt(var22, var23); - } else if (Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - } - } else { - boolean var37 = false; - boolean var38 = false; - var26 = var10.itemIds[var19] - 1; - if (var22 + 32 > var2 && var22 < var4 && var23 + 32 > var3 && var23 < var5 || var10 == Frames.dragInventoryWidget && var19 == Client.dragItemSlotSource) { - Sprite var27; - if (Client.isItemSelected == 1 && var19 == DevicePcmPlayerProvider.selectedItemSlot && var10.id == class2.selectedItemWidget) { - var27 = GrandExchangeOfferWorldComparator.getItemSprite(var26, var10.itemQuantities[var19], 2, 0, 2, false); - } else { - var27 = GrandExchangeOfferWorldComparator.getItemSprite(var26, var10.itemQuantities[var19], 1, 3153952, 2, false); - } - - if (var27 != null) { - if (var10 == Frames.dragInventoryWidget && var19 == Client.dragItemSlotSource) { - var24 = MouseHandler.MouseHandler_x - Client.field745; - var25 = MouseHandler.MouseHandler_y - Client.field746; - if (var24 < 5 && var24 > -5) { - var24 = 0; - } - - if (var25 < 5 && var25 > -5) { - var25 = 0; - } - - if (Client.itemDragDuration < 5) { - var24 = 0; - var25 = 0; - } - - var27.drawTransAt(var22 + var24, var23 + var25, 128); - if (var1 != -1) { - Widget var28 = var0[var1 & 65535]; - int var29; - if (var23 + var25 < Rasterizer2D.Rasterizer2D_yClipStart && var28.scrollY > 0) { - var29 = (Rasterizer2D.Rasterizer2D_yClipStart - var23 - var25) * Client.field698 / 3; - if (var29 > Client.field698 * 10) { - var29 = Client.field698 * 10; - } - - if (var29 > var28.scrollY) { - var29 = var28.scrollY; - } - - var28.scrollY -= var29; - Client.field746 += var29; - WorldMapSectionType.invalidateWidget(var28); - } - - if (var23 + var25 + 32 > Rasterizer2D.Rasterizer2D_yClipEnd && var28.scrollY < var28.scrollHeight - var28.height) { - var29 = (var25 + var23 + 32 - Rasterizer2D.Rasterizer2D_yClipEnd) * Client.field698 / 3; - if (var29 > Client.field698 * 10) { - var29 = Client.field698 * 10; - } - - if (var29 > var28.scrollHeight - var28.height - var28.scrollY) { - var29 = var28.scrollHeight - var28.height - var28.scrollY; - } - - var28.scrollY += var29; - Client.field746 -= var29; - WorldMapSectionType.invalidateWidget(var28); - } - } - } else if (var10 == GrandExchangeOfferOwnWorldComparator.field628 && var19 == Client.field743) { - var27.drawTransAt(var22, var23, 128); - } else { - var27.drawTransBgAt(var22, var23); - } - } else { - WorldMapSectionType.invalidateWidget(var10); - } - } - } - - ++var19; - } - } - } else if (var10.type == 3) { - if (Projectile.runCs1(var10)) { - var19 = var10.color2; - if (var10 == NetSocket.mousedOverWidgetIf1 && var10.mouseOverColor2 != 0) { - var19 = var10.mouseOverColor2; - } - } else { - var19 = var10.color; - if (var10 == NetSocket.mousedOverWidgetIf1 && var10.mouseOverColor != 0) { - var19 = var10.mouseOverColor; - } - } - - if (var10.fill) { - switch(var10.fillMode.value) { - case 1: - Rasterizer2D.Rasterizer2D_fillRectangleGradient(var12, var13, var10.width, var10.height, var10.color, var10.color2); - break; - case 2: - Rasterizer2D.Rasterizer2D_fillRectangleGradientAlpha(var12, var13, var10.width, var10.height, var10.color, var10.color2, 255 - (var10.transparencyTop & 255), 255 - (var10.transparencyBot & 255)); - break; - default: - if (var14 == 0) { - Rasterizer2D.Rasterizer2D_fillRectangle(var12, var13, var10.width, var10.height, var19); - } else { - Rasterizer2D.Rasterizer2D_fillRectangleAlpha(var12, var13, var10.width, var10.height, var19, 256 - (var14 & 255)); - } - } - } else if (var14 == 0) { - Rasterizer2D.Rasterizer2D_drawRectangle(var12, var13, var10.width, var10.height, var19); - } else { - Rasterizer2D.Rasterizer2D_drawRectangleAlpha(var12, var13, var10.width, var10.height, var19, 256 - (var14 & 255)); - } - } else { - Font var39; - if (var10.type == 4) { - var39 = var10.getFont(); - if (var39 == null) { - if (Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - } else { - String var45 = var10.text; - if (Projectile.runCs1(var10)) { - var20 = var10.color2; - if (var10 == NetSocket.mousedOverWidgetIf1 && var10.mouseOverColor2 != 0) { - var20 = var10.mouseOverColor2; - } - - if (var10.text2.length() > 0) { - var45 = var10.text2; - } - } else { - var20 = var10.color; - if (var10 == NetSocket.mousedOverWidgetIf1 && var10.mouseOverColor != 0) { - var20 = var10.mouseOverColor; - } - } - - if (var10.isIf3 && var10.itemId != -1) { - ItemDefinition var46 = Occluder.ItemDefinition_get(var10.itemId); - var45 = var46.name; - if (var45 == null) { - var45 = "null"; - } - - if ((var46.isStackable == 1 || var10.itemQuantity != 1) && var10.itemQuantity != -1) { - var45 = World.colorStartTag(16748608) + var45 + "" + " " + 'x' + class42.formatItemStacks(var10.itemQuantity); - } - } - - if (var10 == Client.meslayerContinueWidget) { - var45 = "Please wait..."; - var20 = var10.color; - } - - if (!var10.isIf3) { - var45 = InvDefinition.method4335(var45, var10); - } - - var39.drawLines(var45, var12, var13, var10.width, var10.height, var20, var10.textShadowed ? 0 : -1, var10.textXAlignment, var10.textYAlignment, var10.textLineHeight); - } - } else if (var10.type == 5) { - Sprite var40; - if (!var10.isIf3) { - var40 = var10.getSprite(Projectile.runCs1(var10)); - if (var40 != null) { - var40.drawTransBgAt(var12, var13); - } else if (Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - } else { - if (var10.itemId != -1) { - var40 = GrandExchangeOfferWorldComparator.getItemSprite(var10.itemId, var10.itemQuantity, var10.outline, var10.spriteShadow, var10.itemQuantityMode, false); - } else { - var40 = var10.getSprite(false); - } - - if (var40 == null) { - if (Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - } else { - var20 = var40.width; - var21 = var40.height; - if (!var10.spriteTiling) { - var22 = var10.width * 4096 / var20; - if (var10.spriteAngle != 0) { - var40.method6091(var10.width / 2 + var12, var10.height / 2 + var13, var10.spriteAngle, var22); - } else if (var14 != 0) { - var40.drawTransScaledAt(var12, var13, var10.width, var10.height, 256 - (var14 & 255)); - } else if (var20 == var10.width && var21 == var10.height) { - var40.drawTransBgAt(var12, var13); - } else { - var40.drawScaledAt(var12, var13, var10.width, var10.height); - } - } else { - Rasterizer2D.Rasterizer2D_expandClip(var12, var13, var12 + var10.width, var13 + var10.height); - var22 = (var20 - 1 + var10.width) / var20; - var23 = (var21 - 1 + var10.height) / var21; - - for (var24 = 0; var24 < var22; ++var24) { - for (var25 = 0; var25 < var23; ++var25) { - if (var10.spriteAngle != 0) { - var40.method6091(var20 / 2 + var12 + var24 * var20, var21 / 2 + var13 + var25 * var21, var10.spriteAngle, 4096); - } else if (var14 != 0) { - var40.drawTransAt(var12 + var24 * var20, var13 + var25 * var21, 256 - (var14 & 255)); - } else { - var40.drawTransBgAt(var12 + var24 * var20, var13 + var25 * var21); - } - } - } - - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var4, var5); - } - } - } - } else { - ItemDefinition var34; - if (var10.type == 6) { - boolean var36 = Projectile.runCs1(var10); - if (var36) { - var20 = var10.sequenceId2; - } else { - var20 = var10.sequenceId; - } - - Model var42 = null; - var22 = 0; - if (var10.itemId != -1) { - var34 = Occluder.ItemDefinition_get(var10.itemId); - if (var34 != null) { - var34 = var34.getCountObj(var10.itemQuantity); - var42 = var34.getModel(1); - if (var42 != null) { - var42.calculateBoundsCylinder(); - var22 = var42.height / 2; - } else { - WorldMapSectionType.invalidateWidget(var10); - } - } - } else if (var10.modelType == 5) { - if (var10.modelId == 0) { - var42 = Client.playerAppearance.getModel((SequenceDefinition)null, -1, (SequenceDefinition)null, -1); - } else { - var42 = class223.localPlayer.getModel(); - } - } else if (var20 == -1) { - var42 = var10.getModel((SequenceDefinition)null, -1, var36, class223.localPlayer.appearance); - if (var42 == null && Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - } else { - SequenceDefinition var47 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var20); - var42 = var10.getModel(var47, var10.modelFrame, var36, class223.localPlayer.appearance); - if (var42 == null && Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - } - - Rasterizer3D.method2992(var10.width / 2 + var12, var10.height / 2 + var13); - var23 = Rasterizer3D.Rasterizer3D_sine[var10.modelAngleX] * var10.modelZoom >> 16; - var24 = Rasterizer3D.Rasterizer3D_cosine[var10.modelAngleX] * var10.modelZoom >> 16; - if (var42 != null) { - if (!var10.isIf3) { - var42.method2870(0, var10.modelAngleY, 0, var10.modelAngleX, 0, var23, var24); - } else { - var42.calculateBoundsCylinder(); - if (var10.modelOrthog) { - var42.method2871(0, var10.modelAngleY, var10.modelAngleZ, var10.modelAngleX, var10.modelOffsetX, var22 + var23 + var10.modelOffsetY, var24 + var10.modelOffsetY, var10.modelZoom); - } else { - var42.method2870(0, var10.modelAngleY, var10.modelAngleZ, var10.modelAngleX, var10.modelOffsetX, var23 + var22 + var10.modelOffsetY, var24 + var10.modelOffsetY); - } - } - } - - Rasterizer3D.Rasterizer3D_method3(); - } else { - if (var10.type == 7) { - var39 = var10.getFont(); - if (var39 == null) { - if (Widget.field2543) { - WorldMapSectionType.invalidateWidget(var10); - } - continue; - } - - var20 = 0; - - for (var21 = 0; var21 < var10.rawHeight; ++var21) { - for (var22 = 0; var22 < var10.rawWidth; ++var22) { - if (var10.itemIds[var20] > 0) { - var34 = Occluder.ItemDefinition_get(var10.itemIds[var20] - 1); - String var31; - if (var34.isStackable != 1 && var10.itemQuantities[var20] == 1) { - var31 = World.colorStartTag(16748608) + var34.name + ""; - } else { - var31 = World.colorStartTag(16748608) + var34.name + "" + " " + 'x' + class42.formatItemStacks(var10.itemQuantities[var20]); - } - - var25 = var12 + var22 * (var10.paddingX + 115); - var26 = var13 + (var10.paddingY + 12) * var21; - if (var10.textXAlignment == 0) { - var39.draw(var31, var25, var26, var10.color, var10.textShadowed ? 0 : -1); - } else if (var10.textXAlignment == 1) { - var39.drawCentered(var31, var10.width / 2 + var25, var26, var10.color, var10.textShadowed ? 0 : -1); - } else { - var39.drawRightAligned(var31, var25 + var10.width - 1, var26, var10.color, var10.textShadowed ? 0 : -1); - } - } - - ++var20; - } - } - } - - if (var10.type == 8 && var10 == Strings.field2767 && Client.field787 == Client.field788) { - var19 = 0; - var20 = 0; - Font var32 = GraphicsDefaults.fontPlain12; - String var33 = var10.text; - - String var44; - for (var33 = InvDefinition.method4335(var33, var10); var33.length() > 0; var20 = var20 + var32.ascent + 1) { - var24 = var33.indexOf("
"); - if (var24 != -1) { - var44 = var33.substring(0, var24); - var33 = var33.substring(var24 + 4); - } else { - var44 = var33; - var33 = ""; - } - - var25 = var32.stringWidth(var44); - if (var25 > var19) { - var19 = var25; - } - } - - var19 += 6; - var20 += 7; - var24 = var12 + var10.width - 5 - var19; - var25 = var13 + var10.height + 5; - if (var24 < var12 + 5) { - var24 = var12 + 5; - } - - if (var24 + var19 > var4) { - var24 = var4 - var19; - } - - if (var25 + var20 > var5) { - var25 = var5 - var20; - } - - Rasterizer2D.Rasterizer2D_fillRectangle(var24, var25, var19, var20, 16777120); - Rasterizer2D.Rasterizer2D_drawRectangle(var24, var25, var19, var20, 0); - var33 = var10.text; - var26 = var25 + var32.ascent + 2; - - for (var33 = InvDefinition.method4335(var33, var10); var33.length() > 0; var26 = var26 + var32.ascent + 1) { - int var35 = var33.indexOf("
"); - if (var35 != -1) { - var44 = var33.substring(0, var35); - var33 = var33.substring(var35 + 4); - } else { - var44 = var33; - var33 = ""; - } - - var32.draw(var44, var24 + 3, var26, 0, -1); - } - } - - if (var10.type == 9) { - if (var10.field2579) { - var19 = var12; - var20 = var13 + var10.height; - var21 = var12 + var10.width; - var22 = var13; - } else { - var19 = var12; - var20 = var13; - var21 = var12 + var10.width; - var22 = var13 + var10.height; - } - - if (var10.lineWid == 1) { - Rasterizer2D.Rasterizer2D_drawLine(var19, var20, var21, var22, var10.color); - } else { - DevicePcmPlayerProvider.method877(var19, var20, var21, var22, var10.color, var10.lineWid); - } - } - } - } - } - } - } - } + @Export("drawWidgets") + static final void drawWidgets(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7) { + if (TextureProvider.loadInterface(var0)) { + VarcInt.field3218 = null; + IgnoreList.drawInterface(Widget.Widget_interfaceComponents[var0], -1, var1, var2, var3, var4, var5, var6, var7); + if (VarcInt.field3218 != null) { + IgnoreList.drawInterface(VarcInt.field3218, -1412584499, var1, var2, var3, var4, TriBool.field3600, GrandExchangeEvent.field46, var7); + VarcInt.field3218 = null; + } + + } else { + if (var7 != -1) { + Client.field842[var7] = true; + } else { + for (int var8 = 0; var8 < 100; ++var8) { + Client.field842[var8] = true; } } + } - - } - - @ObfuscatedName("it") - @ObfuscatedSignature( - signature = "(ZI)V", - garbageValue = "-374133932" - ) - @Export("setTapToDrop") - static void setTapToDrop(boolean var0) { - Client.tapToDrop = var0; } } diff --git a/runescape-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java index 574a7f223b..3cc3deab95 100644 --- a/runescape-client/src/main/java/ScriptFrame.java +++ b/runescape-client/src/main/java/ScriptFrame.java @@ -3,26 +3,30 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bv") +@ObfuscatedName("bx") @Implements("ScriptFrame") public class ScriptFrame { - @ObfuscatedName("z") + @ObfuscatedName("m") + @Export("musicTrackBoolean") + public static boolean musicTrackBoolean; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lcu;" + signature = "Lcj;" ) @Export("script") Script script; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 173320539 + intValue = -692629101 ) @Export("pc") int pc; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("intLocals") int[] intLocals; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("stringLocals") String[] stringLocals; @@ -30,75 +34,327 @@ public class ScriptFrame { this.pc = -1; } - @ObfuscatedName("z") - public static final int method1158(double var0, double var2, double var4) { - double var6 = var4; - double var8 = var4; - double var10 = var4; - if (var2 != 0.0D) { - double var12; - if (var4 < 0.5D) { - var12 = (1.0D + var2) * var4; + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(ILcj;ZB)I", + garbageValue = "2" + ) + static int method1218(int var0, Script var1, boolean var2) { + if (var0 < 1000) { + return class65.method1321(var0, var1, var2); + } else if (var0 < 1100) { + return GrandExchangeOfferTotalQuantityComparator.method134(var0, var1, var2); + } else if (var0 < 1200) { + return class185.method3772(var0, var1, var2); + } else if (var0 < 1300) { + return TaskHandler.method3605(var0, var1, var2); + } else if (var0 < 1400) { + return PacketBufferNode.method3784(var0, var1, var2); + } else if (var0 < 1500) { + return class42.method873(var0, var1, var2); + } else if (var0 < 1600) { + return class185.method3773(var0, var1, var2); + } else if (var0 < 1700) { + return WorldMapRegion.method574(var0, var1, var2); + } else if (var0 < 1800) { + return AbstractByteArrayCopier.method4093(var0, var1, var2); + } else if (var0 < 1900) { + return ScriptEvent.method1263(var0, var1, var2); + } else if (var0 < 2000) { + return GameShell.method1142(var0, var1, var2); + } else if (var0 < 2100) { + return GrandExchangeOfferTotalQuantityComparator.method134(var0, var1, var2); + } else if (var0 < 2200) { + return class185.method3772(var0, var1, var2); + } else if (var0 < 2300) { + return TaskHandler.method3605(var0, var1, var2); + } else if (var0 < 2400) { + return PacketBufferNode.method3784(var0, var1, var2); + } else if (var0 < 2500) { + return class42.method873(var0, var1, var2); + } else if (var0 < 2600) { + return PacketWriter.method2426(var0, var1, var2); + } else if (var0 < 2700) { + return class49.method938(var0, var1, var2); + } else if (var0 < 2800) { + return class2.method32(var0, var1, var2); + } else if (var0 < 2900) { + return SoundCache.method2673(var0, var1, var2); + } else if (var0 < 3000) { + return GameShell.method1142(var0, var1, var2); + } else if (var0 < 3200) { + return class189.method3796(var0, var1, var2); + } else if (var0 < 3300) { + return class16.method224(var0, var1, var2); + } else if (var0 < 3400) { + return DevicePcmPlayerProvider.method916(var0, var1, var2); + } else if (var0 < 3500) { + return Message.method1310(var0, var1, var2); + } else if (var0 < 3700) { + return class30.method605(var0, var1, var2); + } else if (var0 < 4000) { + return class216.method4196(var0, var1, var2); + } else if (var0 < 4100) { + return SecureRandomCallable.method1226(var0, var1, var2); + } else if (var0 < 4200) { + return GrandExchangeOfferAgeComparator.method196(var0, var1, var2); + } else if (var0 < 4300) { + return method1217(var0, var1, var2); + } else if (var0 < 5100) { + return class40.method837(var0, var1, var2); + } else if (var0 < 5400) { + return ArchiveLoader.method1245(var0, var1, var2); + } else if (var0 < 5600) { + return Tiles.method1215(var0, var1, var2); + } else if (var0 < 5700) { + return GraphicsDefaults.method6006(var0, var1, var2); + } else if (var0 < 6300) { + return MouseHandler.method1176(var0, var1, var2); + } else if (var0 < 6600) { + return ArchiveDiskAction.method4296(var0, var1, var2); + } else { + return var0 < 6700 ? class43.method877(var0, var1, var2) : 2; + } + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(Lbk;Lbk;IZI)I", + garbageValue = "697850759" + ) + @Export("compareWorlds") + static int compareWorlds(World var0, World var1, int var2, boolean var3) { + if (var2 == 1) { + int var4 = var0.population; + int var5 = var1.population; + if (!var3) { + if (var4 == -1) { + var4 = 2001; + } + + if (var5 == -1) { + var5 = 2001; + } + } + + return var4 - var5; + } else if (var2 == 2) { + return var0.location - var1.location; + } else if (var2 == 3) { + if (var0.activity.equals("-")) { + if (var1.activity.equals("-")) { + return 0; + } else { + return var3 ? -1 : 1; + } + } else if (var1.activity.equals("-")) { + return var3 ? 1 : -1; } else { - var12 = var2 + var4 - var4 * var2; + return var0.activity.compareTo(var1.activity); } + } else if (var2 == 4) { + return var0.method1885() ? (var1.method1885() ? 0 : 1) : (var1.method1885() ? -1 : 0); + } else if (var2 == 5) { + return var0.method1917() ? (var1.method1917() ? 0 : 1) : (var1.method1917() ? -1 : 0); + } else if (var2 == 6) { + return var0.isPvp() ? (var1.isPvp() ? 0 : 1) : (var1.isPvp() ? -1 : 0); + } else if (var2 == 7) { + return var0.isMembersOnly() ? (var1.isMembersOnly() ? 0 : 1) : (var1.isMembersOnly() ? -1 : 0); + } else { + return var0.id - var1.id; + } + } - double var14 = var4 * 2.0D - var12; - double var16 = 0.3333333333333333D + var0; - if (var16 > 1.0D) { - --var16; - } + @ObfuscatedName("al") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-1066655429" + ) + static int method1217(int var0, Script var1, boolean var2) { + int var3; + if (var0 == ScriptOpcodes.OC_NAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = class222.ItemDefinition_get(var3).name; + return 1; + } else { + int var4; + ItemDefinition var5; + if (var0 == ScriptOpcodes.OC_OP) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var5 = class222.ItemDefinition_get(var3); + if (var4 >= 1 && var4 <= 5 && var5.groundActions[var4 - 1] != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var5.groundActions[var4 - 1]; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } - double var20 = var0 - 0.3333333333333333D; - if (var20 < 0.0D) { - ++var20; - } + return 1; + } else if (var0 == ScriptOpcodes.OC_IOP) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var5 = class222.ItemDefinition_get(var3); + if (var4 >= 1 && var4 <= 5 && var5.inventoryActions[var4 - 1] != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var5.inventoryActions[var4 - 1]; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } - if (var16 * 6.0D < 1.0D) { - var6 = var16 * (var12 - var14) * 6.0D + var14; - } else if (var16 * 2.0D < 1.0D) { - var6 = var12; - } else if (3.0D * var16 < 2.0D) { - var6 = var14 + 6.0D * (var12 - var14) * (0.6666666666666666D - var16); + return 1; + } else if (var0 == ScriptOpcodes.OC_COST) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class222.ItemDefinition_get(var3).price; + return 1; + } else if (var0 == ScriptOpcodes.OC_STACKABLE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class222.ItemDefinition_get(var3).isStackable == 1 ? 1 : 0; + return 1; } else { - var6 = var14; - } + ItemDefinition var6; + if (var0 == ScriptOpcodes.OC_CERT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class222.ItemDefinition_get(var3); + if (var6.noteTemplate == -1 && var6.note >= 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.note; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + } - if (6.0D * var0 < 1.0D) { - var8 = var0 * (var12 - var14) * 6.0D + var14; - } else if (2.0D * var0 < 1.0D) { - var8 = var12; - } else if (3.0D * var0 < 2.0D) { - var8 = var14 + 6.0D * (var12 - var14) * (0.6666666666666666D - var0); - } else { - var8 = var14; - } + return 1; + } else if (var0 == ScriptOpcodes.OC_UNCERT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class222.ItemDefinition_get(var3); + if (var6.noteTemplate >= 0 && var6.note >= 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.note; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + } - if (6.0D * var20 < 1.0D) { - var10 = var14 + (var12 - var14) * 6.0D * var20; - } else if (var20 * 2.0D < 1.0D) { - var10 = var12; - } else if (3.0D * var20 < 2.0D) { - var10 = var14 + 6.0D * (0.6666666666666666D - var20) * (var12 - var14); - } else { - var10 = var14; + return 1; + } else if (var0 == ScriptOpcodes.OC_MEMBERS) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class222.ItemDefinition_get(var3).isMembersOnly ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.OC_PLACEHOLDER) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class222.ItemDefinition_get(var3); + if (var6.placeholderTemplate == -1 && var6.placeholder >= 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.placeholder; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + } + + return 1; + } else if (var0 == ScriptOpcodes.OC_UNPLACEHOLDER) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class222.ItemDefinition_get(var3); + if (var6.placeholderTemplate >= 0 && var6.placeholder >= 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.placeholder; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + } + + return 1; + } else if (var0 == ScriptOpcodes.OC_FIND) { + String var7 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + BoundaryObject.findItemDefinitions(var7, var4 == 1); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = MouseHandler.foundItemIdCount; + return 1; + } else if (var0 != ScriptOpcodes.OC_FINDNEXT) { + if (var0 == ScriptOpcodes.OC_FINDRESET) { + WorldMapManager.foundItemIndex = 0; + return 1; + } else { + return 2; + } + } else { + if (UserComparator4.foundItemIds != null && WorldMapManager.foundItemIndex < MouseHandler.foundItemIdCount) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.foundItemIds[++WorldMapManager.foundItemIndex - 1] & '\uffff'; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } + + return 1; + } } } - - int var22 = (int)(var6 * 256.0D); - int var13 = (int)(256.0D * var8); - int var23 = (int)(256.0D * var10); - int var15 = var23 + (var13 << 8) + (var22 << 16); - return var15; } - @ObfuscatedName("z") + @ObfuscatedName("gs") @ObfuscatedSignature( - signature = "(Lhp;Lhp;I)V", - garbageValue = "-1912847764" + signature = "(S)V", + garbageValue = "256" ) - public static void method1157(AbstractArchive var0, AbstractArchive var1) { - HealthBarDefinition.HealthBarDefinition_archive = var0; - HealthBarDefinition.HitSplatDefinition_spritesArchive = var1; + static final void method1219() { + if (Player.Scene_plane != Client.field856) { + Client.field856 = Player.Scene_plane; + int var0 = Player.Scene_plane; + int[] var1 = FloorDecoration.sceneMinimapSprite.pixels; + int var2 = var1.length; + + int var3; + for (var3 = 0; var3 < var2; ++var3) { + var1[var3] = 0; + } + + int var4; + int var5; + for (var3 = 1; var3 < 103; ++var3) { + var4 = (103 - var3) * 2048 + 24628; + + for (var5 = 1; var5 < 103; ++var5) { + if ((Tiles.Tiles_renderFlags[var0][var5][var3] & 24) == 0) { + WorldMapArea.scene.drawTileMinimap(var1, var4, 512, var0, var5, var3); + } + + if (var0 < 3 && (Tiles.Tiles_renderFlags[var0 + 1][var5][var3] & 8) != 0) { + WorldMapArea.scene.drawTileMinimap(var1, var4, 512, var0 + 1, var5, var3); + } + + var4 += 4; + } + } + + var3 = (238 + (int)(Math.random() * 20.0D) - 10 << 16) + (238 + (int)(Math.random() * 20.0D) - 10 << 8) + (238 + (int)(Math.random() * 20.0D) - 10); + var4 = 238 + (int)(Math.random() * 20.0D) - 10 << 16; + FloorDecoration.sceneMinimapSprite.setRaster(); + + int var6; + for (var5 = 1; var5 < 103; ++var5) { + for (var6 = 1; var6 < 103; ++var6) { + if ((Tiles.Tiles_renderFlags[var0][var6][var5] & 24) == 0) { + WorldMapLabel.drawObject(var0, var6, var5, var3, var4); + } + + if (var0 < 3 && (Tiles.Tiles_renderFlags[var0 + 1][var6][var5] & 8) != 0) { + WorldMapLabel.drawObject(var0 + 1, var6, var5, var3, var4); + } + } + } + + Client.mapIconCount = 0; + + for (var5 = 0; var5 < 104; ++var5) { + for (var6 = 0; var6 < 104; ++var6) { + long var7 = WorldMapArea.scene.getFloorDecorationTag(Player.Scene_plane, var5, var6); + if (0L != var7) { + int var9 = UserComparator8.Entity_unpackID(var7); + int var10 = WorldMapDecorationType.getObjectDefinition(var9).mapIconId; + if (var10 >= 0) { + Client.mapIcons[Client.mapIconCount] = class65.WorldMapElement_get(var10).getSpriteBool(false); + Client.mapIconXs[Client.mapIconCount] = var5; + Client.mapIconYs[Client.mapIconCount] = var6; + ++Client.mapIconCount; + } + } + } + } + + AbstractWorldMapData.rasterProvider.apply(); + } + } } diff --git a/runescape-client/src/main/java/SecureRandomCallable.java b/runescape-client/src/main/java/SecureRandomCallable.java index c19f79ab2f..b58888ffe6 100644 --- a/runescape-client/src/main/java/SecureRandomCallable.java +++ b/runescape-client/src/main/java/SecureRandomCallable.java @@ -1,118 +1,365 @@ +import java.io.File; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.net.URL; +import java.net.URLConnection; import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledExecutorService; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bj") +@ObfuscatedName("bl") @Implements("SecureRandomCallable") public class SecureRandomCallable implements Callable { - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lhp;" + @ObfuscatedName("rw") + @ObfuscatedGetter( + intValue = 693781825 ) - @Export("musicSamplesArchive") - public static AbstractArchive musicSamplesArchive; + static int field510; + @ObfuscatedName("q") + @Export("JagexCache_locationFile") + static File JagexCache_locationFile; + @ObfuscatedName("l") + @Export("SpriteBuffer_spriteWidths") + public static int[] SpriteBuffer_spriteWidths; + @ObfuscatedName("o") + @Export("soundSystemExecutor") + static ScheduledExecutorService soundSystemExecutor; SecureRandomCallable() { } public Object call() { - return AttackOption.method2081(); + return Language.method3800(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIIB)J", - garbageValue = "0" + signature = "(I)[Lga;", + garbageValue = "-1086153483" ) - static long method1165(int var0, int var1, int var2) { - return (long)(var2 << 16 | var0 << 8 | var1); + @Export("ServerPacket_values") + public static ServerPacket[] ServerPacket_values() { + return new ServerPacket[]{ServerPacket.field2146, ServerPacket.field2172, ServerPacket.field2093, ServerPacket.field2113, ServerPacket.field2095, ServerPacket.field2096, ServerPacket.field2156, ServerPacket.field2173, ServerPacket.field2091, ServerPacket.field2174, ServerPacket.field2101, ServerPacket.field2126, ServerPacket.field2103, ServerPacket.field2104, ServerPacket.field2105, ServerPacket.field2147, ServerPacket.field2107, ServerPacket.field2102, ServerPacket.field2099, ServerPacket.field2110, ServerPacket.field2111, ServerPacket.field2112, ServerPacket.field2123, ServerPacket.field2114, ServerPacket.field2115, ServerPacket.field2116, ServerPacket.field2117, ServerPacket.field2106, ServerPacket.field2119, ServerPacket.field2120, ServerPacket.field2108, ServerPacket.field2122, ServerPacket.field2092, ServerPacket.field2124, ServerPacket.field2125, ServerPacket.field2097, ServerPacket.field2137, ServerPacket.field2128, ServerPacket.field2129, ServerPacket.field2130, ServerPacket.field2131, ServerPacket.field2135, ServerPacket.field2142, ServerPacket.field2134, ServerPacket.field2118, ServerPacket.field2136, ServerPacket.field2167, ServerPacket.field2094, ServerPacket.field2158, ServerPacket.field2140, ServerPacket.field2141, ServerPacket.field2166, ServerPacket.field2143, ServerPacket.field2144, ServerPacket.field2145, ServerPacket.field2154, ServerPacket.field2098, ServerPacket.field2148, ServerPacket.field2149, ServerPacket.field2109, ServerPacket.field2155, ServerPacket.field2152, ServerPacket.field2153, ServerPacket.field2133, ServerPacket.field2162, ServerPacket.field2150, ServerPacket.field2157, ServerPacket.field2139, ServerPacket.field2159, ServerPacket.field2160, ServerPacket.field2161, ServerPacket.field2127, ServerPacket.field2163, ServerPacket.field2164, ServerPacket.field2165, ServerPacket.field2121, ServerPacket.field2151, ServerPacket.field2168, ServerPacket.field2169, ServerPacket.field2170, ServerPacket.field2171, ServerPacket.field2138, ServerPacket.field2100, ServerPacket.field2132, ServerPacket.field2175, ServerPacket.field2176}; } - @ObfuscatedName("r") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "19776" + signature = "(I)J", + garbageValue = "-1989467818" ) - public static int method1166() { - return KeyHandler.KeyHandler_idleCycles; + static long method1225() { + try { + URL var0 = new URL(WorldMapElement.method4547("services", false) + "m=accountappeal/login.ws"); + URLConnection var1 = var0.openConnection(); + var1.setRequestProperty("connection", "close"); + var1.setDoInput(true); + var1.setDoOutput(true); + var1.setConnectTimeout(5000); + OutputStreamWriter var2 = new OutputStreamWriter(var1.getOutputStream()); + var2.write("data1=req"); + var2.flush(); + InputStream var3 = var1.getInputStream(); + Buffer var4 = new Buffer(new byte[1000]); + + do { + int var5 = var3.read(var4.array, var4.offset, 1000 - var4.offset); + if (var5 == -1) { + var4.offset = 0; + long var7 = var4.readLong(); + return var7; + } + + var4.offset += var5; + } while(var4.offset < 1000); + + return 0L; + } catch (Exception var9) { + return 0L; + } } - @ObfuscatedName("o") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ldh;IIII)Z", - garbageValue = "810507745" + signature = "(II)Lit;", + garbageValue = "-1052410200" ) - static final boolean method1163(Model var0, int var1, int var2, int var3) { - boolean var4 = ViewportMouse.ViewportMouse_isInViewport; - if (!var4) { + @Export("getNpcDefinition") + public static NPCDefinition getNpcDefinition(int var0) { + NPCDefinition var1 = (NPCDefinition)NPCDefinition.NpcDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = NPCDefinition.NpcDefinition_archive.takeFile(9, var0); + var1 = new NPCDefinition(); + var1.id = var0; + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + + var1.postDecode(); + NPCDefinition.NpcDefinition_cached.put(var1, (long)var0); + return var1; + } + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Lkc;Ljava/lang/String;B)I", + garbageValue = "15" + ) + public static int method1229(Buffer var0, String var1) { + int var2 = var0.offset; + int var4 = var1.length(); + byte[] var5 = new byte[var4]; + + for (int var6 = 0; var6 < var4; ++var6) { + char var7 = var1.charAt(var6); + if (var7 > 0 && var7 < 128 || var7 >= 160 && var7 <= 255) { + var5[var6] = (byte)var7; + } else if (var7 == 8364) { + var5[var6] = -128; + } else if (var7 == 8218) { + var5[var6] = -126; + } else if (var7 == 402) { + var5[var6] = -125; + } else if (var7 == 8222) { + var5[var6] = -124; + } else if (var7 == 8230) { + var5[var6] = -123; + } else if (var7 == 8224) { + var5[var6] = -122; + } else if (var7 == 8225) { + var5[var6] = -121; + } else if (var7 == 710) { + var5[var6] = -120; + } else if (var7 == 8240) { + var5[var6] = -119; + } else if (var7 == 352) { + var5[var6] = -118; + } else if (var7 == 8249) { + var5[var6] = -117; + } else if (var7 == 338) { + var5[var6] = -116; + } else if (var7 == 381) { + var5[var6] = -114; + } else if (var7 == 8216) { + var5[var6] = -111; + } else if (var7 == 8217) { + var5[var6] = -110; + } else if (var7 == 8220) { + var5[var6] = -109; + } else if (var7 == 8221) { + var5[var6] = -108; + } else if (var7 == 8226) { + var5[var6] = -107; + } else if (var7 == 8211) { + var5[var6] = -106; + } else if (var7 == 8212) { + var5[var6] = -105; + } else if (var7 == 732) { + var5[var6] = -104; + } else if (var7 == 8482) { + var5[var6] = -103; + } else if (var7 == 353) { + var5[var6] = -102; + } else if (var7 == 8250) { + var5[var6] = -101; + } else if (var7 == 339) { + var5[var6] = -100; + } else if (var7 == 382) { + var5[var6] = -98; + } else if (var7 == 376) { + var5[var6] = -97; + } else { + var5[var6] = 63; + } + } + + var0.writeSmartByteShort(var5.length); + var0.offset += class210.huffman.compress(var5, 0, var5.length, var0.array, var0.offset); + return var0.offset - var2; + } + + @ObfuscatedName("ab") + @ObfuscatedSignature( + signature = "(ILcj;ZB)I", + garbageValue = "90" + ) + static int method1226(int var0, Script var1, boolean var2) { + int var3; + int var4; + if (var0 == ScriptOpcodes.ADD) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4 + var3; + return 1; + } else if (var0 == ScriptOpcodes.SUB) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 - var4; + return 1; + } else if (var0 == ScriptOpcodes.MULTIPLY) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 * var4; + return 1; + } else if (var0 == ScriptOpcodes.DIV) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 / var4; + return 1; + } else if (var0 == ScriptOpcodes.RANDOM) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)var3); + return 1; + } else if (var0 == ScriptOpcodes.RANDOMINC) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)(var3 + 1)); + return 1; + } else if (var0 == ScriptOpcodes.INTERPOLATE) { + Interpreter.Interpreter_intStackSize -= 5; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + int var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + int var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 4]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 + (var7 - var5) * (var4 - var3) / (var6 - var5); + return 1; + } else if (var0 == ScriptOpcodes.ADDPERCENT) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 + var4 * var3 / 100; + return 1; + } else if (var0 == ScriptOpcodes.SETBIT) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 | 1 << var4; + return 1; + } else if (var0 == ScriptOpcodes.CLEARBIT) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 & -1 - (1 << var4); + return 1; + } else if (var0 == ScriptOpcodes.TESTBIT) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var3 & 1 << var4) != 0 ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.MOD) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 % var4; + return 1; + } else if (var0 == ScriptOpcodes.POW) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + if (var3 == 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, (double)var4); + } + + return 1; + } else if (var0 == ScriptOpcodes.INVPOW) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + if (var3 == 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else { + switch(var4) { + case 0: + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Integer.MAX_VALUE; + break; + case 1: + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + break; + case 2: + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.sqrt((double)var3); + break; + case 3: + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.cbrt((double)var3); + break; + case 4: + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.sqrt(Math.sqrt((double)var3)); + break; + default: + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, 1.0D / (double)var4); + } + + return 1; + } + } else if (var0 == ScriptOpcodes.AND) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 & var4; + return 1; + } else if (var0 == ScriptOpcodes.OR) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 | var4; + return 1; + } else if (var0 == ScriptOpcodes.SCALE) { + Interpreter.Interpreter_intStackSize -= 3; + long var9 = (long)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + long var11 = (long)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + long var13 = (long)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)(var13 * var9 / var11); + return 1; + } else { + return 2; + } + } + + @ObfuscatedName("je") + @ObfuscatedSignature( + signature = "(Lhi;S)Z", + garbageValue = "9365" + ) + @Export("runCs1") + static final boolean runCs1(Widget var0) { + if (var0.cs1Comparisons == null) { return false; } else { - int var5; - int var6; - int var7; - int var8; - int var11; - int var12; - int var13; - int var16; - int var17; - if (!ViewportMouse.ViewportMouse_false0) { - var5 = Scene.Scene_cameraPitchSine; - var6 = Scene.Scene_cameraPitchCosine; - var7 = Scene.Scene_cameraYawSine; - var8 = Scene.Scene_cameraYawCosine; - byte var9 = 50; - short var10 = 3500; - var11 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * var9 / Rasterizer3D.Rasterizer3D_zoom; - var12 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * var9 / Rasterizer3D.Rasterizer3D_zoom; - var13 = (ViewportMouse.ViewportMouse_x - Rasterizer3D.Rasterizer3D_clipMidX) * var10 / Rasterizer3D.Rasterizer3D_zoom; - int var14 = (ViewportMouse.ViewportMouse_y - Rasterizer3D.Rasterizer3D_clipMidY) * var10 / Rasterizer3D.Rasterizer3D_zoom; - int var15 = Rasterizer3D.method2986(var12, var9, var6, var5); - var16 = Rasterizer3D.method2978(var12, var9, var6, var5); - var12 = var15; - var15 = Rasterizer3D.method2986(var14, var10, var6, var5); - var17 = Rasterizer3D.method2978(var14, var10, var6, var5); - var14 = var15; - var15 = Rasterizer3D.method2984(var11, var16, var8, var7); - var16 = Rasterizer3D.method2985(var11, var16, var8, var7); - var11 = var15; - var15 = Rasterizer3D.method2984(var13, var17, var8, var7); - var17 = Rasterizer3D.method2985(var13, var17, var8, var7); - ViewportMouse.field1707 = (var15 + var11) / 2; - ViewportMouse.field1708 = (var12 + var14) / 2; - ViewportMouse.field1714 = (var16 + var17) / 2; - class96.field1304 = (var15 - var11) / 2; - ViewportMouse.field1718 = (var14 - var12) / 2; - ViewportMouse.field1711 = (var17 - var16) / 2; - class222.field2729 = Math.abs(class96.field1304); - UserComparator3.field1971 = Math.abs(ViewportMouse.field1718); - ParamDefinition.field3287 = Math.abs(ViewportMouse.field1711); + for (int var1 = 0; var1 < var0.cs1Comparisons.length; ++var1) { + int var2 = class4.method73(var0, var1); + int var3 = var0.cs1ComparisonValues[var1]; + if (var0.cs1Comparisons[var1] == 2) { + if (var2 >= var3) { + return false; + } + } else if (var0.cs1Comparisons[var1] == 3) { + if (var2 <= var3) { + return false; + } + } else if (var0.cs1Comparisons[var1] == 4) { + if (var3 == var2) { + return false; + } + } else if (var2 != var3) { + return false; + } } - var5 = var0.xMid + var1; - var6 = var2 + var0.yMid; - var7 = var3 + var0.zMid; - var8 = var0.xMidOffset; - var16 = var0.yMidOffset; - var17 = var0.zMidOffset; - var11 = ViewportMouse.field1707 - var5; - var12 = ViewportMouse.field1708 - var6; - var13 = ViewportMouse.field1714 - var7; - if (Math.abs(var11) > var8 + class222.field2729) { - return false; - } else if (Math.abs(var12) > var16 + UserComparator3.field1971) { - return false; - } else if (Math.abs(var13) > var17 + ParamDefinition.field3287) { - return false; - } else if (Math.abs(var13 * ViewportMouse.field1718 - var12 * ViewportMouse.field1711) > var16 * ParamDefinition.field3287 + var17 * UserComparator3.field1971) { - return false; - } else if (Math.abs(var11 * ViewportMouse.field1711 - var13 * class96.field1304) > var17 * class222.field2729 + var8 * ParamDefinition.field3287) { - return false; - } else { - return Math.abs(var12 * class96.field1304 - var11 * ViewportMouse.field1718) <= var16 * class222.field2729 + var8 * UserComparator3.field1971; - } + return true; } } } diff --git a/runescape-client/src/main/java/SecureRandomFuture.java b/runescape-client/src/main/java/SecureRandomFuture.java index 603a2769fd..0b241bacf7 100644 --- a/runescape-client/src/main/java/SecureRandomFuture.java +++ b/runescape-client/src/main/java/SecureRandomFuture.java @@ -4,27 +4,19 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cb") +@ObfuscatedName("co") @Implements("SecureRandomFuture") public class SecureRandomFuture { - @ObfuscatedName("rq") - @ObfuscatedGetter( - intValue = 163955328 - ) - static int field1228; - @ObfuscatedName("cb") - @ObfuscatedGetter( - intValue = 515695907 - ) - public static int field1230; - @ObfuscatedName("z") + @ObfuscatedName("q") + @Export("SpriteBuffer_xOffsets") + public static int[] SpriteBuffer_xOffsets; + @ObfuscatedName("a") @Export("executor") ExecutorService executor; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("future") Future future; @@ -33,10 +25,10 @@ public class SecureRandomFuture { this.future = this.executor.submit(new SecureRandomCallable()); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-128121805" + garbageValue = "824065163" ) @Export("shutdown") void shutdown() { @@ -44,55 +36,27 @@ public class SecureRandomFuture { this.executor = null; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-55622200" + signature = "(B)Z", + garbageValue = "-58" ) @Export("isDone") boolean isDone() { return this.future.isDone(); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)Ljava/security/SecureRandom;", - garbageValue = "311645204" + garbageValue = "2107000562" ) @Export("get") SecureRandom get() { try { return (SecureRandom)this.future.get(); } catch (Exception var2) { - return AttackOption.method2081(); + return Language.method3800(); } } - - @ObfuscatedName("ha") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1765847825" - ) - static void method2138() { - for (int var0 = 0; var0 < Client.menuOptionsCount; ++var0) { - if (BZip2State.method5703(Client.menuOpcodes[var0])) { - if (var0 < Client.menuOptionsCount - 1) { - for (int var1 = var0; var1 < Client.menuOptionsCount - 1; ++var1) { - Client.menuActions[var1] = Client.menuActions[var1 + 1]; - Client.menuTargets[var1] = Client.menuTargets[var1 + 1]; - Client.menuOpcodes[var1] = Client.menuOpcodes[var1 + 1]; - Client.menuIdentifiers[var1] = Client.menuIdentifiers[var1 + 1]; - Client.menuArguments1[var1] = Client.menuArguments1[var1 + 1]; - Client.menuArguments2[var1] = Client.menuArguments2[var1 + 1]; - Client.menuShiftClick[var1] = Client.menuShiftClick[var1 + 1]; - } - } - - --var0; - --Client.menuOptionsCount; - } - } - - UserComparator6.calculateMenuBounds(FriendSystem.menuWidth / 2 + UrlRequester.menuX, class51.menuY); - } } diff --git a/runescape-client/src/main/java/SequenceDefinition.java b/runescape-client/src/main/java/SequenceDefinition.java index 1caac7a4eb..d5971116cf 100644 --- a/runescape-client/src/main/java/SequenceDefinition.java +++ b/runescape-client/src/main/java/SequenceDefinition.java @@ -1,98 +1,97 @@ +import java.net.MalformedURLException; +import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ix") +@ObfuscatedName("iv") @Implements("SequenceDefinition") public class SequenceDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("SequenceDefinition_archive") static AbstractArchive SequenceDefinition_archive; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) - @Export("SequenceDefinition_animationsArchive") - static AbstractArchive SequenceDefinition_animationsArchive; - @ObfuscatedName("u") + @Export("SequenceDefinition_skeletonsArchive") + static AbstractArchive SequenceDefinition_skeletonsArchive; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("SequenceDefinition_cached") - public static EvictingDualNodeHashTable SequenceDefinition_cached; - @ObfuscatedName("r") + static EvictingDualNodeHashTable SequenceDefinition_cached; + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("SequenceDefinition_cachedFrames") - public static EvictingDualNodeHashTable SequenceDefinition_cachedFrames; - @ObfuscatedName("aa") - @Export("fontHelvetica13") - static java.awt.Font fontHelvetica13; - @ObfuscatedName("p") + static EvictingDualNodeHashTable SequenceDefinition_cachedFrames; + @ObfuscatedName("l") @Export("frameIds") public int[] frameIds; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("chatFrameIds") int[] chatFrameIds; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("frameLengths") public int[] frameLengths; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("soundEffects") public int[] soundEffects; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 646355869 + intValue = 1066613153 ) @Export("frameCount") public int frameCount; - @ObfuscatedName("c") - int[] field3509; - @ObfuscatedName("b") - public boolean field3504; - @ObfuscatedName("o") + @ObfuscatedName("m") + int[] field3505; + @ObfuscatedName("p") + public boolean field3514; + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 1781199649 + intValue = 400808599 ) - public int field3511; - @ObfuscatedName("a") + public int field3519; + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 75980763 + intValue = 1898265591 ) @Export("shield") public int shield; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = 1392893675 + intValue = -1958425001 ) @Export("weapon") public int weapon; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 1078760223 + intValue = -1319479105 ) - public int field3503; - @ObfuscatedName("t") + public int field3518; + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = 1818541161 + intValue = 1982462933 ) - public int field3515; - @ObfuscatedName("g") + public int field3504; + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 2021679627 + intValue = -1529465451 ) - public int field3510; - @ObfuscatedName("x") + public int field3513; + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = -1562384253 + intValue = -769081211 ) - public int field3517; + public int field3521; static { SequenceDefinition_cached = new EvictingDualNodeHashTable(64); @@ -101,20 +100,20 @@ public class SequenceDefinition extends DualNode { SequenceDefinition() { this.frameCount = -1; - this.field3504 = false; - this.field3511 = 5; + this.field3514 = false; + this.field3519 = 5; this.shield = -1; this.weapon = -1; - this.field3503 = 99; - this.field3515 = -1; - this.field3510 = -1; - this.field3517 = 2; + this.field3518 = 99; + this.field3504 = -1; + this.field3513 = -1; + this.field3521 = 2; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-45" + signature = "(Lkc;I)V", + garbageValue = "2146822130" ) @Export("decode") void decode(Buffer var1) { @@ -128,10 +127,10 @@ public class SequenceDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-4421595" + signature = "(Lkc;IB)V", + garbageValue = "-43" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -158,29 +157,29 @@ public class SequenceDefinition extends DualNode { this.frameCount = var1.readUnsignedShort(); } else if (var2 == 3) { var3 = var1.readUnsignedByte(); - this.field3509 = new int[var3 + 1]; + this.field3505 = new int[var3 + 1]; for (var4 = 0; var4 < var3; ++var4) { - this.field3509[var4] = var1.readUnsignedByte(); + this.field3505[var4] = var1.readUnsignedByte(); } - this.field3509[var3] = 9999999; + this.field3505[var3] = 9999999; } else if (var2 == 4) { - this.field3504 = true; + this.field3514 = true; } else if (var2 == 5) { - this.field3511 = var1.readUnsignedByte(); + this.field3519 = var1.readUnsignedByte(); } else if (var2 == 6) { this.shield = var1.readUnsignedShort(); } else if (var2 == 7) { this.weapon = var1.readUnsignedShort(); } else if (var2 == 8) { - this.field3503 = var1.readUnsignedByte(); + this.field3518 = var1.readUnsignedByte(); } else if (var2 == 9) { - this.field3515 = var1.readUnsignedByte(); + this.field3504 = var1.readUnsignedByte(); } else if (var2 == 10) { - this.field3510 = var1.readUnsignedByte(); + this.field3513 = var1.readUnsignedByte(); } else if (var2 == 11) { - this.field3517 = var1.readUnsignedByte(); + this.field3521 = var1.readUnsignedByte(); } else if (var2 == 12) { var3 = var1.readUnsignedByte(); this.chatFrameIds = new int[var3]; @@ -203,40 +202,40 @@ public class SequenceDefinition extends DualNode { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(S)V", - garbageValue = "30171" + garbageValue = "-31863" ) @Export("postDecode") void postDecode() { - if (this.field3515 == -1) { - if (this.field3509 != null) { - this.field3515 = 2; + if (this.field3504 == -1) { + if (this.field3505 != null) { + this.field3504 = 2; } else { - this.field3515 = 0; + this.field3504 = 0; } } - if (this.field3510 == -1) { - if (this.field3509 != null) { - this.field3510 = 2; + if (this.field3513 == -1) { + if (this.field3505 != null) { + this.field3513 = 2; } else { - this.field3510 = 0; + this.field3513 = 0; } } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Ldh;II)Ldh;", - garbageValue = "330035631" + signature = "(Ldv;IB)Ldv;", + garbageValue = "-48" ) @Export("transformActorModel") public Model transformActorModel(Model var1, int var2) { var2 = this.frameIds[var2]; - Frames var3 = class226.getFrames(var2 >> 16); + Frames var3 = GrandExchangeEvents.getFrames(var2 >> 16); var2 &= 65535; if (var3 == null) { return var1.toSharedSequenceModel(true); @@ -247,15 +246,15 @@ public class SequenceDefinition extends DualNode { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Ldh;IIB)Ldh;", - garbageValue = "2" + signature = "(Ldv;IIS)Ldv;", + garbageValue = "180" ) @Export("transformObjectModel") Model transformObjectModel(Model var1, int var2, int var3) { var2 = this.frameIds[var2]; - Frames var4 = class226.getFrames(var2 >> 16); + Frames var4 = GrandExchangeEvents.getFrames(var2 >> 16); var2 &= 65535; if (var4 == null) { return var1.toSharedSequenceModel(true); @@ -283,15 +282,15 @@ public class SequenceDefinition extends DualNode { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(Ldh;II)Ldh;", - garbageValue = "-1452846924" + signature = "(Ldv;II)Ldv;", + garbageValue = "-1153349389" ) @Export("transformSpotAnimationModel") Model transformSpotAnimationModel(Model var1, int var2) { var2 = this.frameIds[var2]; - Frames var3 = class226.getFrames(var2 >> 16); + Frames var3 = GrandExchangeEvents.getFrames(var2 >> 16); var2 &= 65535; if (var3 == null) { return var1.toSharedSpotAnimationModel(true); @@ -302,21 +301,21 @@ public class SequenceDefinition extends DualNode { } } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(Ldh;ILix;IB)Ldh;", - garbageValue = "-28" + signature = "(Ldv;ILiv;II)Ldv;", + garbageValue = "1587697769" ) @Export("applyTransformations") public Model applyTransformations(Model var1, int var2, SequenceDefinition var3, int var4) { var2 = this.frameIds[var2]; - Frames var5 = class226.getFrames(var2 >> 16); + Frames var5 = GrandExchangeEvents.getFrames(var2 >> 16); var2 &= 65535; if (var5 == null) { return var3.transformActorModel(var1, var4); } else { var4 = var3.frameIds[var4]; - Frames var6 = class226.getFrames(var4 >> 16); + Frames var6 = GrandExchangeEvents.getFrames(var4 >> 16); var4 &= 65535; Model var7; if (var6 == null) { @@ -325,21 +324,21 @@ public class SequenceDefinition extends DualNode { return var7; } else { var7 = var1.toSharedSequenceModel(!var5.hasAlphaTransform(var2) & !var6.hasAlphaTransform(var4)); - var7.animate2(var5, var2, var6, var4, this.field3509); + var7.animate2(var5, var2, var6, var4, this.field3505); return var7; } } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(Ldh;IB)Ldh;", - garbageValue = "-75" + signature = "(Ldv;II)Ldv;", + garbageValue = "-916013843" ) @Export("transformWidgetModel") public Model transformWidgetModel(Model var1, int var2) { int var3 = this.frameIds[var2]; - Frames var4 = class226.getFrames(var3 >> 16); + Frames var4 = GrandExchangeEvents.getFrames(var3 >> 16); var3 &= 65535; if (var4 == null) { return var1.toSharedSequenceModel(true); @@ -348,7 +347,7 @@ public class SequenceDefinition extends DualNode { int var6 = 0; if (this.chatFrameIds != null && var2 < this.chatFrameIds.length) { var6 = this.chatFrameIds[var2]; - var5 = class226.getFrames(var6 >> 16); + var5 = GrandExchangeEvents.getFrames(var6 >> 16); var6 &= 65535; } @@ -366,22 +365,22 @@ public class SequenceDefinition extends DualNode { } } - @ObfuscatedName("et") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-645881783" + signature = "(Ljava/lang/String;I)Z", + garbageValue = "1272275521" ) - @Export("forceDisconnect") - static final void forceDisconnect(int var0) { - DynamicObject.logOut(); - switch(var0) { - case 1: - Login.loginIndex = 24; - PlayerType.setLoginResponseString("", "You were disconnected from the server.", ""); - break; - case 2: - class3.method48(); + @Export("isValidURL") + static boolean isValidURL(String var0) { + if (var0 == null) { + return false; + } else { + try { + new URL(var0); + return true; + } catch (MalformedURLException var2) { + return false; + } } - } } diff --git a/runescape-client/src/main/java/ServerBuild.java b/runescape-client/src/main/java/ServerBuild.java index a058ffcd18..2b85284c89 100644 --- a/runescape-client/src/main/java/ServerBuild.java +++ b/runescape-client/src/main/java/ServerBuild.java @@ -4,41 +4,41 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hs") +@ObfuscatedName("hr") @Implements("ServerBuild") public class ServerBuild { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhs;" + signature = "Lhr;" ) @Export("LIVE") - static final ServerBuild LIVE; - @ObfuscatedName("n") + public static final ServerBuild LIVE; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhs;" + signature = "Lhr;" ) @Export("BUILDLIVE") - static final ServerBuild BUILDLIVE; - @ObfuscatedName("v") + public static final ServerBuild BUILDLIVE; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhs;" + signature = "Lhr;" ) @Export("RC") - static final ServerBuild RC; - @ObfuscatedName("u") + public static final ServerBuild RC; + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lhs;" + signature = "Lhr;" ) @Export("WIP") - static final ServerBuild WIP; - @ObfuscatedName("r") + public static final ServerBuild WIP; + @ObfuscatedName("v") @Export("name") public final String name; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1051483467 + intValue = -96016129 ) - final int field3079; + public final int field3088; static { LIVE = new ServerBuild("LIVE", 0); @@ -49,81 +49,18 @@ public class ServerBuild { ServerBuild(String var1, int var2) { this.name = var1; - this.field3079 = var2; + this.field3088 = var2; } - @ObfuscatedName("p") + @ObfuscatedName("ju") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;II[BII)I", - garbageValue = "1213653809" + signature = "(IIIIIIII)V", + garbageValue = "1070520785" ) - @Export("encodeStringCp1252") - public static int encodeStringCp1252(CharSequence var0, int var1, int var2, byte[] var3, int var4) { - int var5 = var2 - var1; - - for (int var6 = 0; var6 < var5; ++var6) { - char var7 = var0.charAt(var6 + var1); - if (var7 > 0 && var7 < 128 || var7 >= 160 && var7 <= 255) { - var3[var6 + var4] = (byte)var7; - } else if (var7 == 8364) { - var3[var6 + var4] = -128; - } else if (var7 == 8218) { - var3[var6 + var4] = -126; - } else if (var7 == 402) { - var3[var6 + var4] = -125; - } else if (var7 == 8222) { - var3[var6 + var4] = -124; - } else if (var7 == 8230) { - var3[var6 + var4] = -123; - } else if (var7 == 8224) { - var3[var6 + var4] = -122; - } else if (var7 == 8225) { - var3[var6 + var4] = -121; - } else if (var7 == 710) { - var3[var6 + var4] = -120; - } else if (var7 == 8240) { - var3[var6 + var4] = -119; - } else if (var7 == 352) { - var3[var6 + var4] = -118; - } else if (var7 == 8249) { - var3[var6 + var4] = -117; - } else if (var7 == 338) { - var3[var6 + var4] = -116; - } else if (var7 == 381) { - var3[var6 + var4] = -114; - } else if (var7 == 8216) { - var3[var6 + var4] = -111; - } else if (var7 == 8217) { - var3[var6 + var4] = -110; - } else if (var7 == 8220) { - var3[var6 + var4] = -109; - } else if (var7 == 8221) { - var3[var6 + var4] = -108; - } else if (var7 == 8226) { - var3[var6 + var4] = -107; - } else if (var7 == 8211) { - var3[var6 + var4] = -106; - } else if (var7 == 8212) { - var3[var6 + var4] = -105; - } else if (var7 == 732) { - var3[var6 + var4] = -104; - } else if (var7 == 8482) { - var3[var6 + var4] = -103; - } else if (var7 == 353) { - var3[var6 + var4] = -102; - } else if (var7 == 8250) { - var3[var6 + var4] = -101; - } else if (var7 == 339) { - var3[var6 + var4] = -100; - } else if (var7 == 382) { - var3[var6 + var4] = -98; - } else if (var7 == 376) { - var3[var6 + var4] = -97; - } else { - var3[var6 + var4] = 63; - } + @Export("updateRootInterface") + static final void updateRootInterface(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { + if (TextureProvider.loadInterface(var0)) { + ArchiveLoader.updateInterface(Widget.Widget_interfaceComponents[var0], -1, var1, var2, var3, var4, var5, var6); } - - return var5; } } diff --git a/runescape-client/src/main/java/ServerPacket.java b/runescape-client/src/main/java/ServerPacket.java index c897190163..7247d0a917 100644 --- a/runescape-client/src/main/java/ServerPacket.java +++ b/runescape-client/src/main/java/ServerPacket.java @@ -3,686 +3,544 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("gv") +@ObfuscatedName("ga") @Implements("ServerPacket") public class ServerPacket { - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2126; - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2134; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2105; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2098; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2113; - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2099; - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2101; - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2177; - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2103; - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2140; - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2132; - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2167; - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2107; @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2102; - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2109; - @ObfuscatedName("w") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2110; - @ObfuscatedName("t") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2111; - @ObfuscatedName("g") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2112; - @ObfuscatedName("x") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2145; - @ObfuscatedName("h") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2114; - @ObfuscatedName("s") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2115; - @ObfuscatedName("f") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2096; - @ObfuscatedName("j") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2139; - @ObfuscatedName("d") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2118; - @ObfuscatedName("l") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2119; - @ObfuscatedName("k") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2120; - @ObfuscatedName("ac") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2095; - @ObfuscatedName("az") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2122; - @ObfuscatedName("aw") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2123; - @ObfuscatedName("aa") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2124; - @ObfuscatedName("ap") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2104; - @ObfuscatedName("ar") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2133; - @ObfuscatedName("ab") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2127; - @ObfuscatedName("ax") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2128; - @ObfuscatedName("as") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2117; - @ObfuscatedName("ao") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2130; - @ObfuscatedName("al") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2159; - @ObfuscatedName("ad") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2141; - @ObfuscatedName("an") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2121; - @ObfuscatedName("ai") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2106; - @ObfuscatedName("ak") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2135; - @ObfuscatedName("aq") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2136; - @ObfuscatedName("am") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2137; - @ObfuscatedName("ae") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2138; - @ObfuscatedName("av") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2100; - @ObfuscatedName("ah") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2129; - @ObfuscatedName("ag") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2174; - @ObfuscatedName("aj") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2182; - @ObfuscatedName("ay") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2168; - @ObfuscatedName("au") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2144; - @ObfuscatedName("af") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2142; - @ObfuscatedName("at") - @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) public static final ServerPacket field2146; - @ObfuscatedName("bx") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2147; - @ObfuscatedName("bh") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2148; - @ObfuscatedName("bd") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2149; - @ObfuscatedName("bm") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2150; - @ObfuscatedName("bv") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2151; - @ObfuscatedName("bj") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2152; - @ObfuscatedName("bs") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2153; - @ObfuscatedName("bz") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2154; - @ObfuscatedName("bc") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2155; - @ObfuscatedName("bk") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2156; - @ObfuscatedName("ba") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2097; - @ObfuscatedName("bn") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2158; - @ObfuscatedName("be") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2157; - @ObfuscatedName("bu") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2160; - @ObfuscatedName("bi") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2161; - @ObfuscatedName("bb") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2162; - @ObfuscatedName("bt") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2163; - @ObfuscatedName("by") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2164; - @ObfuscatedName("bq") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2165; - @ObfuscatedName("bo") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2116; - @ObfuscatedName("br") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2143; - @ObfuscatedName("bl") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2166; - @ObfuscatedName("bf") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2169; - @ObfuscatedName("bg") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2170; - @ObfuscatedName("bw") - @ObfuscatedSignature( - signature = "Lgv;" - ) - public static final ServerPacket field2171; - @ObfuscatedName("bp") - @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) public static final ServerPacket field2172; - @ObfuscatedName("cz") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" + ) + public static final ServerPacket field2093; + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2113; + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2095; + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2096; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2156; + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lga;" ) public static final ServerPacket field2173; - @ObfuscatedName("ck") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - public static final ServerPacket field2183; - @ObfuscatedName("cv") + public static final ServerPacket field2091; + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - public static final ServerPacket field2175; - @ObfuscatedName("co") + public static final ServerPacket field2174; + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - public static final ServerPacket field2176; - @ObfuscatedName("cs") + public static final ServerPacket field2101; + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - public static final ServerPacket field2179; - @ObfuscatedName("cg") + public static final ServerPacket field2126; + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - public static final ServerPacket field2178; - @ObfuscatedName("cn") + public static final ServerPacket field2103; + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" + ) + public static final ServerPacket field2104; + @ObfuscatedName("x") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2105; + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2147; + @ObfuscatedName("r") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2107; + @ObfuscatedName("e") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2102; + @ObfuscatedName("s") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2099; + @ObfuscatedName("b") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2110; + @ObfuscatedName("z") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2111; + @ObfuscatedName("f") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2112; + @ObfuscatedName("g") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2123; + @ObfuscatedName("w") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2114; + @ObfuscatedName("u") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2115; + @ObfuscatedName("y") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2116; + @ObfuscatedName("aa") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2117; + @ObfuscatedName("aw") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2106; + @ObfuscatedName("ar") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2119; + @ObfuscatedName("aq") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2120; + @ObfuscatedName("ad") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2108; + @ObfuscatedName("ag") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2122; + @ObfuscatedName("ak") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2092; + @ObfuscatedName("av") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2124; + @ObfuscatedName("am") + @ObfuscatedSignature( + signature = "Lga;" ) public static final ServerPacket field2125; + @ObfuscatedName("ab") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2097; + @ObfuscatedName("ax") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2137; + @ObfuscatedName("al") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2128; + @ObfuscatedName("ap") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2129; + @ObfuscatedName("aj") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2130; + @ObfuscatedName("ae") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2131; + @ObfuscatedName("au") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2135; + @ObfuscatedName("ah") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2142; + @ObfuscatedName("an") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2134; + @ObfuscatedName("af") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2118; + @ObfuscatedName("ay") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2136; + @ObfuscatedName("az") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2167; + @ObfuscatedName("ao") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2094; + @ObfuscatedName("ai") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2158; + @ObfuscatedName("ac") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2140; + @ObfuscatedName("at") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2141; + @ObfuscatedName("as") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2166; + @ObfuscatedName("ba") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2143; + @ObfuscatedName("bg") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2144; + @ObfuscatedName("bc") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2145; + @ObfuscatedName("bd") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2154; + @ObfuscatedName("bx") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2098; + @ObfuscatedName("bl") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2148; + @ObfuscatedName("bh") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2149; + @ObfuscatedName("bu") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2109; + @ObfuscatedName("br") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2155; + @ObfuscatedName("bq") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2152; + @ObfuscatedName("bi") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2153; + @ObfuscatedName("be") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2133; + @ObfuscatedName("bt") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2162; + @ObfuscatedName("bs") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2150; + @ObfuscatedName("bj") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2157; + @ObfuscatedName("bm") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2139; + @ObfuscatedName("bn") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2159; + @ObfuscatedName("bz") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2160; + @ObfuscatedName("bo") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2161; + @ObfuscatedName("bk") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2127; + @ObfuscatedName("bv") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2163; + @ObfuscatedName("bw") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2164; + @ObfuscatedName("bb") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2165; + @ObfuscatedName("bf") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2121; + @ObfuscatedName("by") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2151; + @ObfuscatedName("bp") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2168; + @ObfuscatedName("cx") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2169; + @ObfuscatedName("cv") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2170; + @ObfuscatedName("ce") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2171; + @ObfuscatedName("cw") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2138; @ObfuscatedName("cd") @ObfuscatedSignature( - signature = "Lgv;" + signature = "Lga;" ) - public static final ServerPacket field2180; - @ObfuscatedName("fl") - @ObfuscatedGetter( - intValue = -302162321 + public static final ServerPacket field2100; + @ObfuscatedName("cn") + @ObfuscatedSignature( + signature = "Lga;" ) - static int field2131; + public static final ServerPacket field2132; + @ObfuscatedName("cr") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2175; + @ObfuscatedName("ci") + @ObfuscatedSignature( + signature = "Lga;" + ) + public static final ServerPacket field2176; @ObfuscatedName("cy") @ObfuscatedGetter( - intValue = -1102910255 + intValue = 2057045205 ) @Export("id") public final int id; - @ObfuscatedName("cj") + @ObfuscatedName("cl") @ObfuscatedGetter( - intValue = -1349590603 + intValue = -157348015 ) @Export("length") public final int length; static { - field2126 = new ServerPacket(0, 6); - field2134 = new ServerPacket(1, -2); - field2105 = new ServerPacket(2, 7); - field2098 = new ServerPacket(3, -2); - field2113 = new ServerPacket(4, -2); - field2099 = new ServerPacket(5, 0); - field2101 = new ServerPacket(6, 2); - field2177 = new ServerPacket(7, -1); - field2103 = new ServerPacket(8, 4); - field2140 = new ServerPacket(9, 6); - field2132 = new ServerPacket(10, 5); - field2167 = new ServerPacket(11, 1); - field2107 = new ServerPacket(12, 8); - field2102 = new ServerPacket(13, 10); - field2109 = new ServerPacket(14, -2); - field2110 = new ServerPacket(15, -2); - field2111 = new ServerPacket(16, 0); - field2112 = new ServerPacket(17, 1); - field2145 = new ServerPacket(18, 20); - field2114 = new ServerPacket(19, 6); - field2115 = new ServerPacket(20, -1); - field2096 = new ServerPacket(21, 14); - field2139 = new ServerPacket(22, -1); - field2118 = new ServerPacket(23, -1); - field2119 = new ServerPacket(24, 6); - field2120 = new ServerPacket(25, 2); - field2095 = new ServerPacket(26, 8); - field2122 = new ServerPacket(27, 12); - field2123 = new ServerPacket(28, -2); - field2124 = new ServerPacket(29, 2); - field2104 = new ServerPacket(30, 3); - field2133 = new ServerPacket(31, -2); - field2127 = new ServerPacket(32, -2); - field2128 = new ServerPacket(33, 5); - field2117 = new ServerPacket(34, 3); - field2130 = new ServerPacket(35, 1); - field2159 = new ServerPacket(36, -2); - field2141 = new ServerPacket(37, 6); - field2121 = new ServerPacket(38, 15); - field2106 = new ServerPacket(39, 6); - field2135 = new ServerPacket(40, 6); - field2136 = new ServerPacket(41, 5); - field2137 = new ServerPacket(42, 6); - field2138 = new ServerPacket(43, 1); - field2100 = new ServerPacket(44, 2); - field2129 = new ServerPacket(45, -2); - field2174 = new ServerPacket(46, 6); - field2182 = new ServerPacket(47, 1); - field2168 = new ServerPacket(48, -2); - field2144 = new ServerPacket(49, -2); - field2142 = new ServerPacket(50, 8); - field2146 = new ServerPacket(51, 4); - field2147 = new ServerPacket(52, 0); - field2148 = new ServerPacket(53, -2); - field2149 = new ServerPacket(54, 4); - field2150 = new ServerPacket(55, 1); - field2151 = new ServerPacket(56, -2); - field2152 = new ServerPacket(57, 2); - field2153 = new ServerPacket(58, 0); - field2154 = new ServerPacket(59, -2); - field2155 = new ServerPacket(60, 2); - field2156 = new ServerPacket(61, -2); - field2097 = new ServerPacket(62, -1); - field2158 = new ServerPacket(63, 6); - field2157 = new ServerPacket(64, 4); - field2160 = new ServerPacket(65, 2); - field2161 = new ServerPacket(66, -2); - field2162 = new ServerPacket(67, 0); - field2163 = new ServerPacket(68, 6); - field2164 = new ServerPacket(69, 2); - field2165 = new ServerPacket(70, 28); - field2116 = new ServerPacket(71, -2); - field2143 = new ServerPacket(72, 2); - field2166 = new ServerPacket(73, 8); - field2169 = new ServerPacket(74, 0); - field2170 = new ServerPacket(75, 10); - field2171 = new ServerPacket(76, 0); - field2172 = new ServerPacket(77, 4); - field2173 = new ServerPacket(78, 5); - field2183 = new ServerPacket(79, 2); - field2175 = new ServerPacket(80, -1); - field2176 = new ServerPacket(81, 4); - field2179 = new ServerPacket(82, -2); - field2178 = new ServerPacket(83, 5); - field2125 = new ServerPacket(84, 7); - field2180 = new ServerPacket(85, 4); + field2146 = new ServerPacket(0, 2); + field2172 = new ServerPacket(1, -2); + field2093 = new ServerPacket(2, 0); + field2113 = new ServerPacket(3, 10); + field2095 = new ServerPacket(4, -2); + field2096 = new ServerPacket(5, 4); + field2156 = new ServerPacket(6, -1); + field2173 = new ServerPacket(7, -2); + field2091 = new ServerPacket(8, 2); + field2174 = new ServerPacket(9, -2); + field2101 = new ServerPacket(10, 3); + field2126 = new ServerPacket(11, 2); + field2103 = new ServerPacket(12, 0); + field2104 = new ServerPacket(13, -2); + field2105 = new ServerPacket(14, -1); + field2147 = new ServerPacket(15, -2); + field2107 = new ServerPacket(16, 4); + field2102 = new ServerPacket(17, -2); + field2099 = new ServerPacket(18, 4); + field2110 = new ServerPacket(19, -2); + field2111 = new ServerPacket(20, -2); + field2112 = new ServerPacket(21, 0); + field2123 = new ServerPacket(22, 5); + field2114 = new ServerPacket(23, 6); + field2115 = new ServerPacket(24, 3); + field2116 = new ServerPacket(25, 6); + field2117 = new ServerPacket(26, 6); + field2106 = new ServerPacket(27, 1); + field2119 = new ServerPacket(28, -2); + field2120 = new ServerPacket(29, 6); + field2108 = new ServerPacket(30, -1); + field2122 = new ServerPacket(31, -2); + field2092 = new ServerPacket(32, 1); + field2124 = new ServerPacket(33, 5); + field2125 = new ServerPacket(34, 6); + field2097 = new ServerPacket(35, 6); + field2137 = new ServerPacket(36, 2); + field2128 = new ServerPacket(37, 6); + field2129 = new ServerPacket(38, 20); + field2130 = new ServerPacket(39, 6); + field2131 = new ServerPacket(40, -2); + field2135 = new ServerPacket(41, -2); + field2142 = new ServerPacket(42, -1); + field2134 = new ServerPacket(43, 6); + field2118 = new ServerPacket(44, 1); + field2136 = new ServerPacket(45, 2); + field2167 = new ServerPacket(46, 4); + field2094 = new ServerPacket(47, -2); + field2158 = new ServerPacket(48, 4); + field2140 = new ServerPacket(49, 6); + field2141 = new ServerPacket(50, 10); + field2166 = new ServerPacket(51, -1); + field2143 = new ServerPacket(52, 7); + field2144 = new ServerPacket(53, 8); + field2145 = new ServerPacket(54, 4); + field2154 = new ServerPacket(55, 1); + field2098 = new ServerPacket(56, -2); + field2148 = new ServerPacket(57, -1); + field2149 = new ServerPacket(58, 2); + field2109 = new ServerPacket(59, 0); + field2155 = new ServerPacket(60, 8); + field2152 = new ServerPacket(61, 6); + field2153 = new ServerPacket(62, -2); + field2133 = new ServerPacket(63, 2); + field2162 = new ServerPacket(64, -2); + field2150 = new ServerPacket(65, 15); + field2157 = new ServerPacket(66, 5); + field2139 = new ServerPacket(67, 8); + field2159 = new ServerPacket(68, 7); + field2160 = new ServerPacket(69, 1); + field2161 = new ServerPacket(70, 2); + field2127 = new ServerPacket(71, 4); + field2163 = new ServerPacket(72, 28); + field2164 = new ServerPacket(73, -2); + field2165 = new ServerPacket(74, 2); + field2121 = new ServerPacket(75, 1); + field2151 = new ServerPacket(76, 14); + field2168 = new ServerPacket(77, 5); + field2169 = new ServerPacket(78, 8); + field2170 = new ServerPacket(79, 0); + field2171 = new ServerPacket(80, 5); + field2138 = new ServerPacket(81, 2); + field2100 = new ServerPacket(82, 0); + field2132 = new ServerPacket(83, -2); + field2175 = new ServerPacket(84, 0); + field2176 = new ServerPacket(85, 12); } ServerPacket(int var1, int var2) { this.id = var1; this.length = var2; } - - @ObfuscatedName("ac") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-402041204" - ) - static int method3577(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.CLIENTCLOCK) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.cycle; - return 1; - } else { - int var3; - int var4; - if (var0 == ScriptOpcodes.INV_GETOBJ) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapDecoration.method344(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.INV_GETNUM) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = FloorUnderlayDefinition.ItemContainer_getCount(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.INV_TOTAL) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapEvent.method801(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.INV_SIZE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = StudioGame.getInvDefinition(var3).size; - return 1; - } else if (var0 == ScriptOpcodes.STAT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.currentLevels[var3]; - return 1; - } else if (var0 == ScriptOpcodes.STAT_BASE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.levels[var3]; - return 1; - } else if (var0 == ScriptOpcodes.STAT_XP) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.experience[var3]; - return 1; - } else { - int var5; - if (var0 == ScriptOpcodes.COORD) { - var3 = WorldMapRectangle.plane; - var4 = class223.baseX * 64 + (class223.localPlayer.x >> 7); - var5 = class286.baseY * 64 + (class223.localPlayer.y >> 7); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var4 << 14) + var5 + (var3 << 28); - return 1; - } else if (var0 == ScriptOpcodes.COORDX) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 >> 14 & 16383; - return 1; - } else if (var0 == ScriptOpcodes.COORDZ) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 >> 28; - return 1; - } else if (var0 == ScriptOpcodes.COORDY) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 & 16383; - return 1; - } else if (var0 == ScriptOpcodes.MAP_MEMBERS) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.isMembersWorld ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.INVOTHER_GETOBJ) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] + 32768; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapDecoration.method344(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.INVOTHER_GETNUM) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] + 32768; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = FloorUnderlayDefinition.ItemContainer_getCount(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.INVOTHER_TOTAL) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] + 32768; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapEvent.method801(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.STAFFMODLEVEL) { - if (Client.staffModLevel >= 2) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.staffModLevel; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.REBOOTTIMER) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.rebootTimer; - return 1; - } else if (var0 == ScriptOpcodes.MAP_WORLD) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.worldId; - return 1; - } else if (var0 == ScriptOpcodes.RUNENERGY_VISIBLE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.runEnergy; - return 1; - } else if (var0 == ScriptOpcodes.RUNWEIGHT_VISIBLE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.weight; - return 1; - } else if (var0 == ScriptOpcodes.PLAYERMOD) { - if (Client.playerMod) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDFLAGS) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.worldProperties; - return 1; - } else if (var0 == ScriptOpcodes.MOVECOORD) { - Interpreter.Interpreter_intStackSize -= 4; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - int var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - var3 += var4 << 14; - var3 += var5 << 28; - var3 += var6; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; - return 1; - } else { - return 2; - } - } - } - } } diff --git a/runescape-client/src/main/java/Skeleton.java b/runescape-client/src/main/java/Skeleton.java index b8869f8243..7546d7f2d4 100644 --- a/runescape-client/src/main/java/Skeleton.java +++ b/runescape-client/src/main/java/Skeleton.java @@ -1,33 +1,29 @@ +import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ew") +@ObfuscatedName("ee") @Implements("Skeleton") public class Skeleton extends Node { - @ObfuscatedName("bn") - @ObfuscatedSignature( - signature = "Llp;" - ) - static IndexedSprite field1767; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -1879620261 + intValue = -567509563 ) @Export("id") int id; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1324463493 + intValue = 774941897 ) @Export("count") int count; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("transformTypes") int[] transformTypes; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("labels") int[][] labels; @@ -54,4 +50,39 @@ public class Skeleton extends Node { } } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(I)Lbw;", + garbageValue = "25013403" + ) + static ClientPreferences method3201() { + AccessFile var0 = null; + ClientPreferences var1 = new ClientPreferences(); + + try { + var0 = CollisionMap.getPreferencesFile("", MouseHandler.field458.name, false); + byte[] var2 = new byte[(int)var0.length()]; + + int var4; + for (int var3 = 0; var3 < var2.length; var3 += var4) { + var4 = var0.read(var2, var3, var2.length - var3); + if (var4 == -1) { + throw new IOException(); + } + } + + var1 = new ClientPreferences(new Buffer(var2)); + } catch (Exception var6) { + } + + try { + if (var0 != null) { + var0.close(); + } + } catch (Exception var5) { + } + + return var1; + } } diff --git a/runescape-client/src/main/java/Skills.java b/runescape-client/src/main/java/Skills.java index e92d067fd4..d26720b804 100644 --- a/runescape-client/src/main/java/Skills.java +++ b/runescape-client/src/main/java/Skills.java @@ -3,15 +3,21 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hm") +@ObfuscatedName("hd") @Implements("Skills") public class Skills { - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("Skills_enabled") public static final boolean[] Skills_enabled; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("Skills_experienceTable") public static int[] Skills_experienceTable; + @ObfuscatedName("fh") + @ObfuscatedSignature( + signature = "Lev;" + ) + @Export("urlRequester") + static UrlRequester urlRequester; static { Skills_enabled = new boolean[]{true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false}; @@ -27,38 +33,24 @@ public class Skills { } - @ObfuscatedName("z") + @ObfuscatedName("kc") @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "255" + signature = "(I)V", + garbageValue = "3031310" ) - static void method4088() { - if (TaskHandler.javaVendor.toLowerCase().indexOf("microsoft") != -1) { - KeyHandler.KeyHandler_keyCodes[186] = 57; - KeyHandler.KeyHandler_keyCodes[187] = 27; - KeyHandler.KeyHandler_keyCodes[188] = 71; - KeyHandler.KeyHandler_keyCodes[189] = 26; - KeyHandler.KeyHandler_keyCodes[190] = 72; - KeyHandler.KeyHandler_keyCodes[191] = 73; - KeyHandler.KeyHandler_keyCodes[192] = 58; - KeyHandler.KeyHandler_keyCodes[219] = 42; - KeyHandler.KeyHandler_keyCodes[220] = 74; - KeyHandler.KeyHandler_keyCodes[221] = 43; - KeyHandler.KeyHandler_keyCodes[222] = 59; - KeyHandler.KeyHandler_keyCodes[223] = 28; - } else { - KeyHandler.KeyHandler_keyCodes[44] = 71; - KeyHandler.KeyHandler_keyCodes[45] = 26; - KeyHandler.KeyHandler_keyCodes[46] = 72; - KeyHandler.KeyHandler_keyCodes[47] = 73; - KeyHandler.KeyHandler_keyCodes[59] = 57; - KeyHandler.KeyHandler_keyCodes[61] = 27; - KeyHandler.KeyHandler_keyCodes[91] = 42; - KeyHandler.KeyHandler_keyCodes[92] = 74; - KeyHandler.KeyHandler_keyCodes[93] = 43; - KeyHandler.KeyHandler_keyCodes[192] = 28; - KeyHandler.KeyHandler_keyCodes[222] = 58; - KeyHandler.KeyHandler_keyCodes[520] = 59; + static final void method4271() { + PacketBufferNode var0 = SoundSystem.getPacketBufferNode(ClientPacket.field2265, Client.packetWriter.isaacCipher); + Client.packetWriter.addNode(var0); + + for (InterfaceParent var1 = (InterfaceParent)Client.interfaceParents.first(); var1 != null; var1 = (InterfaceParent)Client.interfaceParents.next()) { + if (var1.type == 0 || var1.type == 3) { + GrandExchangeOfferOwnWorldComparator.closeInterface(var1, true); + } + } + + if (Client.meslayerContinueWidget != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(Client.meslayerContinueWidget); + Client.meslayerContinueWidget = null; } } diff --git a/runescape-client/src/main/java/SoftWrapper.java b/runescape-client/src/main/java/SoftWrapper.java index d2d78f39c0..b720628866 100644 --- a/runescape-client/src/main/java/SoftWrapper.java +++ b/runescape-client/src/main/java/SoftWrapper.java @@ -3,10 +3,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("ed") +@ObfuscatedName("ea") @Implements("SoftWrapper") public class SoftWrapper extends Wrapper { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("ref") SoftReference ref; @@ -15,13 +15,13 @@ public class SoftWrapper extends Wrapper { this.ref = new SoftReference(var1); } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("get") Object get() { return this.ref.get(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("isSoft") boolean isSoft() { return true; diff --git a/runescape-client/src/main/java/SoundCache.java b/runescape-client/src/main/java/SoundCache.java index 424f78d5f1..7a215c993e 100644 --- a/runescape-client/src/main/java/SoundCache.java +++ b/runescape-client/src/main/java/SoundCache.java @@ -2,37 +2,38 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("dq") +@ObfuscatedName("dm") @Implements("SoundCache") public class SoundCache { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("soundEffectIndex") AbstractArchive soundEffectIndex; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("musicSampleIndex") AbstractArchive musicSampleIndex; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("musicSamples") NodeHashTable musicSamples; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Llq;" + signature = "Llh;" ) @Export("rawSounds") NodeHashTable rawSounds; @ObfuscatedSignature( - signature = "(Lhp;Lhp;)V" + signature = "(Lhq;Lhq;)V" ) public SoundCache(AbstractArchive var1, AbstractArchive var2) { this.musicSamples = new NodeHashTable(256); @@ -41,10 +42,10 @@ public class SoundCache { this.musicSampleIndex = var2; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II[II)Lch;", - garbageValue = "1393796182" + signature = "(II[II)Lca;", + garbageValue = "-33690704" ) @Export("getSoundEffect0") RawSound getSoundEffect0(int var1, int var2, int[] var3) { @@ -72,10 +73,10 @@ public class SoundCache { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II[II)Lch;", - garbageValue = "2026666010" + signature = "(II[II)Lca;", + garbageValue = "393198324" ) @Export("getMusicSample0") RawSound getMusicSample0(int var1, int var2, int[] var3) { @@ -109,10 +110,10 @@ public class SoundCache { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I[II)Lch;", - garbageValue = "223393704" + signature = "(I[II)Lca;", + garbageValue = "-1954377322" ) @Export("getSoundEffect") public RawSound getSoundEffect(int var1, int[] var2) { @@ -125,10 +126,10 @@ public class SoundCache { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I[II)Lch;", - garbageValue = "-1432840715" + signature = "(I[II)Lca;", + garbageValue = "-1912109066" ) @Export("getMusicSample") public RawSound getMusicSample(int var1, int[] var2) { @@ -141,69 +142,51 @@ public class SoundCache { } } - @ObfuscatedName("p") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;IZI)I", - garbageValue = "2108549296" + signature = "(ILcj;ZI)I", + garbageValue = "-1732258105" ) - @Export("parseIntCustomRadix") - static int parseIntCustomRadix(CharSequence var0, int var1, boolean var2) { - if (var1 >= 2 && var1 <= 36) { - boolean var3 = false; - boolean var4 = false; - int var5 = 0; - int var6 = var0.length(); - - for (int var7 = 0; var7 < var6; ++var7) { - char var8 = var0.charAt(var7); - if (var7 == 0) { - if (var8 == '-') { - var3 = true; - continue; - } - - if (var8 == '+') { - continue; - } - } - - int var10; - if (var8 >= '0' && var8 <= '9') { - var10 = var8 - '0'; - } else if (var8 >= 'A' && var8 <= 'Z') { - var10 = var8 - '7'; + static int method2673(int var0, Script var1, boolean var2) { + Widget var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + if (var0 == ScriptOpcodes.IF_GETTARGETMASK) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator5.method3551(class195.getWidgetClickMask(var3)); + return 1; + } else if (var0 != ScriptOpcodes.IF_GETOP) { + if (var0 == ScriptOpcodes.IF_GETOPBASE) { + if (var3.dataText == null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; } else { - if (var8 < 'a' || var8 > 'z') { - throw new NumberFormatException(); - } - - var10 = var8 - 'W'; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.dataText; } - if (var10 >= var1) { - throw new NumberFormatException(); - } - - if (var3) { - var10 = -var10; - } - - int var9 = var5 * var1 + var10; - if (var9 / var1 != var5) { - throw new NumberFormatException(); - } - - var5 = var9; - var4 = true; - } - - if (!var4) { - throw new NumberFormatException(); + return 1; } else { - return var5; + return 2; } } else { - throw new IllegalArgumentException("" + var1); + int var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + --var4; + if (var3.actions != null && var4 < var3.actions.length && var3.actions[var4] != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.actions[var4]; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } + } + + @ObfuscatedName("lv") + @ObfuscatedSignature( + signature = "(Lhi;B)Ljava/lang/String;", + garbageValue = "1" + ) + static String method2666(Widget var0) { + if (UserComparator5.method3551(class195.getWidgetClickMask(var0)) == 0) { + return null; + } else { + return var0.spellActionName != null && var0.spellActionName.trim().length() != 0 ? var0.spellActionName : null; } } } diff --git a/runescape-client/src/main/java/SoundEffect.java b/runescape-client/src/main/java/SoundEffect.java index 3db09e36dc..51a1119d2d 100644 --- a/runescape-client/src/main/java/SoundEffect.java +++ b/runescape-client/src/main/java/SoundEffect.java @@ -3,24 +3,24 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cm") +@ObfuscatedName("cg") @Implements("SoundEffect") public class SoundEffect { + @ObfuscatedName("t") + @Export("start") + int start; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "[Ldk;" + signature = "[Lda;" ) @Export("instruments") Instrument[] instruments; - @ObfuscatedName("v") - @Export("start") - int start; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("end") int end; @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) SoundEffect(Buffer var1) { this.instruments = new Instrument[10]; @@ -38,9 +38,9 @@ public class SoundEffect { this.end = var1.readUnsignedShort(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "()Lch;" + signature = "()Lca;" ) @Export("toRawSound") public RawSound toRawSound() { @@ -48,7 +48,7 @@ public class SoundEffect { return new RawSound(22050, var1, this.start * 22050 / 1000, this.end * 22050 / 1000); } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("calculateDelay") public final int calculateDelay() { int var1 = 9999999; @@ -83,7 +83,7 @@ public class SoundEffect { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("mix") final byte[] mix() { int var1 = 0; @@ -122,9 +122,9 @@ public class SoundEffect { } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;II)Lcm;" + signature = "(Lhq;II)Lcg;" ) @Export("readSoundEffect") public static SoundEffect readSoundEffect(AbstractArchive var0, int var1, int var2) { diff --git a/runescape-client/src/main/java/SoundEnvelope.java b/runescape-client/src/main/java/SoundEnvelope.java index 9cda32f8de..cd11bf28df 100644 --- a/runescape-client/src/main/java/SoundEnvelope.java +++ b/runescape-client/src/main/java/SoundEnvelope.java @@ -3,42 +3,42 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dm") +@ObfuscatedName("dd") @Implements("SoundEnvelope") public class SoundEnvelope { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("segments") int segments; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("durations") int[] durations; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("phases") int[] phases; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("start") int start; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("end") int end; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("form") int form; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("ticks") int ticks; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("phaseIndex") int phaseIndex; - @ObfuscatedName("y") - @Export("max") - int max; @ObfuscatedName("i") @Export("step") int step; - @ObfuscatedName("c") + @ObfuscatedName("d") @Export("amplitude") int amplitude; + @ObfuscatedName("m") + @Export("max") + int max; SoundEnvelope() { this.segments = 2; @@ -50,9 +50,9 @@ public class SoundEnvelope { this.phases[1] = 65535; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) @Export("decode") final void decode(Buffer var1) { @@ -62,9 +62,9 @@ public class SoundEnvelope { this.decodeSegments(var1); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) @Export("decodeSegments") final void decodeSegments(Buffer var1) { @@ -79,7 +79,7 @@ public class SoundEnvelope { } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("reset") final void reset() { this.ticks = 0; @@ -89,7 +89,7 @@ public class SoundEnvelope { this.max = 0; } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("doStep") final int doStep(int var1) { if (this.max >= this.ticks) { diff --git a/runescape-client/src/main/java/SoundSystem.java b/runescape-client/src/main/java/SoundSystem.java index 68f6e74f84..b8d5536017 100644 --- a/runescape-client/src/main/java/SoundSystem.java +++ b/runescape-client/src/main/java/SoundSystem.java @@ -3,12 +3,14 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dn") +@ObfuscatedName("dl") @Implements("SoundSystem") public class SoundSystem implements Runnable { - @ObfuscatedName("z") + @ObfuscatedName("q") + static byte[][][] field1414; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "[Ldv;" + signature = "[Ldq;" ) @Export("players") volatile PcmPlayer[] players; @@ -26,42 +28,42 @@ public class SoundSystem implements Runnable { } } } catch (Exception var4) { - class32.RunException_sendStackTrace((String)null, var4); + User.RunException_sendStackTrace((String)null, var4); } } - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "536478263" + signature = "(Lgx;Llm;I)Lgk;", + garbageValue = "-1503020688" ) - public static void method2468(Buffer var0, int var1) { - if (JagexCache.JagexCache_randomDat != null) { - try { - JagexCache.JagexCache_randomDat.seek(0L); - JagexCache.JagexCache_randomDat.write(var0.array, var1, 24); - } catch (Exception var3) { - } + @Export("getPacketBufferNode") + public static PacketBufferNode getPacketBufferNode(ClientPacket var0, IsaacCipher var1) { + PacketBufferNode var2; + if (PacketBufferNode.PacketBufferNode_packetBufferNodeCount == 0) { + var2 = new PacketBufferNode(); + } else { + var2 = PacketBufferNode.PacketBufferNode_packetBufferNodes[--PacketBufferNode.PacketBufferNode_packetBufferNodeCount]; } - } - - @ObfuscatedName("jn") - @ObfuscatedSignature( - signature = "(Lho;IIII)V", - garbageValue = "-877706061" - ) - @Export("drawCompass") - static final void drawCompass(Widget var0, int var1, int var2, int var3) { - SpriteMask var4 = var0.getSpriteMask(false); - if (var4 != null) { - if (Client.minimapState < 3) { - AttackOption.compass.drawRotatedMaskedCenteredAround(var1, var2, var4.width, var4.height, 25, 25, Client.camAngleY, 256, var4.xStarts, var4.xWidths); - } else { - Rasterizer2D.Rasterizer2D_fillMaskedRectangle(var1, var2, 0, var4.xStarts, var4.xWidths); - } - + var2.clientPacket = var0; + var2.clientPacketLength = var0.length; + if (var2.clientPacketLength == -1) { + var2.packetBuffer = new PacketBuffer(260); + } else if (var2.clientPacketLength == -2) { + var2.packetBuffer = new PacketBuffer(10000); + } else if (var2.clientPacketLength <= 18) { + var2.packetBuffer = new PacketBuffer(20); + } else if (var2.clientPacketLength <= 98) { + var2.packetBuffer = new PacketBuffer(100); + } else { + var2.packetBuffer = new PacketBuffer(260); } + + var2.packetBuffer.setIsaacCipher(var1); + var2.packetBuffer.writeByteIsaac(var2.clientPacket.id); + var2.index = 0; + return var2; } } diff --git a/runescape-client/src/main/java/SpotAnimationDefinition.java b/runescape-client/src/main/java/SpotAnimationDefinition.java index 00696f3f1a..e9696456c3 100644 --- a/runescape-client/src/main/java/SpotAnimationDefinition.java +++ b/runescape-client/src/main/java/SpotAnimationDefinition.java @@ -4,84 +4,90 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ik") +@ObfuscatedName("im") @Implements("SpotAnimationDefinition") public class SpotAnimationDefinition extends DualNode { - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" + ) + @Export("SpotAnimationDefinition_archive") + static AbstractArchive SpotAnimationDefinition_archive; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lhq;" ) @Export("SpotAnimationDefinition_modelArchive") - public static AbstractArchive SpotAnimationDefinition_modelArchive; - @ObfuscatedName("v") + static AbstractArchive SpotAnimationDefinition_modelArchive; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("SpotAnimationDefinition_cached") static EvictingDualNodeHashTable SpotAnimationDefinition_cached; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("SpotAnimationDefinition_cachedModels") static EvictingDualNodeHashTable SpotAnimationDefinition_cachedModels; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1118528649 + intValue = 817901855 ) @Export("id") int id; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 388295053 + intValue = 1625414499 ) @Export("archive") int archive; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -2139310385 + intValue = 1447664197 ) @Export("sequence") public int sequence; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("recolorFrom") short[] recolorFrom; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("recolorTo") short[] recolorTo; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("retextureFrom") short[] retextureFrom; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("retextureTo") short[] retextureTo; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -1021828075 + intValue = -159508529 ) @Export("widthScale") int widthScale; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -1112009759 + intValue = 806285961 ) @Export("heightScale") int heightScale; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = -1178653603 + intValue = 925047499 ) @Export("orientation") int orientation; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = -1363981799 + intValue = -721394247 ) @Export("ambient") int ambient; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 1122835039 + intValue = 1574201613 ) @Export("contrast") int contrast; @@ -102,8 +108,8 @@ public class SpotAnimationDefinition extends DualNode { @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1457139461" + signature = "(Lkc;B)V", + garbageValue = "14" ) @Export("decode") void decode(Buffer var1) { @@ -117,10 +123,10 @@ public class SpotAnimationDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;IB)V", - garbageValue = "25" + signature = "(Lkc;II)V", + garbageValue = "706058515" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -164,10 +170,10 @@ public class SpotAnimationDefinition extends DualNode { } - @ObfuscatedName("u") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(II)Ldh;", - garbageValue = "-1528746671" + signature = "(II)Ldv;", + garbageValue = "1144333144" ) @Export("getModel") public final Model getModel(int var1) { @@ -197,7 +203,7 @@ public class SpotAnimationDefinition extends DualNode { Model var5; if (this.sequence != -1 && var1 != -1) { - var5 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(this.sequence).transformSpotAnimationModel(var2, var1); + var5 = PlayerType.SequenceDefinition_get(this.sequence).transformSpotAnimationModel(var2, var1); } else { var5 = var2.toSharedSpotAnimationModel(true); } @@ -225,4 +231,21 @@ public class SpotAnimationDefinition extends DualNode { return var5; } + + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "(IIB)I", + garbageValue = "-102" + ) + static final int method4582(int var0, int var1) { + int var2 = class42.method856(45365 + var0, var1 + 91923, 4) - 128 + (class42.method856(10294 + var0, var1 + 37821, 2) - 128 >> 1) + (class42.method856(var0, var1, 1) - 128 >> 2); + var2 = (int)((double)var2 * 0.3D) + 35; + if (var2 < 10) { + var2 = 10; + } else if (var2 > 60) { + var2 = 60; + } + + return var2; + } } diff --git a/runescape-client/src/main/java/Sprite.java b/runescape-client/src/main/java/Sprite.java index 1b8816f5e1..0034c28968 100644 --- a/runescape-client/src/main/java/Sprite.java +++ b/runescape-client/src/main/java/Sprite.java @@ -3,28 +3,28 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lf") +@ObfuscatedName("lx") @Implements("Sprite") public final class Sprite extends Rasterizer2D { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("pixels") public int[] pixels; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("subWidth") public int subWidth; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("subHeight") public int subHeight; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("xOffset") public int xOffset; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("yOffset") int yOffset; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("width") public int width; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("height") public int height; @@ -43,9 +43,9 @@ public final class Sprite extends Rasterizer2D { Sprite() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "()Llf;" + signature = "()Llx;" ) @Export("mirrorHorizontally") public Sprite mirrorHorizontally() { @@ -64,9 +64,9 @@ public final class Sprite extends Rasterizer2D { return var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "()Llf;" + signature = "()Llx;" ) @Export("copyNormalized") public Sprite copyNormalized() { @@ -81,13 +81,13 @@ public final class Sprite extends Rasterizer2D { return var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("setRaster") public void setRaster() { Rasterizer2D.Rasterizer2D_replace(this.pixels, this.subWidth, this.subHeight); } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("normalize") public void normalize() { if (this.subWidth != this.width || this.subHeight != this.height) { @@ -107,27 +107,27 @@ public final class Sprite extends Rasterizer2D { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("pad") - public void pad(int amount) { + public void pad(int var1) { if (this.subWidth != this.width || this.subHeight != this.height) { - int var2 = amount; - if (amount > this.xOffset) { + int var2 = var1; + if (var1 > this.xOffset) { var2 = this.xOffset; } - int var3 = amount; - if (amount + this.xOffset + this.subWidth > this.width) { + int var3 = var1; + if (var1 + this.xOffset + this.subWidth > this.width) { var3 = this.width - this.xOffset - this.subWidth; } - int var4 = amount; - if (amount > this.yOffset) { + int var4 = var1; + if (var1 > this.yOffset) { var4 = this.yOffset; } - int var5 = amount; - if (amount + this.yOffset + this.subHeight > this.height) { + int var5 = var1; + if (var1 + this.yOffset + this.subHeight > this.height) { var5 = this.height - this.yOffset - this.subHeight; } @@ -149,7 +149,7 @@ public final class Sprite extends Rasterizer2D { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("flipHorizontally") public void flipHorizontally() { int[] var1 = new int[this.subWidth * this.subHeight]; @@ -165,7 +165,7 @@ public final class Sprite extends Rasterizer2D { this.xOffset = this.width - this.subWidth - this.xOffset; } - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("flipVertically") public void flipVertically() { int[] var1 = new int[this.subWidth * this.subHeight]; @@ -181,9 +181,9 @@ public final class Sprite extends Rasterizer2D { this.yOffset = this.height - this.subHeight - this.yOffset; } - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("outline") - public void outline(int color) { + public void outline(int var1) { int[] var2 = new int[this.subWidth * this.subHeight]; int var3 = 0; @@ -192,13 +192,13 @@ public final class Sprite extends Rasterizer2D { int var6 = this.pixels[var3]; if (var6 == 0) { if (var5 > 0 && this.pixels[var3 - 1] != 0) { - var6 = color; + var6 = var1; } else if (var4 > 0 && this.pixels[var3 - this.subWidth] != 0) { - var6 = color; + var6 = var1; } else if (var5 < this.subWidth - 1 && this.pixels[var3 + 1] != 0) { - var6 = color; + var6 = var1; } else if (var4 < this.subHeight - 1 && this.pixels[var3 + this.subWidth] != 0) { - var6 = color; + var6 = var1; } } @@ -209,7 +209,7 @@ public final class Sprite extends Rasterizer2D { this.pixels = var2; } - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("shadow") public void shadow(int var1) { for (int var2 = this.subHeight - 1; var2 > 0; --var2) { @@ -224,42 +224,42 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("drawAt") - public void drawAt(int x, int y) { - x += this.xOffset; - y += this.yOffset; - int var3 = x + y * Rasterizer2D.Rasterizer2D_width; + public void drawAt(int var1, int var2) { + var1 += this.xOffset; + var2 += this.yOffset; + int var3 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; int var4 = 0; int var5 = this.subHeight; int var6 = this.subWidth; int var7 = Rasterizer2D.Rasterizer2D_width - var6; int var8 = 0; int var9; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var9 = Rasterizer2D.Rasterizer2D_yClipStart - y; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var9 = Rasterizer2D.Rasterizer2D_yClipStart - var2; var5 -= var9; - y = Rasterizer2D.Rasterizer2D_yClipStart; + var2 = Rasterizer2D.Rasterizer2D_yClipStart; var4 += var9 * var6; var3 += var9 * Rasterizer2D.Rasterizer2D_width; } - if (var5 + y > Rasterizer2D.Rasterizer2D_yClipEnd) { - var5 -= var5 + y - Rasterizer2D.Rasterizer2D_yClipEnd; + if (var5 + var2 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var5 -= var5 + var2 - Rasterizer2D.Rasterizer2D_yClipEnd; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var9 = Rasterizer2D.Rasterizer2D_xClipStart - x; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var9 = Rasterizer2D.Rasterizer2D_xClipStart - var1; var6 -= var9; - x = Rasterizer2D.Rasterizer2D_xClipStart; + var1 = Rasterizer2D.Rasterizer2D_xClipStart; var4 += var9; var3 += var9; var8 += var9; var7 += var9; } - if (var6 + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var9 = var6 + x - Rasterizer2D.Rasterizer2D_xClipEnd; + if (var6 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var9 = var6 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; var6 -= var9; var8 += var9; var7 += var9; @@ -270,42 +270,42 @@ public final class Sprite extends Rasterizer2D { } } - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("drawTransBgAt") - public void drawTransBgAt(int x, int y) { - x += this.xOffset; - y += this.yOffset; - int var3 = x + y * Rasterizer2D.Rasterizer2D_width; + public void drawTransBgAt(int var1, int var2) { + var1 += this.xOffset; + var2 += this.yOffset; + int var3 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; int var4 = 0; int var5 = this.subHeight; int var6 = this.subWidth; int var7 = Rasterizer2D.Rasterizer2D_width - var6; int var8 = 0; int var9; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var9 = Rasterizer2D.Rasterizer2D_yClipStart - y; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var9 = Rasterizer2D.Rasterizer2D_yClipStart - var2; var5 -= var9; - y = Rasterizer2D.Rasterizer2D_yClipStart; + var2 = Rasterizer2D.Rasterizer2D_yClipStart; var4 += var9 * var6; var3 += var9 * Rasterizer2D.Rasterizer2D_width; } - if (var5 + y > Rasterizer2D.Rasterizer2D_yClipEnd) { - var5 -= var5 + y - Rasterizer2D.Rasterizer2D_yClipEnd; + if (var5 + var2 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var5 -= var5 + var2 - Rasterizer2D.Rasterizer2D_yClipEnd; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var9 = Rasterizer2D.Rasterizer2D_xClipStart - x; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var9 = Rasterizer2D.Rasterizer2D_xClipStart - var1; var6 -= var9; - x = Rasterizer2D.Rasterizer2D_xClipStart; + var1 = Rasterizer2D.Rasterizer2D_xClipStart; var4 += var9; var3 += var9; var8 += var9; var7 += var9; } - if (var6 + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var9 = var6 + x - Rasterizer2D.Rasterizer2D_xClipEnd; + if (var6 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var9 = var6 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; var6 -= var9; var8 += var9; var7 += var9; @@ -316,284 +316,284 @@ public final class Sprite extends Rasterizer2D { } } - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("drawScaledAt") - public void drawScaledAt(int x, int y, int width, int height) { - if (width > 0 && height > 0) { + public void drawScaledAt(int var1, int var2, int var3, int var4) { + if (var3 > 0 && var4 > 0) { int var5 = this.subWidth; int var6 = this.subHeight; int var7 = 0; int var8 = 0; int var9 = this.width; int var10 = this.height; - int var11 = (var9 << 16) / width; - int var12 = (var10 << 16) / height; + int var11 = (var9 << 16) / var3; + int var12 = (var10 << 16) / var4; int var13; if (this.xOffset > 0) { var13 = (var11 + (this.xOffset << 16) - 1) / var11; - x += var13; + var1 += var13; var7 += var13 * var11 - (this.xOffset << 16); } if (this.yOffset > 0) { var13 = (var12 + (this.yOffset << 16) - 1) / var12; - y += var13; + var2 += var13; var8 += var13 * var12 - (this.yOffset << 16); } if (var5 < var9) { - width = (var11 + ((var5 << 16) - var7) - 1) / var11; + var3 = (var11 + ((var5 << 16) - var7) - 1) / var11; } if (var6 < var10) { - height = (var12 + ((var6 << 16) - var8) - 1) / var12; + var4 = (var12 + ((var6 << 16) - var8) - 1) / var12; } - var13 = x + y * Rasterizer2D.Rasterizer2D_width; - int var14 = Rasterizer2D.Rasterizer2D_width - width; - if (y + height > Rasterizer2D.Rasterizer2D_yClipEnd) { - height -= y + height - Rasterizer2D.Rasterizer2D_yClipEnd; + var13 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; + int var14 = Rasterizer2D.Rasterizer2D_width - var3; + if (var2 + var4 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var4 -= var2 + var4 - Rasterizer2D.Rasterizer2D_yClipEnd; } int var15; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var15 = Rasterizer2D.Rasterizer2D_yClipStart - y; - height -= var15; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var15 = Rasterizer2D.Rasterizer2D_yClipStart - var2; + var4 -= var15; var13 += var15 * Rasterizer2D.Rasterizer2D_width; var8 += var12 * var15; } - if (width + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var15 = width + x - Rasterizer2D.Rasterizer2D_xClipEnd; - width -= var15; + if (var3 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var15 = var3 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; + var3 -= var15; var14 += var15; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var15 = Rasterizer2D.Rasterizer2D_xClipStart - x; - width -= var15; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var15 = Rasterizer2D.Rasterizer2D_xClipStart - var1; + var3 -= var15; var13 += var15; var7 += var11 * var15; var14 += var15; } - Sprite_drawScaled(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var7, var8, var13, var14, width, height, var11, var12, var5); + Sprite_drawScaled(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var7, var8, var13, var14, var3, var4, var11, var12, var5); } } - @ObfuscatedName("x") + @ObfuscatedName("j") @Export("drawTransOverlayAt") - public void drawTransOverlayAt(int x, int y, int overlayOpacity, int overlayColor) { - if (overlayOpacity == 256) { - this.drawTransBgAt(x, y); + public void drawTransOverlayAt(int var1, int var2, int var3, int var4) { + if (var3 == 256) { + this.drawTransBgAt(var1, var2); } else { - x += this.xOffset; - y += this.yOffset; - int var5 = x + y * Rasterizer2D.Rasterizer2D_width; + var1 += this.xOffset; + var2 += this.yOffset; + int var5 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; int var6 = 0; int var7 = this.subHeight; int var8 = this.subWidth; int var9 = Rasterizer2D.Rasterizer2D_width - var8; int var10 = 0; int var11; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var11 = Rasterizer2D.Rasterizer2D_yClipStart - y; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var11 = Rasterizer2D.Rasterizer2D_yClipStart - var2; var7 -= var11; - y = Rasterizer2D.Rasterizer2D_yClipStart; + var2 = Rasterizer2D.Rasterizer2D_yClipStart; var6 += var11 * var8; var5 += var11 * Rasterizer2D.Rasterizer2D_width; } - if (var7 + y > Rasterizer2D.Rasterizer2D_yClipEnd) { - var7 -= var7 + y - Rasterizer2D.Rasterizer2D_yClipEnd; + if (var7 + var2 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var7 -= var7 + var2 - Rasterizer2D.Rasterizer2D_yClipEnd; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var11 = Rasterizer2D.Rasterizer2D_xClipStart - x; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var11 = Rasterizer2D.Rasterizer2D_xClipStart - var1; var8 -= var11; - x = Rasterizer2D.Rasterizer2D_xClipStart; + var1 = Rasterizer2D.Rasterizer2D_xClipStart; var6 += var11; var5 += var11; var10 += var11; var9 += var11; } - if (var8 + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var11 = var8 + x - Rasterizer2D.Rasterizer2D_xClipEnd; + if (var8 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var11 = var8 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; var8 -= var11; var10 += var11; var9 += var11; } if (var8 > 0 && var7 > 0) { - Sprite_drawTransOverlay(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var6, var5, var8, var7, var9, var10, overlayOpacity, overlayColor); + Sprite_drawTransOverlay(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var6, var5, var8, var7, var9, var10, var3, var4); } } } - @ObfuscatedName("s") + @ObfuscatedName("e") @Export("drawTransAt") - public void drawTransAt(int x, int y, int opacity) { - x += this.xOffset; - y += this.yOffset; - int var4 = x + y * Rasterizer2D.Rasterizer2D_width; + public void drawTransAt(int var1, int var2, int var3) { + var1 += this.xOffset; + var2 += this.yOffset; + int var4 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; int var5 = 0; int var6 = this.subHeight; int var7 = this.subWidth; int var8 = Rasterizer2D.Rasterizer2D_width - var7; int var9 = 0; int var10; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var10 = Rasterizer2D.Rasterizer2D_yClipStart - y; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var10 = Rasterizer2D.Rasterizer2D_yClipStart - var2; var6 -= var10; - y = Rasterizer2D.Rasterizer2D_yClipStart; + var2 = Rasterizer2D.Rasterizer2D_yClipStart; var5 += var10 * var7; var4 += var10 * Rasterizer2D.Rasterizer2D_width; } - if (var6 + y > Rasterizer2D.Rasterizer2D_yClipEnd) { - var6 -= var6 + y - Rasterizer2D.Rasterizer2D_yClipEnd; + if (var6 + var2 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var6 -= var6 + var2 - Rasterizer2D.Rasterizer2D_yClipEnd; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var10 = Rasterizer2D.Rasterizer2D_xClipStart - x; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var10 = Rasterizer2D.Rasterizer2D_xClipStart - var1; var7 -= var10; - x = Rasterizer2D.Rasterizer2D_xClipStart; + var1 = Rasterizer2D.Rasterizer2D_xClipStart; var5 += var10; var4 += var10; var9 += var10; var8 += var10; } - if (var7 + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var10 = var7 + x - Rasterizer2D.Rasterizer2D_xClipEnd; + if (var7 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var10 = var7 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; var7 -= var10; var9 += var10; var8 += var10; } if (var7 > 0 && var6 > 0) { - Sprite_drawTransparent(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var5, var4, var7, var6, var8, var9, opacity); + Sprite_drawTransparent(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var5, var4, var7, var6, var8, var9, var3); } } - @ObfuscatedName("j") + @ObfuscatedName("b") @Export("drawTransScaledAt") - public void drawTransScaledAt(int x, int y, int width, int height, int opacity) { - if (width > 0 && height > 0) { + public void drawTransScaledAt(int var1, int var2, int var3, int var4, int var5) { + if (var3 > 0 && var4 > 0) { int var6 = this.subWidth; int var7 = this.subHeight; int var8 = 0; int var9 = 0; int var10 = this.width; int var11 = this.height; - int var12 = (var10 << 16) / width; - int var13 = (var11 << 16) / height; + int var12 = (var10 << 16) / var3; + int var13 = (var11 << 16) / var4; int var14; if (this.xOffset > 0) { var14 = (var12 + (this.xOffset << 16) - 1) / var12; - x += var14; + var1 += var14; var8 += var14 * var12 - (this.xOffset << 16); } if (this.yOffset > 0) { var14 = (var13 + (this.yOffset << 16) - 1) / var13; - y += var14; + var2 += var14; var9 += var14 * var13 - (this.yOffset << 16); } if (var6 < var10) { - width = (var12 + ((var6 << 16) - var8) - 1) / var12; + var3 = (var12 + ((var6 << 16) - var8) - 1) / var12; } if (var7 < var11) { - height = (var13 + ((var7 << 16) - var9) - 1) / var13; + var4 = (var13 + ((var7 << 16) - var9) - 1) / var13; } - var14 = x + y * Rasterizer2D.Rasterizer2D_width; - int var15 = Rasterizer2D.Rasterizer2D_width - width; - if (y + height > Rasterizer2D.Rasterizer2D_yClipEnd) { - height -= y + height - Rasterizer2D.Rasterizer2D_yClipEnd; + var14 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; + int var15 = Rasterizer2D.Rasterizer2D_width - var3; + if (var2 + var4 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var4 -= var2 + var4 - Rasterizer2D.Rasterizer2D_yClipEnd; } int var16; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var16 = Rasterizer2D.Rasterizer2D_yClipStart - y; - height -= var16; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var16 = Rasterizer2D.Rasterizer2D_yClipStart - var2; + var4 -= var16; var14 += var16 * Rasterizer2D.Rasterizer2D_width; var9 += var13 * var16; } - if (width + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var16 = width + x - Rasterizer2D.Rasterizer2D_xClipEnd; - width -= var16; + if (var3 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var16 = var3 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; + var3 -= var16; var15 += var16; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var16 = Rasterizer2D.Rasterizer2D_xClipStart - x; - width -= var16; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var16 = Rasterizer2D.Rasterizer2D_xClipStart - var1; + var3 -= var16; var14 += var16; var8 += var12 * var16; var15 += var16; } - Sprite_drawTransScaled(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var8, var9, var14, var15, width, height, var12, var13, var6, opacity); + Sprite_drawTransScaled(Rasterizer2D.Rasterizer2D_pixels, this.pixels, 0, var8, var9, var14, var15, var3, var4, var12, var13, var6, var5); } } - @ObfuscatedName("l") - public void method6082(int x, int y, int opacity) { - x += this.xOffset; - y += this.yOffset; - int var4 = x + y * Rasterizer2D.Rasterizer2D_width; + @ObfuscatedName("u") + public void method6257(int var1, int var2, int var3) { + var1 += this.xOffset; + var2 += this.yOffset; + int var4 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; int var5 = 0; int var6 = this.subHeight; int var7 = this.subWidth; int var8 = Rasterizer2D.Rasterizer2D_width - var7; int var9 = 0; int var10; - if (y < Rasterizer2D.Rasterizer2D_yClipStart) { - var10 = Rasterizer2D.Rasterizer2D_yClipStart - y; + if (var2 < Rasterizer2D.Rasterizer2D_yClipStart) { + var10 = Rasterizer2D.Rasterizer2D_yClipStart - var2; var6 -= var10; - y = Rasterizer2D.Rasterizer2D_yClipStart; + var2 = Rasterizer2D.Rasterizer2D_yClipStart; var5 += var10 * var7; var4 += var10 * Rasterizer2D.Rasterizer2D_width; } - if (var6 + y > Rasterizer2D.Rasterizer2D_yClipEnd) { - var6 -= var6 + y - Rasterizer2D.Rasterizer2D_yClipEnd; + if (var6 + var2 > Rasterizer2D.Rasterizer2D_yClipEnd) { + var6 -= var6 + var2 - Rasterizer2D.Rasterizer2D_yClipEnd; } - if (x < Rasterizer2D.Rasterizer2D_xClipStart) { - var10 = Rasterizer2D.Rasterizer2D_xClipStart - x; + if (var1 < Rasterizer2D.Rasterizer2D_xClipStart) { + var10 = Rasterizer2D.Rasterizer2D_xClipStart - var1; var7 -= var10; - x = Rasterizer2D.Rasterizer2D_xClipStart; + var1 = Rasterizer2D.Rasterizer2D_xClipStart; var5 += var10; var4 += var10; var9 += var10; var8 += var10; } - if (var7 + x > Rasterizer2D.Rasterizer2D_xClipEnd) { - var10 = var7 + x - Rasterizer2D.Rasterizer2D_xClipEnd; + if (var7 + var1 > Rasterizer2D.Rasterizer2D_xClipEnd) { + var10 = var7 + var1 - Rasterizer2D.Rasterizer2D_xClipEnd; var7 -= var10; var9 += var10; var8 += var10; } if (var7 > 0 && var6 > 0) { - if (opacity == 256) { - method6071(0, 0, 0, Rasterizer2D.Rasterizer2D_pixels, this.pixels, var5, 0, var4, 0, var7, var6, var8, var9); + if (var3 == 256) { + method6258(0, 0, 0, Rasterizer2D.Rasterizer2D_pixels, this.pixels, var5, 0, var4, 0, var7, var6, var8, var9); } else { - method6084(0, 0, 0, Rasterizer2D.Rasterizer2D_pixels, this.pixels, var5, 0, var4, 0, var7, var6, var8, var9, opacity); + method6259(0, 0, 0, Rasterizer2D.Rasterizer2D_pixels, this.pixels, var5, 0, var4, 0, var7, var6, var8, var9, var3); } } } - @ObfuscatedName("aa") - public void method6085(int var1, int var2, int var3, int var4, int var5) { + @ObfuscatedName("ak") + public void method6260(int var1, int var2, int var3, int var4, int var5) { if (var3 > 0 && var4 > 0) { int var6 = this.subWidth; int var7 = this.subHeight; @@ -653,16 +653,16 @@ public final class Sprite extends Rasterizer2D { } if (var5 == 256) { - method6086(0, 0, 0, var8, this.pixels, Rasterizer2D.Rasterizer2D_pixels, 0, 0, -var4, var9, var14, var15, var3, var12, var13, var6); + method6261(0, 0, 0, var8, this.pixels, Rasterizer2D.Rasterizer2D_pixels, 0, 0, -var4, var9, var14, var15, var3, var12, var13, var6); } else { - method6083(0, 0, 0, var8, this.pixels, Rasterizer2D.Rasterizer2D_pixels, 0, 0, -var4, var9, var14, var15, var3, var12, var13, var6, var5); + method6262(0, 0, 0, var8, this.pixels, Rasterizer2D.Rasterizer2D_pixels, 0, 0, -var4, var9, var14, var15, var3, var12, var13, var6, var5); } } } @ObfuscatedName("ab") - public void method6088(int var1, int var2, int var3, int var4, int var5, int var6, int[] var7, int[] var8) { + public void method6263(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; int var11 = var1 < 0 ? -var1 : 0; @@ -711,25 +711,25 @@ public final class Sprite extends Rasterizer2D { @ObfuscatedName("ax") @Export("drawRotatedMaskedCenteredAround") - public void drawRotatedMaskedCenteredAround(int x, int y, int width, int height, int xOffset, int yOffset, int rotation, int zoom, int[] xOffsets, int[] yOffsets) { + public void drawRotatedMaskedCenteredAround(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int[] var9, int[] var10) { try { - int var11 = -width / 2; - int var12 = -height / 2; - int var13 = (int)(Math.sin((double)rotation / 326.11D) * 65536.0D); - int var14 = (int)(Math.cos((double)rotation / 326.11D) * 65536.0D); - var13 = var13 * zoom >> 8; - var14 = var14 * zoom >> 8; - int var15 = var12 * var13 + var11 * var14 + (xOffset << 16); - int var16 = var12 * var14 - var11 * var13 + (yOffset << 16); - int var17 = x + y * Rasterizer2D.Rasterizer2D_width; + int var11 = -var3 / 2; + int var12 = -var4 / 2; + int var13 = (int)(Math.sin((double)var7 / 326.11D) * 65536.0D); + int var14 = (int)(Math.cos((double)var7 / 326.11D) * 65536.0D); + var13 = var13 * var8 >> 8; + var14 = var14 * var8 >> 8; + int var15 = var12 * var13 + var11 * var14 + (var5 << 16); + int var16 = var12 * var14 - var11 * var13 + (var6 << 16); + int var17 = var1 + var2 * Rasterizer2D.Rasterizer2D_width; - for (y = 0; y < height; ++y) { - int var18 = xOffsets[y]; + for (var2 = 0; var2 < var4; ++var2) { + int var18 = var9[var2]; int var19 = var17 + var18; int var20 = var15 + var14 * var18; int var21 = var16 - var13 * var18; - for (x = -yOffsets[y]; x < 0; ++x) { + for (var1 = -var10[var2]; var1 < 0; ++var1) { Rasterizer2D.Rasterizer2D_pixels[var19++] = this.pixels[this.subWidth * (var21 >> 16) + (var20 >> 16)]; var20 += var14; var21 -= var13; @@ -744,8 +744,8 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("as") - public void method6090(int var1, int var2, int var3, int var4, int var5, int var6, double var7, int var9) { + @ObfuscatedName("al") + public void method6331(int var1, int var2, int var3, int var4, int var5, int var6, double var7, int var9) { try { int var10 = -var3 / 2; int var11 = -var4 / 2; @@ -783,13 +783,13 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("ao") - public void method6091(int var1, int var2, int var3, int var4) { - this.method6092(this.width << 3, this.height << 3, var1 << 4, var2 << 4, var3, var4); + @ObfuscatedName("ap") + public void method6266(int var1, int var2, int var3, int var4) { + this.method6267(this.width << 3, this.height << 3, var1 << 4, var2 << 4, var3, var4); } - @ObfuscatedName("al") - void method6092(int var1, int var2, int var3, int var4, int var5, int var6) { + @ObfuscatedName("aj") + void method6267(int var1, int var2, int var3, int var4, int var5, int var6) { if (var6 != 0) { var1 -= this.xOffset << 4; var2 -= this.yOffset << 4; @@ -1257,7 +1257,7 @@ public final class Sprite extends Rasterizer2D { } } - @ObfuscatedName("ad") + @ObfuscatedName("ae") @Export("drawScaledWorldmap") public void drawScaledWorldmap(int var1, int var2, int var3, int var4) { if (var3 <= this.width && var4 <= this.height) { @@ -1380,7 +1380,7 @@ public final class Sprite extends Rasterizer2D { } } - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("Sprite_draw") static void Sprite_draw(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7) { for (int var8 = -var5; var8 < 0; ++var8) { @@ -1400,7 +1400,7 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("Sprite_drawTransBg") static void Sprite_drawTransBg(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { int var9 = -(var5 >> 2); @@ -1453,7 +1453,7 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("Sprite_drawScaled") static void Sprite_drawScaled(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11) { int var12 = var3; @@ -1479,7 +1479,7 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("h") + @ObfuscatedName("r") @Export("Sprite_drawTransOverlay") static void Sprite_drawTransOverlay(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { int var11 = 256 - var9; @@ -1505,7 +1505,7 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("f") + @ObfuscatedName("s") @Export("Sprite_drawTransparent") static void Sprite_drawTransparent(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9) { int var10 = 256 - var9; @@ -1527,7 +1527,7 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("d") + @ObfuscatedName("w") @Export("Sprite_drawTransScaled") static void Sprite_drawTransScaled(int[] var0, int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12) { int var13 = 256 - var12; @@ -1555,8 +1555,8 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("k") - static void method6071(int var0, int var1, int var2, int[] var3, int[] var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12) { + @ObfuscatedName("ad") + static void method6258(int var0, int var1, int var2, int[] var3, int[] var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12) { for (var8 = -var10; var8 < 0; ++var8) { for (var6 = -var9; var6 < 0; ++var6) { var0 = var4[var5++]; @@ -1577,8 +1577,8 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("ac") - static void method6084(int var0, int var1, int var2, int[] var3, int[] var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13) { + @ObfuscatedName("ag") + static void method6259(int var0, int var1, int var2, int[] var3, int[] var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13) { for (var8 = -var10; var8 < 0; ++var8) { for (var6 = -var9; var6 < 0; ++var6) { var0 = var4[var5++]; @@ -1601,8 +1601,8 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("ap") - static void method6086(int var0, int var1, int var2, int var3, int[] var4, int[] var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15) { + @ObfuscatedName("av") + static void method6261(int var0, int var1, int var2, int var3, int[] var4, int[] var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15) { for (int var16 = var3; var8 < 0; ++var8) { var7 = var15 * (var9 >> 16); @@ -1628,8 +1628,8 @@ public final class Sprite extends Rasterizer2D { } - @ObfuscatedName("ar") - static void method6083(int var0, int var1, int var2, int var3, int[] var4, int[] var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16) { + @ObfuscatedName("am") + static void method6262(int var0, int var1, int var2, int var3, int[] var4, int[] var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16) { for (int var17 = var3; var8 < 0; ++var8) { var7 = var15 * (var9 >> 16); diff --git a/runescape-client/src/main/java/SpriteMask.java b/runescape-client/src/main/java/SpriteMask.java index 9ef330ebe4..84602a3ea3 100644 --- a/runescape-client/src/main/java/SpriteMask.java +++ b/runescape-client/src/main/java/SpriteMask.java @@ -4,25 +4,36 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hz") +@ObfuscatedName("hn") @Implements("SpriteMask") public class SpriteMask extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("dj") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive3") + static Archive archive3; + @ObfuscatedName("gy") @ObfuscatedGetter( - intValue = 470195623 + intValue = 1141179073 + ) + static int field2501; + @ObfuscatedName("a") + @ObfuscatedGetter( + intValue = 2130033561 ) @Export("width") public final int width; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1322653373 + intValue = 395939847 ) @Export("height") public final int height; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("xWidths") public final int[] xWidths; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("xStarts") public final int[] xStarts; @@ -33,10 +44,10 @@ public class SpriteMask extends DualNode { this.xStarts = var4; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-886102829" + garbageValue = "-337520284" ) @Export("contains") public boolean contains(int var1, int var2) { diff --git a/runescape-client/src/main/java/Strings.java b/runescape-client/src/main/java/Strings.java index be16553461..5cfb0f0920 100644 --- a/runescape-client/src/main/java/Strings.java +++ b/runescape-client/src/main/java/Strings.java @@ -1,51 +1,25 @@ -import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hx") +@ObfuscatedName("hm") @Implements("Strings") public class Strings { - @ObfuscatedName("bm") - public static String field2793; - @ObfuscatedName("cc") - public static String field2783; - @ObfuscatedName("jp") - public static String field3008; - @ObfuscatedName("jd") - public static String field3009; - @ObfuscatedName("jo") - public static String field3010; - @ObfuscatedName("lt") - @ObfuscatedSignature( - signature = "Lho;" - ) - static Widget field2767; + @ObfuscatedName("bd") + public static String field2797; + @ObfuscatedName("cb") + public static String field3006; + @ObfuscatedName("jw") + public static String field2894; + @ObfuscatedName("jt") + public static String field3013; + @ObfuscatedName("jn") + public static String field3014; static { - field2793 = "Please visit the support page for assistance."; - field2783 = "Please visit the support page for assistance."; - field3008 = ""; - field3009 = "Page has opened in a new window."; - field3010 = "(Please check your popup blocker.)"; - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "-552615239" - ) - public static boolean method4091(int var0) { - return var0 >= WorldMapDecorationType.field2704.id && var0 <= WorldMapDecorationType.field2720.id; - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(IB)Z", - garbageValue = "-5" - ) - @Export("isWorldMapEvent") - public static boolean isWorldMapEvent(int var0) { - return var0 == 10 || var0 == 11 || var0 == 12 || var0 == 13 || var0 == 14 || var0 == 15 || var0 == 16 || var0 == 17; + field2797 = "Please visit the support page for assistance."; + field3006 = "Please visit the support page for assistance."; + field2894 = ""; + field3013 = "Page has opened in a new window."; + field3014 = "(Please check your popup blocker.)"; } } diff --git a/runescape-client/src/main/java/StructDefinition.java b/runescape-client/src/main/java/StructDefinition.java index 076f30e8ed..bf2027f49d 100644 --- a/runescape-client/src/main/java/StructDefinition.java +++ b/runescape-client/src/main/java/StructDefinition.java @@ -3,30 +3,30 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ir") +@ObfuscatedName("id") @Implements("StructDefinition") public class StructDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("StructDefinition_archive") public static AbstractArchive StructDefinition_archive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("StructDefinition_cached") public static EvictingDualNodeHashTable StructDefinition_cached; - @ObfuscatedName("gc") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "[Llf;" + signature = "Lhq;" ) - @Export("headIconPkSprites") - static Sprite[] headIconPkSprites; - @ObfuscatedName("v") + @Export("Widget_modelsArchive") + static AbstractArchive Widget_modelsArchive; + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Llb;" + signature = "Llr;" ) @Export("params") IterableNodeHashTable params; @@ -38,19 +38,19 @@ public class StructDefinition extends DualNode { StructDefinition() { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "37" + signature = "(I)V", + garbageValue = "1931013228" ) @Export("postDecode") void postDecode() { } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-593456946" + signature = "(Lkc;I)V", + garbageValue = "-2132322358" ) @Export("decode") void decode(Buffer var1) { @@ -64,36 +64,49 @@ public class StructDefinition extends DualNode { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-464396075" + signature = "(Lkc;II)V", + garbageValue = "2038227165" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { if (var2 == 249) { - this.params = UserComparator5.readStringIntParameters(var1, this.params); + this.params = UserComparator10.readStringIntParameters(var1, this.params); } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(III)I", - garbageValue = "-1632755305" + garbageValue = "65535" ) @Export("getIntParam") public int getIntParam(int var1, int var2) { - return HealthBar.method2034(this.params, var1, var2); + return FriendsList.method5306(this.params, var1, var2); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(ILjava/lang/String;I)Ljava/lang/String;", - garbageValue = "127947396" + garbageValue = "1822507613" ) @Export("getStringParam") public String getStringParam(int var1, String var2) { - return class96.method2263(this.params, var1, var2); + IterableNodeHashTable var4 = this.params; + String var3; + if (var4 == null) { + var3 = var2; + } else { + ObjectNode var5 = (ObjectNode)var4.get((long)var1); + if (var5 == null) { + var3 = var2; + } else { + var3 = (String)var5.obj; + } + } + + return var3; } } diff --git a/runescape-client/src/main/java/StudioGame.java b/runescape-client/src/main/java/StudioGame.java index 2e00f27d98..a4fed2ce99 100644 --- a/runescape-client/src/main/java/StudioGame.java +++ b/runescape-client/src/main/java/StudioGame.java @@ -4,57 +4,64 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ha") +@ObfuscatedName("hp") @Implements("StudioGame") public enum StudioGame implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lha;" + signature = "Lhp;" ) @Export("runescape") runescape("runescape", "RuneScape", 0), - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lha;" + signature = "Lhp;" ) @Export("stellardawn") stellardawn("stellardawn", "Stellar Dawn", 1), - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lha;" + signature = "Lhp;" ) @Export("game3") game3("game3", "Game 3", 2), - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lha;" + signature = "Lhp;" ) @Export("game4") game4("game4", "Game 4", 3), - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lha;" + signature = "Lhp;" ) @Export("game5") game5("game5", "Game 5", 4), - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lha;" + signature = "Lhp;" ) @Export("oldscape") oldscape("oldscape", "RuneScape 2007", 5); - @ObfuscatedName("sy") + @ObfuscatedName("bq") @ObfuscatedSignature( - signature = "Lib;" + signature = "[Llw;" ) - public static class237 field3086; - @ObfuscatedName("q") + @Export("worldSelectArrows") + static IndexedSprite[] worldSelectArrows; + @ObfuscatedName("lf") + @ObfuscatedSignature( + signature = "Lcd;" + ) + @Export("tempMenuAction") + static MenuAction tempMenuAction; + @ObfuscatedName("c") @Export("name") public final String name; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 275633543 + intValue = 1841699431 ) @Export("id") final int id; @@ -64,35 +71,13 @@ public enum StudioGame implements Enumerated { this.id = var5; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(II)Lig;", - garbageValue = "-61677673" - ) - @Export("getInvDefinition") - public static InvDefinition getInvDefinition(int var0) { - InvDefinition var1 = (InvDefinition)InvDefinition.InvDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = InvDefinition.InvDefinition_archive.takeFile(5, var0); - var1 = new InvDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); - } - - InvDefinition.InvDefinition_cached.put(var1, (long)var0); - return var1; - } - } } diff --git a/runescape-client/src/main/java/Task.java b/runescape-client/src/main/java/Task.java index b41605e82c..099c42fd2f 100644 --- a/runescape-client/src/main/java/Task.java +++ b/runescape-client/src/main/java/Task.java @@ -4,31 +4,31 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fv") +@ObfuscatedName("fw") @Implements("Task") public class Task { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lfv;" + signature = "Lfw;" ) @Export("next") Task next; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("status") public volatile int status; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1191522307 + intValue = 1457841363 ) @Export("type") int type; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("intArgument") public int intArgument; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("objectArgument") Object objectArgument; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("result") public volatile Object result; diff --git a/runescape-client/src/main/java/TaskHandler.java b/runescape-client/src/main/java/TaskHandler.java index 0355cfcbd9..84b26b5f99 100644 --- a/runescape-client/src/main/java/TaskHandler.java +++ b/runescape-client/src/main/java/TaskHandler.java @@ -6,41 +6,33 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("fm") +@ObfuscatedName("ff") @Implements("TaskHandler") public class TaskHandler implements Runnable { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("javaVendor") public static String javaVendor; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("javaVersion") public static String javaVersion; - @ObfuscatedName("i") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhp;" - ) - @Export("Widget_modelsArchive") - static AbstractArchive Widget_modelsArchive; - @ObfuscatedName("ah") - @Export("hasFocus") - protected static boolean hasFocus; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lfv;" + signature = "Lfw;" ) @Export("current") Task current; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lfv;" + signature = "Lfw;" ) @Export("task") Task task; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("thread") Thread thread; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("isClosed") boolean isClosed; @@ -64,10 +56,10 @@ public class TaskHandler implements Runnable { this.thread.start(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1673059069" + garbageValue = "6934376" ) @Export("close") public final void close() { @@ -83,10 +75,10 @@ public class TaskHandler implements Runnable { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IIILjava/lang/Object;S)Lfv;", - garbageValue = "255" + signature = "(IIILjava/lang/Object;I)Lfw;", + garbageValue = "635480058" ) @Export("newTask") final Task newTask(int var1, int var2, int var3, Object var4) { @@ -107,20 +99,20 @@ public class TaskHandler implements Runnable { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljava/lang/String;II)Lfv;", - garbageValue = "2091612218" + signature = "(Ljava/lang/String;II)Lfw;", + garbageValue = "540532004" ) @Export("newSocketTask") public final Task newSocketTask(String var1, int var2) { return this.newTask(1, var2, 0, var1); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Ljava/lang/Runnable;II)Lfv;", - garbageValue = "-1627707278" + signature = "(Ljava/lang/Runnable;II)Lfw;", + garbageValue = "129890916" ) @Export("newThreadTask") public final Task newThreadTask(Runnable var1, int var2) { @@ -175,10 +167,183 @@ public class TaskHandler implements Runnable { } } - @ObfuscatedName("z") - static double method3429(double var0, double var2, double var4) { - double var8 = (var0 - var2) / var4; - double var6 = Math.exp(-var8 * var8 / 2.0D) / Math.sqrt(6.283185307179586D); - return var6 / var4; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;Lhq;Lhq;B)V", + garbageValue = "48" + ) + public static void method3622(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2) { + HitSplatDefinition.HitSplatDefinition_archive = var0; + HitSplatDefinition.field3316 = var1; + class2.HitSplatDefinition_fontsArchive = var2; + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-1691185784" + ) + static int method3605(int var0, Script var1, boolean var2) { + Widget var3; + if (var0 >= 2000) { + var0 -= 1000; + var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + } else { + var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + } + + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + if (var0 != ScriptOpcodes.CC_SETOBJECT && var0 != ScriptOpcodes.CC_SETOBJECT_NONUM && var0 != ScriptOpcodes.CC_SETOBJECT_ALWAYS_NUM) { + if (var0 == ScriptOpcodes.CC_SETNPCHEAD) { + var3.modelType = 2; + var3.modelId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETPLAYERHEAD_SELF) { + var3.modelType = 3; + var3.modelId = class215.localPlayer.appearance.getChatHeadId(); + return 1; + } else { + return 2; + } + } else { + Interpreter.Interpreter_intStackSize -= 2; + int var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var3.itemId = var4; + var3.itemQuantity = var5; + ItemDefinition var6 = class222.ItemDefinition_get(var4); + var3.modelAngleX = var6.xan2d; + var3.modelAngleY = var6.yan2d; + var3.modelAngleZ = var6.zan2d; + var3.modelOffsetX = var6.offsetX2d; + var3.modelOffsetY = var6.offsetY2d; + var3.modelZoom = var6.zoom2d; + if (var0 == ScriptOpcodes.CC_SETOBJECT_NONUM) { + var3.itemQuantityMode = 0; + } else if (var0 == ScriptOpcodes.CC_SETOBJECT_ALWAYS_NUM | var6.isStackable == 1) { + var3.itemQuantityMode = 1; + } else { + var3.itemQuantityMode = 2; + } + + if (var3.field2577 > 0) { + var3.modelZoom = var3.modelZoom * 32 / var3.field2577; + } else if (var3.rawWidth > 0) { + var3.modelZoom = var3.modelZoom * 32 / var3.rawWidth; + } + + return 1; + } + } + + @ObfuscatedName("iv") + @ObfuscatedSignature( + signature = "(Lit;IIII)V", + garbageValue = "890434158" + ) + @Export("addNpcToMenu") + static final void addNpcToMenu(NPCDefinition var0, int var1, int var2, int var3) { + if (Client.menuOptionsCount < 400) { + if (var0.transforms != null) { + var0 = var0.transform(); + } + + if (var0 != null) { + if (var0.isInteractable) { + if (!var0.isFollower || Client.followerIndex == var1) { + String var4 = var0.name; + if (var0.combatLevel != 0) { + var4 = var4 + GrandExchangeOffer.method159(var0.combatLevel, class215.localPlayer.combatLevel) + " " + " (" + "level-" + var0.combatLevel + ")"; + } + + if (var0.isFollower && Client.followerOpsLowPriority) { + GameObject.insertMenuItemNoShift("Examine", AbstractArchive.colorStartTag(16776960) + var4, 1003, var1, var2, var3); + } + + if (Client.isItemSelected == 1) { + GameObject.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + AbstractArchive.colorStartTag(16776960) + var4, 7, var1, var2, var3); + } else if (Client.isSpellSelected) { + if ((class81.selectedSpellFlags & 2) == 2) { + GameObject.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + AbstractArchive.colorStartTag(16776960) + var4, 8, var1, var2, var3); + } + } else { + int var5 = var0.isFollower && Client.followerOpsLowPriority ? 2000 : 0; + String[] var6 = var0.actions; + int var7; + int var8; + if (var6 != null) { + for (var7 = 4; var7 >= 0; --var7) { + if (var6[var7] != null && !var6[var7].equalsIgnoreCase("Attack")) { + var8 = 0; + if (var7 == 0) { + var8 = var5 + 9; + } + + if (var7 == 1) { + var8 = var5 + 10; + } + + if (var7 == 2) { + var8 = var5 + 11; + } + + if (var7 == 3) { + var8 = var5 + 12; + } + + if (var7 == 4) { + var8 = var5 + 13; + } + + GameObject.insertMenuItemNoShift(var6[var7], AbstractArchive.colorStartTag(16776960) + var4, var8, var1, var2, var3); + } + } + } + + if (var6 != null) { + for (var7 = 4; var7 >= 0; --var7) { + if (var6[var7] != null && var6[var7].equalsIgnoreCase("Attack")) { + short var9 = 0; + if (AttackOption.AttackOption_hidden != Client.npcAttackOption) { + if (AttackOption.AttackOption_alwaysRightClick == Client.npcAttackOption || Client.npcAttackOption == AttackOption.AttackOption_dependsOnCombatLevels && var0.combatLevel > class215.localPlayer.combatLevel) { + var9 = 2000; + } + + var8 = 0; + if (var7 == 0) { + var8 = var9 + 9; + } + + if (var7 == 1) { + var8 = var9 + 10; + } + + if (var7 == 2) { + var8 = var9 + 11; + } + + if (var7 == 3) { + var8 = var9 + 12; + } + + if (var7 == 4) { + var8 = var9 + 13; + } + + GameObject.insertMenuItemNoShift(var6[var7], AbstractArchive.colorStartTag(16776960) + var4, var8, var1, var2, var3); + } + } + } + } + + if (!var0.isFollower || !Client.followerOpsLowPriority) { + GameObject.insertMenuItemNoShift("Examine", AbstractArchive.colorStartTag(16776960) + var4, 1003, var1, var2, var3); + } + } + + } + } + } + } } } diff --git a/runescape-client/src/main/java/Texture.java b/runescape-client/src/main/java/Texture.java index 6cdb6d7950..57efe2908e 100644 --- a/runescape-client/src/main/java/Texture.java +++ b/runescape-client/src/main/java/Texture.java @@ -3,46 +3,46 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dg") +@ObfuscatedName("dt") @Implements("Texture") public class Texture extends Node { - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("Texture_animatedPixels") static int[] Texture_animatedPixels; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("averageRGB") int averageRGB; - @ObfuscatedName("p") - boolean field1587; - @ObfuscatedName("q") + @ObfuscatedName("l") + boolean field1593; + @ObfuscatedName("c") @Export("fileIds") int[] fileIds; - @ObfuscatedName("m") - int[] field1589; - @ObfuscatedName("y") - int[] field1585; + @ObfuscatedName("o") + int[] field1598; @ObfuscatedName("i") - int[] field1591; - @ObfuscatedName("c") + int[] field1601; + @ObfuscatedName("d") + int[] field1602; + @ObfuscatedName("m") @Export("animationDirection") int animationDirection; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("animationSpeed") int animationSpeed; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("pixels") int[] pixels; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("isLoaded") boolean isLoaded; @ObfuscatedSignature( - signature = "(Lkl;)V" + signature = "(Lkc;)V" ) Texture(Buffer var1) { this.isLoaded = false; this.averageRGB = var1.readUnsignedShort(); - this.field1587 = var1.readUnsignedByte() == 1; + this.field1593 = var1.readUnsignedByte() == 1; int var2 = var1.readUnsignedByte(); if (var2 >= 1 && var2 <= 4) { this.fileIds = new int[var2]; @@ -53,25 +53,25 @@ public class Texture extends Node { } if (var2 > 1) { - this.field1589 = new int[var2 - 1]; + this.field1598 = new int[var2 - 1]; for (var3 = 0; var3 < var2 - 1; ++var3) { - this.field1589[var3] = var1.readUnsignedByte(); + this.field1598[var3] = var1.readUnsignedByte(); } } if (var2 > 1) { - this.field1585 = new int[var2 - 1]; + this.field1601 = new int[var2 - 1]; for (var3 = 0; var3 < var2 - 1; ++var3) { - this.field1585[var3] = var1.readUnsignedByte(); + this.field1601[var3] = var1.readUnsignedByte(); } } - this.field1591 = new int[var2]; + this.field1602 = new int[var2]; for (var3 = 0; var3 < var2; ++var3) { - this.field1591[var3] = var1.readInt(); + this.field1602[var3] = var1.readInt(); } this.animationDirection = var1.readUnsignedByte(); @@ -82,9 +82,9 @@ public class Texture extends Node { } } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(DILhp;)Z" + signature = "(DILhq;)Z" ) @Export("load") boolean load(double var1, int var3, AbstractArchive var4) { @@ -99,86 +99,55 @@ public class Texture extends Node { this.pixels = new int[var5]; for (int var6 = 0; var6 < this.fileIds.length; ++var6) { - int var8 = this.fileIds[var6]; - byte[] var10 = var4.takeFileFlat(var8); - boolean var9; - if (var10 == null) { - var9 = false; - } else { - Tiles.SpriteBuffer_decode(var10); - var9 = true; - } - - IndexedSprite var7; - if (!var9) { - var7 = null; - } else { - IndexedSprite var11 = new IndexedSprite(); - var11.width = class325.SpriteBuffer_spriteWidth; - var11.height = Frames.SpriteBuffer_spriteHeight; - var11.xOffset = class325.SpriteBuffer_xOffsets[0]; - var11.yOffset = MusicPatchPcmStream.SpriteBuffer_yOffsets[0]; - var11.subWidth = class325.SpriteBuffer_spriteWidths[0]; - var11.subHeight = RunException.SpriteBuffer_spriteHeights[0]; - var11.palette = class325.SpriteBuffer_spritePalette; - var11.pixels = PacketBufferNode.SpriteBuffer_pixels[0]; - class325.SpriteBuffer_xOffsets = null; - MusicPatchPcmStream.SpriteBuffer_yOffsets = null; - class325.SpriteBuffer_spriteWidths = null; - RunException.SpriteBuffer_spriteHeights = null; - class325.SpriteBuffer_spritePalette = null; - PacketBufferNode.SpriteBuffer_pixels = null; - var7 = var11; - } - + IndexedSprite var7 = VertexNormal.method3121(var4, this.fileIds[var6]); var7.normalize(); - var10 = var7.pixels; - int[] var18 = var7.palette; - int var12 = this.field1591[var6]; - if ((var12 & -16777216) == 16777216) { + byte[] var8 = var7.pixels; + int[] var9 = var7.palette; + int var10 = this.field1602[var6]; + if ((var10 & -16777216) == 16777216) { } - if ((var12 & -16777216) == 33554432) { + if ((var10 & -16777216) == 33554432) { } + int var11; + int var12; int var13; int var14; - int var15; - int var16; - if ((var12 & -16777216) == 50331648) { - var13 = var12 & 16711935; - var14 = var12 >> 8 & 255; + if ((var10 & -16777216) == 50331648) { + var11 = var10 & 16711935; + var12 = var10 >> 8 & 255; - for (var15 = 0; var15 < var18.length; ++var15) { - var16 = var18[var15]; - if (var16 >> 8 == (var16 & 65535)) { - var16 &= 255; - var18[var15] = var13 * var16 >> 8 & 16711935 | var14 * var16 & 65280; + for (var13 = 0; var13 < var9.length; ++var13) { + var14 = var9[var13]; + if (var14 >> 8 == (var14 & 65535)) { + var14 &= 255; + var9[var13] = var11 * var14 >> 8 & 16711935 | var12 * var14 & 65280; } } } - for (var13 = 0; var13 < var18.length; ++var13) { - var18[var13] = Rasterizer3D.Rasterizer3D_brighten(var18[var13], var1); + for (var11 = 0; var11 < var9.length; ++var11) { + var9[var11] = Rasterizer3D.Rasterizer3D_brighten(var9[var11], var1); } if (var6 == 0) { - var13 = 0; + var11 = 0; } else { - var13 = this.field1589[var6 - 1]; + var11 = this.field1598[var6 - 1]; } - if (var13 == 0) { + if (var11 == 0) { if (var3 == var7.subWidth) { - for (var14 = 0; var14 < var5; ++var14) { - this.pixels[var14] = var18[var10[var14] & 255]; + for (var12 = 0; var12 < var5; ++var12) { + this.pixels[var12] = var9[var8[var12] & 255]; } } else if (var7.subWidth == 64 && var3 == 128) { - var14 = 0; + var12 = 0; - for (var15 = 0; var15 < var3; ++var15) { - for (var16 = 0; var16 < var3; ++var16) { - this.pixels[var14++] = var18[var10[(var15 >> 1 << 6) + (var16 >> 1)] & 255]; + for (var13 = 0; var13 < var3; ++var13) { + for (var14 = 0; var14 < var3; ++var14) { + this.pixels[var12++] = var9[var8[(var13 >> 1 << 6) + (var14 >> 1)] & 255]; } } } else { @@ -186,36 +155,36 @@ public class Texture extends Node { throw new RuntimeException(); } - var14 = 0; + var12 = 0; - for (var15 = 0; var15 < var3; ++var15) { - for (var16 = 0; var16 < var3; ++var16) { - this.pixels[var14++] = var18[var10[(var16 << 1) + (var15 << 1 << 7)] & 255]; + for (var13 = 0; var13 < var3; ++var13) { + for (var14 = 0; var14 < var3; ++var14) { + this.pixels[var12++] = var9[var8[(var14 << 1) + (var13 << 1 << 7)] & 255]; } } } } - if (var13 == 1) { + if (var11 == 1) { } - if (var13 == 2) { + if (var11 == 2) { } - if (var13 == 3) { + if (var11 == 3) { } } return true; } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("reset") void reset() { this.pixels = null; } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("animate") void animate(int var1) { if (this.pixels != null) { diff --git a/runescape-client/src/main/java/TextureLoader.java b/runescape-client/src/main/java/TextureLoader.java index 74a8a8771c..fe74728717 100644 --- a/runescape-client/src/main/java/TextureLoader.java +++ b/runescape-client/src/main/java/TextureLoader.java @@ -3,36 +3,36 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ei") +@ObfuscatedName("ew") @Implements("TextureLoader") public interface TextureLoader { - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IB)[I", - garbageValue = "2" + signature = "(II)[I", + garbageValue = "-1956127937" ) @Export("getTexturePixels") int[] getTexturePixels(int var1); - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "1942090144" + signature = "(IB)I", + garbageValue = "-57" ) @Export("getAverageTextureRGB") int getAverageTextureRGB(int var1); - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "1238853491" + garbageValue = "1875777180" ) - boolean vmethod3236(int var1); + boolean vmethod3403(int var1); - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-818075958" + garbageValue = "-1105399782" ) @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 c9149e045c..604fce5ff9 100644 --- a/runescape-client/src/main/java/TextureProvider.java +++ b/runescape-client/src/main/java/TextureProvider.java @@ -3,53 +3,64 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.Reflection; -@ObfuscatedName("dz") +@ObfuscatedName("dp") @Implements("TextureProvider") public class TextureProvider implements TextureLoader { - @ObfuscatedName("z") + @ObfuscatedName("gl") @ObfuscatedSignature( - signature = "[Ldg;" + signature = "[Llx;" + ) + @Export("crossSprites") + static Sprite[] crossSprites; + @ObfuscatedName("kt") + @ObfuscatedGetter( + intValue = 831989681 + ) + @Export("menuY") + static int menuY; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "[Ldt;" ) @Export("textures") Texture[] textures; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ljv;" + signature = "Ljb;" ) @Export("deque") NodeDeque deque; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 707785193 + intValue = -1515025837 ) @Export("capacity") int capacity; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -55735149 + intValue = -684430177 ) @Export("remaining") int remaining; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("brightness") double brightness; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 678440487 + intValue = -113629701 ) @Export("textureSize") int textureSize; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("archive") AbstractArchive archive; @ObfuscatedSignature( - signature = "(Lhp;Lhp;IDI)V" + signature = "(Lhq;Lhq;IDI)V" ) public TextureProvider(AbstractArchive var1, AbstractArchive var2, int var3, double var4, int var6) { this.deque = new NodeDeque(); @@ -72,10 +83,10 @@ public class TextureProvider implements TextureLoader { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-2135448801" + garbageValue = "-723881921" ) @Export("getLoadedPercentage") public int getLoadedPercentage() { @@ -91,7 +102,7 @@ public class TextureProvider implements TextureLoader { for (int var7 = 0; var7 < var6.length; ++var7) { int var8 = var6[var7]; - if (this.archive.method4127(var8)) { + if (this.archive.method4327(var8)) { ++var2; } } @@ -105,17 +116,17 @@ public class TextureProvider implements TextureLoader { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("setBrightness") public void setBrightness(double var1) { this.brightness = var1; this.clear(); } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IB)[I", - garbageValue = "2" + signature = "(II)[I", + garbageValue = "-1956127937" ) @Export("getTexturePixels") public int[] getTexturePixels(int var1) { @@ -145,39 +156,39 @@ public class TextureProvider implements TextureLoader { return null; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "1942090144" + signature = "(IB)I", + garbageValue = "-57" ) @Export("getAverageTextureRGB") public int getAverageTextureRGB(int var1) { return this.textures[var1] != null ? this.textures[var1].averageRGB : 0; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "1238853491" + garbageValue = "1875777180" ) - public boolean vmethod3236(int var1) { - return this.textures[var1].field1587; + public boolean vmethod3403(int var1) { + return this.textures[var1].field1593; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(II)Z", - garbageValue = "-818075958" + garbageValue = "-1105399782" ) @Export("isLowDetail") public boolean isLowDetail(int var1) { return this.textureSize == 64; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "170454088" + garbageValue = "-519543522" ) @Export("clear") public void clear() { @@ -191,10 +202,10 @@ public class TextureProvider implements TextureLoader { this.remaining = this.capacity; } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "60" + signature = "(II)V", + garbageValue = "456735268" ) @Export("animate") public void animate(int var1) { @@ -208,61 +219,77 @@ public class TextureProvider implements TextureLoader { } - @ObfuscatedName("z") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1068033058" + signature = "(II)Z", + garbageValue = "1911421748" ) - static void method2757() { - Tiles.Tiles_minPlane = 99; - Tiles.field501 = new byte[4][104][104]; - Tiles.field483 = new byte[4][104][104]; - DevicePcmPlayerProvider.field393 = new byte[4][104][104]; - class287.field3634 = new byte[4][104][104]; - Tiles.field488 = new int[4][105][105]; - Tiles.field486 = new byte[4][105][105]; - DevicePcmPlayerProvider.field386 = new int[105][105]; - Tiles.Tiles_hue = new int[104]; - ArchiveLoader.Tiles_saturation = new int[104]; - Tiles.Tiles_lightness = new int[104]; - FontName.Tiles_hueMultiplier = new int[104]; - Tiles.field487 = new int[104]; + public static boolean method2931(int var0) { + return (var0 >> 20 & 1) != 0; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Ljava/lang/String;B)Ljava/lang/Class;", - garbageValue = "-14" + signature = "(II)Z", + garbageValue = "828807862" ) - @Export("loadClassFromDescriptor") - static Class loadClassFromDescriptor(String var0) throws ClassNotFoundException { - if (var0.equals("B")) { - return Byte.TYPE; - } else if (var0.equals("I")) { - return Integer.TYPE; - } else if (var0.equals("S")) { - return Short.TYPE; - } else if (var0.equals("J")) { - return Long.TYPE; - } else if (var0.equals("Z")) { - return Boolean.TYPE; - } else if (var0.equals("F")) { - return Float.TYPE; - } else if (var0.equals("D")) { - return Double.TYPE; - } else if (var0.equals("C")) { - return Character.TYPE; + @Export("loadInterface") + public static boolean loadInterface(int var0) { + if (class215.Widget_loadedInterfaces[var0]) { + return true; + } else if (!Coord.Widget_archive.tryLoadGroup(var0)) { + return false; } else { - return var0.equals("void") ? Void.TYPE : Reflection.findClass(var0); + int var1 = Coord.Widget_archive.getGroupFileCount(var0); + if (var1 == 0) { + class215.Widget_loadedInterfaces[var0] = true; + return true; + } else { + if (Widget.Widget_interfaceComponents[var0] == null) { + Widget.Widget_interfaceComponents[var0] = new Widget[var1]; + } + + for (int var2 = 0; var2 < var1; ++var2) { + if (Widget.Widget_interfaceComponents[var0][var2] == null) { + byte[] var3 = Coord.Widget_archive.takeFile(var0, var2); + if (var3 != null) { + Widget.Widget_interfaceComponents[var0][var2] = new Widget(); + Widget.Widget_interfaceComponents[var0][var2].id = var2 + (var0 << 16); + if (var3[0] == -1) { + Widget.Widget_interfaceComponents[var0][var2].decode(new Buffer(var3)); + } else { + Widget.Widget_interfaceComponents[var0][var2].decodeLegacy(new Buffer(var3)); + } + } + } + } + + class215.Widget_loadedInterfaces[var0] = true; + return true; + } } } - @ObfuscatedName("p") + @ObfuscatedName("lh") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-114" + signature = "(Lhi;B)Lhi;", + garbageValue = "7" ) - public static void method2746() { - ParamDefinition.ParamDefinition_cached.clear(); + static Widget method2909(Widget var0) { + int var2 = class195.getWidgetClickMask(var0); + int var1 = var2 >> 17 & 7; + int var3 = var1; + if (var1 == 0) { + return null; + } else { + for (int var4 = 0; var4 < var3; ++var4) { + var0 = PacketBufferNode.getWidget(var0.parentId); + if (var0 == null) { + return null; + } + } + + return var0; + } } } diff --git a/runescape-client/src/main/java/Tile.java b/runescape-client/src/main/java/Tile.java index 8d701a74d1..5fe8b39227 100644 --- a/runescape-client/src/main/java/Tile.java +++ b/runescape-client/src/main/java/Tile.java @@ -4,135 +4,129 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dl") +@ObfuscatedName("dh") @Implements("Tile") public final class Tile extends Node { - @ObfuscatedName("da") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive13") - static Archive archive13; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 16369307 - ) - @Export("originalPlane") - int originalPlane; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = 1518104939 + intValue = -1309939485 ) @Export("plane") int plane; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1003607853 + intValue = 2038032895 ) @Export("x") int x; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1362708877 + intValue = -1013860717 ) @Export("y") int y; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lef;" - ) - @Export("paint") - TilePaint paint; - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Ldd;" - ) - @Export("model") - TileModel model; @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "Leo;" + @ObfuscatedGetter( + intValue = -371358755 ) - @Export("boundaryObject") - BoundaryObject boundaryObject; - @ObfuscatedName("m") + @Export("originalPlane") + int originalPlane; + @ObfuscatedName("v") @ObfuscatedSignature( signature = "Leg;" ) + @Export("paint") + TilePaint paint; + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "Ldk;" + ) + @Export("model") + TileModel model; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Let;" + ) + @Export("boundaryObject") + BoundaryObject boundaryObject; + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lei;" + ) @Export("wallDecoration") WallDecoration wallDecoration; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Ldj;" + signature = "Ldx;" ) @Export("floorDecoration") FloorDecoration floorDecoration; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "Ldo;" + signature = "Ldy;" ) @Export("tileItemPile") TileItemPile tileItemPile; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = -308551417 + intValue = -1638075719 ) @Export("gameObjectsCount") int gameObjectsCount; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "[Lej;" + signature = "[Lex;" ) @Export("gameObjects") GameObject[] gameObjects; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("gameObjectEdgeMasks") int[] gameObjectEdgeMasks; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 2078500007 + intValue = -2114693013 ) @Export("gameObjectsEdgeMask") int gameObjectsEdgeMask; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = -260677087 + intValue = -1476239689 ) @Export("minPlane") int minPlane; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("drawPrimary") boolean drawPrimary; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("drawSecondary") boolean drawSecondary; - @ObfuscatedName("g") + @ObfuscatedName("e") @Export("drawGameObjects") boolean drawGameObjects; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = 824924819 + intValue = 1357741969 ) @Export("drawGameObjectEdges") int drawGameObjectEdges; - @ObfuscatedName("h") + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = 1066984119 + intValue = 1034029719 ) - int field1610; - @ObfuscatedName("s") + int field1638; + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = 1620350221 + intValue = 772889311 ) - int field1624; + int field1639; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = 2139191781 + intValue = 1173456745 ) - int field1629; - @ObfuscatedName("j") + int field1637; + @ObfuscatedName("g") @ObfuscatedSignature( - signature = "Ldl;" + signature = "Ldh;" ) @Export("linkedBelowTile") Tile linkedBelowTile; @@ -146,22 +140,114 @@ public final class Tile extends Node { this.y = var3; } - @ObfuscatedName("n") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)Lgn;", - garbageValue = "283500885" + signature = "(III)V", + garbageValue = "59620731" ) - public static PacketBufferNode method2849() { - PacketBufferNode var0; - if (PacketBufferNode.PacketBufferNode_packetBufferNodeCount == 0) { - var0 = new PacketBufferNode(); - } else { - var0 = PacketBufferNode.PacketBufferNode_packetBufferNodes[--PacketBufferNode.PacketBufferNode_packetBufferNodeCount]; + static void method3021(int var0, int var1) { + long var2 = (long)((var0 << 16) + var1); + NetFileRequest var4 = (NetFileRequest)NetCache.NetCache_pendingWrites.get(var2); + if (var4 != null) { + NetCache.NetCache_pendingWritesQueue.addLast(var4); + } + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "-2" + ) + public static void method3023() { + try { + JagexCache.JagexCache_dat2File.close(); + + for (int var0 = 0; var0 < JagexCache.idxCount; ++var0) { + ArchiveLoader.JagexCache_idxFiles[var0].close(); + } + + JagexCache.JagexCache_idx255File.close(); + JagexCache.JagexCache_randomDat.close(); + } catch (Exception var2) { } - var0.clientPacket = null; - var0.clientPacketLength = 0; - var0.packetBuffer = new PacketBuffer(5000); - return var0; + } + + @ObfuscatedName("fp") + @ObfuscatedSignature( + signature = "(IB)V", + garbageValue = "104" + ) + @Export("updateGameState") + static void updateGameState(int var0) { + if (var0 != Client.gameState) { + if (Client.gameState == 0) { + WorldMapID.client.method1029(); + } + + if (var0 == 20 || var0 == 40 || var0 == 45) { + Client.loginState = 0; + Client.field666 = 0; + Client.field667 = 0; + Client.timer.method5118(var0); + if (var0 != 20) { + WorldMapLabelSize.method235(false); + } + } + + if (var0 != 20 && var0 != 40 && Tiles.field499 != null) { + Tiles.field499.close(); + Tiles.field499 = null; + } + + if (Client.gameState == 25) { + Client.field688 = 0; + Client.field684 = 0; + Client.field685 = 1; + Client.field686 = 0; + Client.field687 = 1; + } + + if (var0 != 5 && var0 != 10) { + if (var0 == 20) { + AttackOption.method2218(WorldMapID.archive10, GrandExchangeOfferUnitPriceComparator.archive8, true, Client.gameState == 11 ? 4 : 0); + } else if (var0 == 11) { + AttackOption.method2218(WorldMapID.archive10, GrandExchangeOfferUnitPriceComparator.archive8, false, 4); + } else { + Coord.method4144(); + } + } else { + AttackOption.method2218(WorldMapID.archive10, GrandExchangeOfferUnitPriceComparator.archive8, true, 0); + } + + Client.gameState = var0; + } + } + + @ObfuscatedName("fb") + @ObfuscatedSignature( + signature = "(Liv;IIII)V", + garbageValue = "-723801001" + ) + @Export("addSequenceSoundEffect") + static void addSequenceSoundEffect(SequenceDefinition var0, int var1, int var2, int var3) { + if (Client.soundEffectCount < 50 && Client.field868 != 0) { + if (var0.soundEffects != null && var1 < var0.soundEffects.length) { + int var4 = var0.soundEffects[var1]; + if (var4 != 0) { + int var5 = var4 >> 8; + int var6 = var4 >> 4 & 7; + int var7 = var4 & 15; + Client.soundEffectIds[Client.soundEffectCount] = var5; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var6; + Client.queuedSoundEffectDelays[Client.soundEffectCount] = 0; + Client.soundEffects[Client.soundEffectCount] = null; + int var8 = (var2 - 64) / 128; + int var9 = (var3 - 64) / 128; + Client.soundLocations[Client.soundEffectCount] = var7 + (var9 << 8) + (var8 << 16); + ++Client.soundEffectCount; + } + } + } } } diff --git a/runescape-client/src/main/java/TileItem.java b/runescape-client/src/main/java/TileItem.java index 434cb090cf..54d1a9c80e 100644 --- a/runescape-client/src/main/java/TileItem.java +++ b/runescape-client/src/main/java/TileItem.java @@ -4,29 +4,24 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cj") +@ObfuscatedName("cl") @Implements("TileItem") public final class TileItem extends Entity { - @ObfuscatedName("st") - @ObfuscatedSignature( - signature = "Lq;" - ) - @Export("grandExchangeEvents") - static GrandExchangeEvents grandExchangeEvents; - @ObfuscatedName("y") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1727946021 + intValue = 731743959 ) - public static int field1223; - @ObfuscatedName("z") + @Export("clientType") + public static int clientType; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -1488876063 + intValue = -1432392447 ) @Export("id") int id; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1667884647 + intValue = -423063441 ) @Export("quantity") int quantity; @@ -34,194 +29,13 @@ public final class TileItem extends Entity { TileItem() { } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Ldh;", - garbageValue = "-62237472" + signature = "(B)Ldv;", + garbageValue = "-40" ) @Export("getModel") protected final Model getModel() { - return Occluder.ItemDefinition_get(this.id).getModel(this.quantity); - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "160391262" - ) - @Export("iLog") - public static int iLog(int var0) { - int var1 = 0; - if (var0 < 0 || var0 >= 65536) { - var0 >>>= 16; - var1 += 16; - } - - if (var0 >= 256) { - var0 >>>= 8; - var1 += 8; - } - - if (var0 >= 16) { - var0 >>>= 4; - var1 += 4; - } - - if (var0 >= 4) { - var0 >>>= 2; - var1 += 2; - } - - if (var0 >= 1) { - var0 >>>= 1; - ++var1; - } - - return var0 + var1; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1159842254" - ) - static int method2129(int var0, Script var1, boolean var2) { - if (var0 < 1000) { - return WorldMapSection2.method342(var0, var1, var2); - } else if (var0 < 1100) { - return Login.method2115(var0, var1, var2); - } else if (var0 < 1200) { - return class81.method2062(var0, var1, var2); - } else if (var0 < 1300) { - return FriendLoginUpdate.method5193(var0, var1, var2); - } else if (var0 < 1400) { - return class40.method797(var0, var1, var2); - } else if (var0 < 1500) { - return Tiles.method1110(var0, var1, var2); - } else if (var0 < 1600) { - return FontName.method5271(var0, var1, var2); - } else if (var0 < 1700) { - return UserComparator6.method3407(var0, var1, var2); - } else if (var0 < 1800) { - return VarpDefinition.method4347(var0, var1, var2); - } else if (var0 < 1900) { - return World.method1815(var0, var1, var2); - } else if (var0 < 2000) { - return ClientPacket.method3579(var0, var1, var2); - } else if (var0 < 2100) { - return Login.method2115(var0, var1, var2); - } else if (var0 < 2200) { - return class81.method2062(var0, var1, var2); - } else if (var0 < 2300) { - return FriendLoginUpdate.method5193(var0, var1, var2); - } else if (var0 < 2400) { - return class40.method797(var0, var1, var2); - } else if (var0 < 2500) { - return Tiles.method1110(var0, var1, var2); - } else if (var0 < 2600) { - return class51.method921(var0, var1, var2); - } else if (var0 < 2700) { - return Client.method1750(var0, var1, var2); - } else if (var0 < 2800) { - return UserComparator6.method3411(var0, var1, var2); - } else if (var0 < 2900) { - return WorldMapRegion.method506(var0, var1, var2); - } else if (var0 < 3000) { - return ClientPacket.method3579(var0, var1, var2); - } else if (var0 < 3200) { - return Messages.method2211(var0, var1, var2); - } else if (var0 < 3300) { - return ReflectionCheck.method2271(var0, var1, var2); - } else if (var0 < 3400) { - return ServerPacket.method3577(var0, var1, var2); - } else if (var0 < 3500) { - return PacketBuffer.method5423(var0, var1, var2); - } else if (var0 < 3700) { - return Buddy.method5111(var0, var1, var2); - } else if (var0 < 4000) { - return AbstractWorldMapData.method289(var0, var1, var2); - } else if (var0 < 4100) { - return WorldMapAreaData.method716(var0, var1, var2); - } else if (var0 < 4200) { - return WorldMapData_0.method177(var0, var1, var2); - } else if (var0 < 4300) { - return class222.method4090(var0, var1, var2); - } else if (var0 < 5100) { - return Tiles.method1156(var0, var1, var2); - } else if (var0 < 5400) { - return Canvas.method889(var0, var1, var2); - } else if (var0 < 5600) { - return WorldMapData_1.method749(var0, var1, var2); - } else if (var0 < 5700) { - return class222.method4089(var0, var1, var2); - } else if (var0 < 6300) { - return Entity.method3216(var0, var1, var2); - } else if (var0 < 6600) { - return class219.method4080(var0, var1, var2); - } else { - return var0 < 6700 ? UserComparator6.method3402(var0, var1, var2) : 2; - } - } - - @ObfuscatedName("a") - @ObfuscatedSignature( - signature = "(CB)Z", - garbageValue = "-1" - ) - @Export("isCharPrintable") - public static boolean isCharPrintable(char var0) { - if (var0 >= ' ' && var0 <= '~') { - return true; - } else if (var0 >= 160 && var0 <= 255) { - return true; - } else { - return var0 == 8364 || var0 == 338 || var0 == 8212 || var0 == 339 || var0 == 376; - } - } - - @ObfuscatedName("ip") - @ObfuscatedSignature( - signature = "(Lho;IIZI)V", - garbageValue = "97221829" - ) - @Export("alignWidgetSize") - static void alignWidgetSize(Widget var0, int var1, int var2, boolean var3) { - int var4 = var0.width; - int var5 = var0.height; - if (var0.widthAlignment == 0) { - var0.width = var0.rawWidth; - } else if (var0.widthAlignment == 1) { - var0.width = var1 - var0.rawWidth; - } else if (var0.widthAlignment == 2) { - var0.width = var0.rawWidth * var1 >> 14; - } - - if (var0.heightAlignment == 0) { - var0.height = var0.rawHeight; - } else if (var0.heightAlignment == 1) { - var0.height = var2 - var0.rawHeight; - } else if (var0.heightAlignment == 2) { - var0.height = var2 * var0.rawHeight >> 14; - } - - if (var0.widthAlignment == 4) { - var0.width = var0.field2655 * var0.height / var0.field2629; - } - - if (var0.heightAlignment == 4) { - var0.height = var0.field2629 * var0.width / var0.field2655; - } - - if (var0.contentType == 1337) { - Client.viewportWidget = var0; - } - - if (var3 && var0.onResize != null && (var4 != var0.width || var5 != var0.height)) { - ScriptEvent var6 = new ScriptEvent(); - var6.widget = var0; - var6.args = var0.onResize; - Client.scriptEvents.addFirst(var6); - } - + return class222.ItemDefinition_get(this.id).getModel(this.quantity); } } diff --git a/runescape-client/src/main/java/TileItemPile.java b/runescape-client/src/main/java/TileItemPile.java index 4bd8bc29f5..7fc49a0331 100644 --- a/runescape-client/src/main/java/TileItemPile.java +++ b/runescape-client/src/main/java/TileItemPile.java @@ -4,58 +4,73 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("do") +@ObfuscatedName("dy") @Implements("TileItemPile") public final class TileItemPile { - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Ler;" - ) - @Export("first") - Entity first; - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -149113077 + intValue = 960185027 ) @Export("tileHeight") int tileHeight; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 905063527 + intValue = 518288239 ) @Export("x") int x; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1956463223 + intValue = 1518597633 ) @Export("y") int y; - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Ler;" + signature = "Lep;" + ) + @Export("first") + Entity first; + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "Lep;" ) @Export("second") Entity second; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Ler;" + signature = "Lep;" ) @Export("third") Entity third; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - longValue = 3581588196263566823L + longValue = 1765844833924880689L ) @Export("tag") long tag; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 814116925 + intValue = -483031039 ) @Export("height") int height; TileItemPile() { } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;Lhq;Lhq;Lhq;I)V", + garbageValue = "320810810" + ) + @Export("Widget_setArchives") + public static void Widget_setArchives(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2, AbstractArchive var3) { + Coord.Widget_archive = var0; + StructDefinition.Widget_modelsArchive = var1; + Widget.Widget_spritesArchive = var2; + Widget.Widget_fontsArchive = var3; + Widget.Widget_interfaceComponents = new Widget[Coord.Widget_archive.getGroupCount()][]; + class215.Widget_loadedInterfaces = new boolean[Coord.Widget_archive.getGroupCount()]; + } } diff --git a/runescape-client/src/main/java/TileModel.java b/runescape-client/src/main/java/TileModel.java index f20bc559fd..9918a59a4d 100644 --- a/runescape-client/src/main/java/TileModel.java +++ b/runescape-client/src/main/java/TileModel.java @@ -2,77 +2,77 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("dd") +@ObfuscatedName("dk") @Implements("TileModel") public final class TileModel { - @ObfuscatedName("w") - static int[] field1553; - @ObfuscatedName("t") - static int[] field1569; - @ObfuscatedName("g") - static int[] field1570; - @ObfuscatedName("x") - static int[] field1571; - @ObfuscatedName("h") - static int[] field1573; + @ObfuscatedName("j") + static int[] field1577; + @ObfuscatedName("r") + static int[] field1578; + @ObfuscatedName("e") + static int[] field1562; @ObfuscatedName("s") - static final int[][] field1555; - @ObfuscatedName("f") - static final int[][] field1559; + static int[] field1580; + @ObfuscatedName("b") + static int[] field1573; @ObfuscatedName("z") + static final int[][] field1582; + @ObfuscatedName("f") + static final int[][] field1583; + @ObfuscatedName("a") @Export("vertexX") int[] vertexX; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("vertexY") int[] vertexY; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("vertexZ") int[] vertexZ; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("triangleColorA") int[] triangleColorA; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("triangleColorB") int[] triangleColorB; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("triangleColorC") int[] triangleColorC; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("faceX") int[] faceX; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("faceY") int[] faceY; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("faceZ") int[] faceZ; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("triangleTextureId") int[] triangleTextureId; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("isFlat") boolean isFlat; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("shape") int shape; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("rotation") int rotation; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("underlayRgb") int underlayRgb; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("overlayRgb") int overlayRgb; static { - field1553 = new int[6]; - field1569 = new int[6]; - field1570 = new int[6]; - field1571 = new int[6]; + field1577 = new int[6]; + field1578 = new int[6]; + field1562 = new int[6]; + field1580 = new int[6]; field1573 = new int[6]; - field1555 = new int[][]{{1, 3, 5, 7}, {1, 3, 5, 7}, {1, 3, 5, 7}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 2, 6}, {1, 3, 5, 7, 2, 8}, {1, 3, 5, 7, 2, 8}, {1, 3, 5, 7, 11, 12}, {1, 3, 5, 7, 11, 12}, {1, 3, 5, 7, 13, 14}}; - field1559 = new int[][]{{0, 1, 2, 3, 0, 0, 1, 3}, {1, 1, 2, 3, 1, 0, 1, 3}, {0, 1, 2, 3, 1, 0, 1, 3}, {0, 0, 1, 2, 0, 0, 2, 4, 1, 0, 4, 3}, {0, 0, 1, 4, 0, 0, 4, 3, 1, 1, 2, 4}, {0, 0, 4, 3, 1, 0, 1, 2, 1, 0, 2, 4}, {0, 1, 2, 4, 1, 0, 1, 4, 1, 0, 4, 3}, {0, 4, 1, 2, 0, 4, 2, 5, 1, 0, 4, 5, 1, 0, 5, 3}, {0, 4, 1, 2, 0, 4, 2, 3, 0, 4, 3, 5, 1, 0, 4, 5}, {0, 0, 4, 5, 1, 4, 1, 2, 1, 4, 2, 3, 1, 4, 3, 5}, {0, 0, 1, 5, 0, 1, 4, 5, 0, 1, 2, 4, 1, 0, 5, 3, 1, 5, 4, 3, 1, 4, 2, 3}, {1, 0, 1, 5, 1, 1, 4, 5, 1, 1, 2, 4, 0, 0, 5, 3, 0, 5, 4, 3, 0, 4, 2, 3}, {1, 0, 5, 4, 1, 0, 1, 5, 0, 0, 4, 3, 0, 4, 5, 3, 0, 5, 2, 3, 0, 1, 2, 5}}; + field1582 = new int[][]{{1, 3, 5, 7}, {1, 3, 5, 7}, {1, 3, 5, 7}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 6}, {1, 3, 5, 7, 2, 6}, {1, 3, 5, 7, 2, 8}, {1, 3, 5, 7, 2, 8}, {1, 3, 5, 7, 11, 12}, {1, 3, 5, 7, 11, 12}, {1, 3, 5, 7, 13, 14}}; + field1583 = new int[][]{{0, 1, 2, 3, 0, 0, 1, 3}, {1, 1, 2, 3, 1, 0, 1, 3}, {0, 1, 2, 3, 1, 0, 1, 3}, {0, 0, 1, 2, 0, 0, 2, 4, 1, 0, 4, 3}, {0, 0, 1, 4, 0, 0, 4, 3, 1, 1, 2, 4}, {0, 0, 4, 3, 1, 0, 1, 2, 1, 0, 2, 4}, {0, 1, 2, 4, 1, 0, 1, 4, 1, 0, 4, 3}, {0, 4, 1, 2, 0, 4, 2, 5, 1, 0, 4, 5, 1, 0, 5, 3}, {0, 4, 1, 2, 0, 4, 2, 3, 0, 4, 3, 5, 1, 0, 4, 5}, {0, 0, 4, 5, 1, 4, 1, 2, 1, 4, 2, 3, 1, 4, 3, 5}, {0, 0, 1, 5, 0, 1, 4, 5, 0, 1, 2, 4, 1, 0, 5, 3, 1, 5, 4, 3, 1, 4, 2, 3}, {1, 0, 1, 5, 1, 1, 4, 5, 1, 1, 2, 4, 0, 0, 5, 3, 0, 5, 4, 3, 0, 4, 2, 3}, {1, 0, 5, 4, 1, 0, 1, 5, 0, 0, 4, 3, 0, 4, 5, 3, 0, 5, 2, 3, 0, 1, 2, 5}}; } TileModel(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, int var13, int var14, int var15, int var16, int var17, int var18, int var19) { @@ -89,7 +89,7 @@ public final class TileModel { int var21 = var20 / 2; int var22 = var20 / 4; int var23 = var20 * 3 / 4; - int[] var24 = field1555[var1]; + int[] var24 = field1582[var1]; int var25 = var24.length; this.vertexX = new int[var25]; this.vertexY = new int[var25]; @@ -224,7 +224,7 @@ public final class TileModel { var27[var30] = var36; } - int[] var38 = field1559[var1]; + int[] var38 = field1583[var1]; var31 = var38.length / 4; this.faceX = new int[var31]; this.faceY = new int[var31]; diff --git a/runescape-client/src/main/java/TilePaint.java b/runescape-client/src/main/java/TilePaint.java index b531e78aa0..7635aaad24 100644 --- a/runescape-client/src/main/java/TilePaint.java +++ b/runescape-client/src/main/java/TilePaint.java @@ -4,45 +4,45 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ef") +@ObfuscatedName("eg") @Implements("TilePaint") public final class TilePaint { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 968490533 + intValue = -1607728329 ) @Export("swColor") int swColor; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -721233201 + intValue = -293038201 ) @Export("seColor") int seColor; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1592287523 + intValue = -1492739509 ) @Export("neColor") int neColor; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -100726041 + intValue = 276503717 ) @Export("nwColor") int nwColor; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 2026223793 + intValue = -1272946255 ) @Export("texture") int texture; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("isFlat") boolean isFlat; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1661774659 + intValue = 609514679 ) @Export("rgb") int rgb; @@ -58,57 +58,33 @@ public final class TilePaint { this.isFlat = var7; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;II)Ljava/lang/String;", - garbageValue = "-964205547" + signature = "([BIIII[Lfm;I)V", + garbageValue = "1145128419" ) - static String method3042(Buffer var0, int var1) { - try { - int var2 = var0.readUShortSmart(); - if (var2 > var1) { - var2 = var1; + static final void method3200(byte[] var0, int var1, int var2, int var3, int var4, CollisionMap[] var5) { + int var7; + int var8; + for (int var6 = 0; var6 < 4; ++var6) { + for (var7 = 0; var7 < 64; ++var7) { + for (var8 = 0; var8 < 64; ++var8) { + if (var7 + var1 > 0 && var7 + var1 < 103 && var8 + var2 > 0 && var8 + var2 < 103) { + int[] var10000 = var5[var6].flags[var7 + var1]; + var10000[var8 + var2] &= -16777217; + } + } } - - byte[] var3 = new byte[var2]; - var0.offset += class210.huffman.decompress(var0.array, var0.offset, var3, 0, var2); - String var4 = ArchiveLoader.decodeStringCp1252(var3, 0, var2); - return var4; - } catch (Exception var6) { - return "Cabbage"; - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;I)I", - garbageValue = "800355488" - ) - @Export("parseInt") - public static int parseInt(CharSequence var0) { - return SoundCache.parseIntCustomRadix(var0, 10, true); - } - - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(ZI)V", - garbageValue = "-2065502658" - ) - @Export("Login_promptCredentials") - static void Login_promptCredentials(boolean var0) { - Login.Login_response1 = ""; - Login.Login_response2 = "Enter your username/email & password."; - Login.Login_response3 = ""; - Login.loginIndex = 2; - if (var0) { - Login.Login_password = ""; } - InterfaceParent.method1197(); - if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { - Login.currentLoginField = 1; - } else { - Login.currentLoginField = 0; + Buffer var10 = new Buffer(var0); + + for (var7 = 0; var7 < 4; ++var7) { + for (var8 = 0; var8 < 64; ++var8) { + for (int var9 = 0; var9 < 64; ++var9) { + class312.loadTerrain(var10, var7, var8 + var1, var9 + var2, var3, var4, 0); + } + } } } diff --git a/runescape-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java index d2efcda5f8..2c111f49ef 100644 --- a/runescape-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -5,548 +5,179 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bm") +@ObfuscatedName("bd") @Implements("Tiles") public final class Tiles { - @ObfuscatedName("rv") - @ObfuscatedSignature( - signature = "Lbf;" - ) - @Export("friendSystem") - public static FriendSystem friendSystem; - @ObfuscatedName("sv") - @ObfuscatedSignature( - signature = "Lla;" - ) - @Export("worldMap") - static WorldMap worldMap; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("Tiles_heights") static int[][][] Tiles_heights; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("Tiles_renderFlags") static byte[][][] Tiles_renderFlags; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 380288965 + intValue = -1836761935 ) @Export("Tiles_minPlane") static int Tiles_minPlane; - @ObfuscatedName("u") - static byte[][][] field501; - @ObfuscatedName("r") + @ObfuscatedName("v") + static byte[][][] field485; + @ObfuscatedName("l") + static byte[][][] field482; + @ObfuscatedName("c") static byte[][][] field483; - @ObfuscatedName("m") - static byte[][][] field486; @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "Llw;" + ) + @Export("logoSprite") + static IndexedSprite logoSprite; + @ObfuscatedName("d") @Export("Tiles_hue") static int[] Tiles_hue; - @ObfuscatedName("b") + @ObfuscatedName("m") + @Export("Tiles_saturation") + static int[] Tiles_saturation; + @ObfuscatedName("p") @Export("Tiles_lightness") static int[] Tiles_lightness; - @ObfuscatedName("a") - static int[] field487; - @ObfuscatedName("e") - static int[][][] field488; - @ObfuscatedName("x") - static final int[] field489; @ObfuscatedName("h") - static final int[] field493; + @Export("Tiles_hueMultiplier") + static int[] Tiles_hueMultiplier; + @ObfuscatedName("x") + static int[][][] field488; @ObfuscatedName("s") + static final int[] field489; + @ObfuscatedName("b") + static final int[] field490; + @ObfuscatedName("z") static final int[] field491; @ObfuscatedName("f") - static final int[] field492; - @ObfuscatedName("j") - static final int[] field484; - @ObfuscatedName("d") + static final int[] field498; + @ObfuscatedName("g") + static final int[] field493; + @ObfuscatedName("w") static final int[] field494; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = 832386391 + intValue = 1357513063 ) - static int field482; - @ObfuscatedName("k") + static int field495; + @ObfuscatedName("y") @ObfuscatedGetter( - intValue = 1017991539 + intValue = -1661743101 ) static int field496; @ObfuscatedName("fy") - @ObfuscatedGetter( - longValue = 5157755524987291675L + @ObfuscatedSignature( + signature = "Lku;" ) - static long field495; + static AbstractSocket field499; + @ObfuscatedName("hp") + @ObfuscatedGetter( + intValue = 194676221 + ) + static int field497; static { Tiles_heights = new int[4][105][105]; Tiles_renderFlags = new byte[4][104][104]; Tiles_minPlane = 99; field489 = new int[]{1, 2, 4, 8}; - field493 = new int[]{16, 32, 64, 128}; + field490 = new int[]{16, 32, 64, 128}; field491 = new int[]{1, 0, -1, 0}; - field492 = new int[]{0, -1, 0, 1}; - field484 = new int[]{1, -1, -1, 1}; + field498 = new int[]{0, -1, 0, 1}; + field493 = new int[]{1, -1, -1, 1}; field494 = new int[]{-1, -1, 1, 1}; - field482 = (int)(Math.random() * 17.0D) - 8; + field495 = (int)(Math.random() * 17.0D) - 8; field496 = (int)(Math.random() * 33.0D) - 16; } - @ObfuscatedName("c") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "([BB)V", - garbageValue = "36" + signature = "(IB)I", + garbageValue = "4" ) - @Export("SpriteBuffer_decode") - public static void SpriteBuffer_decode(byte[] var0) { - Buffer var1 = new Buffer(var0); - var1.offset = var0.length - 2; - class325.SpriteBuffer_spriteCount = var1.readUnsignedShort(); - class325.SpriteBuffer_xOffsets = new int[class325.SpriteBuffer_spriteCount]; - MusicPatchPcmStream.SpriteBuffer_yOffsets = new int[class325.SpriteBuffer_spriteCount]; - class325.SpriteBuffer_spriteWidths = new int[class325.SpriteBuffer_spriteCount]; - RunException.SpriteBuffer_spriteHeights = new int[class325.SpriteBuffer_spriteCount]; - PacketBufferNode.SpriteBuffer_pixels = new byte[class325.SpriteBuffer_spriteCount][]; - var1.offset = var0.length - 7 - class325.SpriteBuffer_spriteCount * 8; - class325.SpriteBuffer_spriteWidth = var1.readUnsignedShort(); - Frames.SpriteBuffer_spriteHeight = var1.readUnsignedShort(); - int var2 = (var1.readUnsignedByte() & 255) + 1; + @Export("iLog") + public static int iLog(int var0) { + int var1 = 0; + if (var0 < 0 || var0 >= 65536) { + var0 >>>= 16; + var1 += 16; + } + if (var0 >= 256) { + var0 >>>= 8; + var1 += 8; + } + + if (var0 >= 16) { + var0 >>>= 4; + var1 += 4; + } + + if (var0 >= 4) { + var0 >>>= 2; + var1 += 2; + } + + if (var0 >= 1) { + var0 >>>= 1; + ++var1; + } + + return var0 + var1; + } + + @ObfuscatedName("ae") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-1896878651" + ) + static int method1215(int var0, Script var1, boolean var2) { int var3; - for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { - class325.SpriteBuffer_xOffsets[var3] = var1.readUnsignedShort(); - } - - for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { - MusicPatchPcmStream.SpriteBuffer_yOffsets[var3] = var1.readUnsignedShort(); - } - - for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { - class325.SpriteBuffer_spriteWidths[var3] = var1.readUnsignedShort(); - } - - for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { - RunException.SpriteBuffer_spriteHeights[var3] = var1.readUnsignedShort(); - } - - var1.offset = var0.length - 7 - class325.SpriteBuffer_spriteCount * 8 - (var2 - 1) * 3; - class325.SpriteBuffer_spritePalette = new int[var2]; - - for (var3 = 1; var3 < var2; ++var3) { - class325.SpriteBuffer_spritePalette[var3] = var1.readMedium(); - if (class325.SpriteBuffer_spritePalette[var3] == 0) { - class325.SpriteBuffer_spritePalette[var3] = 1; - } - } - - var1.offset = 0; - - for (var3 = 0; var3 < class325.SpriteBuffer_spriteCount; ++var3) { - int var4 = class325.SpriteBuffer_spriteWidths[var3]; - int var5 = RunException.SpriteBuffer_spriteHeights[var3]; - int var6 = var4 * var5; - byte[] var7 = new byte[var6]; - PacketBufferNode.SpriteBuffer_pixels[var3] = var7; - int var8 = var1.readUnsignedByte(); - int var9; - if (var8 == 0) { - for (var9 = 0; var9 < var6; ++var9) { - var7[var9] = var1.readByte(); - } - } else if (var8 == 1) { - for (var9 = 0; var9 < var4; ++var9) { - for (int var10 = 0; var10 < var5; ++var10) { - var7[var9 + var4 * var10] = var1.readByte(); - } - } - } - } - - } - - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "(ILcu;ZB)I", - garbageValue = "-18" - ) - static int method1110(int var0, Script var1, boolean var2) { - Widget var3; - if (var0 >= 2000) { - var0 -= 1000; - var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - } else { - var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - } - - String var4 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - int[] var5 = null; - if (var4.length() > 0 && var4.charAt(var4.length() - 1) == 'Y') { - int var6 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var6 > 0) { - for (var5 = new int[var6]; var6-- > 0; var5[var6] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]) { - } + if (var0 == ScriptOpcodes.CAM_FORCEANGLE) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + int var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + if (!Client.isCameraLocked) { + Client.camAngleX = var3; + Client.camAngleY = var4; } - var4 = var4.substring(0, var4.length() - 1); - } - - Object[] var8 = new Object[var4.length() + 1]; - - int var7; - for (var7 = var8.length - 1; var7 >= 1; --var7) { - if (var4.charAt(var7 - 1) == 's') { - var8[var7] = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - } else { - var8[var7] = new Integer(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - } - } - - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var7 != -1) { - var8[0] = new Integer(var7); - } else { - var8 = null; - } - - if (var0 == ScriptOpcodes.CC_SETONCLICK) { - var3.onClick = var8; - } else if (var0 == ScriptOpcodes.CC_SETONHOLD) { - var3.onHold = var8; - } else if (var0 == ScriptOpcodes.CC_SETONRELEASE) { - var3.onRelease = var8; - } else if (var0 == ScriptOpcodes.CC_SETONMOUSEOVER) { - var3.onMouseOver = var8; - } else if (var0 == ScriptOpcodes.CC_SETONMOUSELEAVE) { - var3.onMouseLeave = var8; - } else if (var0 == ScriptOpcodes.CC_SETONDRAG) { - var3.onDrag = var8; - } else if (var0 == ScriptOpcodes.CC_SETONTARGETLEAVE) { - var3.onTargetLeave = var8; - } else if (var0 == ScriptOpcodes.CC_SETONVARTRANSMIT) { - var3.onVarTransmit = var8; - var3.varTransmitTriggers = var5; - } else if (var0 == ScriptOpcodes.CC_SETONTIMER) { - var3.onTimer = var8; - } else if (var0 == ScriptOpcodes.CC_SETONOP) { - var3.onOp = var8; - } else if (var0 == ScriptOpcodes.CC_SETONDRAGCOMPLETE) { - var3.onDragComplete = var8; - } else if (var0 == ScriptOpcodes.CC_SETONCLICKREPEAT) { - var3.onClickRepeat = var8; - } else if (var0 == ScriptOpcodes.CC_SETONMOUSEREPEAT) { - var3.onMouseRepeat = var8; - } else if (var0 == ScriptOpcodes.CC_SETONINVTRANSMIT) { - var3.onInvTransmit = var8; - var3.invTransmitTriggers = var5; - } else if (var0 == ScriptOpcodes.CC_SETONSTATTRANSMIT) { - var3.onStatTransmit = var8; - var3.statTransmitTriggers = var5; - } else if (var0 == ScriptOpcodes.CC_SETONTARGETENTER) { - var3.onTargetEnter = var8; - } else if (var0 == ScriptOpcodes.CC_SETONSCROLLWHEEL) { - var3.onScroll = var8; - } else if (var0 == ScriptOpcodes.CC_SETONCHATTRANSMIT) { - var3.onChatTransmit = var8; - } else if (var0 == ScriptOpcodes.CC_SETONKEY) { - var3.onKey = var8; - } else if (var0 == ScriptOpcodes.CC_SETONFRIENDTRANSMIT) { - var3.onFriendTransmit = var8; - } else if (var0 == ScriptOpcodes.CC_SETONCLANTRANSMIT) { - var3.onClanTransmit = var8; - } else if (var0 == ScriptOpcodes.CC_SETONMISCTRANSMIT) { - var3.onMiscTransmit = var8; - } else if (var0 == ScriptOpcodes.CC_SETONDIALOGABORT) { - var3.onDialogAbort = var8; - } else if (var0 == ScriptOpcodes.CC_SETONSUBCHANGE) { - var3.onSubChange = var8; - } else if (var0 == ScriptOpcodes.CC_SETONSTOCKTRANSMIT) { - var3.onStockTransmit = var8; - } else if (var0 == 1426) { - var3.field2662 = var8; - } else { - if (var0 != ScriptOpcodes.CC_SETONRESIZE) { - return 2; - } - - var3.onResize = var8; - } - - var3.hasListener = true; - return 1; - } - - @ObfuscatedName("ao") - @ObfuscatedSignature( - signature = "(ILcu;ZB)I", - garbageValue = "59" - ) - static int method1156(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.CHAT_GETFILTER_PUBLIC) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.publicChatMode; return 1; - } else if (var0 == ScriptOpcodes.CHAT_SETFILTER) { - Interpreter.Interpreter_intStackSize -= 3; - Client.publicChatMode = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - class219.privateChatMode = Fonts.method5273(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - if (class219.privateChatMode == null) { - class219.privateChatMode = PrivateChatMode.field3791; + } else if (var0 == ScriptOpcodes.CAM_GETANGLE_XA) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.camAngleX; + return 1; + } else if (var0 == ScriptOpcodes.CAM_GETANGLE_YA) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.camAngleY; + return 1; + } else if (var0 == ScriptOpcodes.CAM_SETFOLLOWHEIGHT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var3 < 0) { + var3 = 0; } - Client.tradeChatMode = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - PacketBufferNode var18 = InterfaceParent.getPacketBufferNode(ClientPacket.field2233, Client.packetWriter.isaacCipher); - var18.packetBuffer.writeByte(Client.publicChatMode); - var18.packetBuffer.writeByte(class219.privateChatMode.field3793); - var18.packetBuffer.writeByte(Client.tradeChatMode); - Client.packetWriter.addNode(var18); + Client.camFollowHeight = var3; + return 1; + } else if (var0 == ScriptOpcodes.CAM_GETFOLLOWHEIGHT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.camFollowHeight; return 1; } else { - String var3; - int var4; - if (var0 == ScriptOpcodes.CHAT_SENDABUSEREPORT) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - PacketBufferNode var6 = InterfaceParent.getPacketBufferNode(ClientPacket.field2276, Client.packetWriter.isaacCipher); - var6.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var3) + 2); - var6.packetBuffer.writeStringCp1252NullTerminated(var3); - var6.packetBuffer.writeByte(var4 - 1); - var6.packetBuffer.writeByte(var5); - Client.packetWriter.addNode(var6); - return 1; - } else { - int var10; - if (var0 == ScriptOpcodes.CHAT_GETHISTORY_BYTYPEANDLINE) { - Interpreter.Interpreter_intStackSize -= 2; - var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Message var15 = HealthBarUpdate.Messages_getByChannelAndID(var10, var4); - if (var15 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.count; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.cycle; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var15.sender != null ? var15.sender : ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var15.prefix != null ? var15.prefix : ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var15.text != null ? var15.text : ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.isFromFriend() ? 1 : (var15.isFromIgnored() ? 2 : 0); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CHAT_GETHISTORY_BYUID) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Message var16 = GrandExchangeOfferOwnWorldComparator.Messages_getMessage(var10); - if (var16 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var16.type; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var16.cycle; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16.sender != null ? var16.sender : ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16.prefix != null ? var16.prefix : ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16.text != null ? var16.text : ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var16.isFromFriend() ? 1 : (var16.isFromIgnored() ? 2 : 0); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CHAT_GETFILTER_PRIVATE) { - if (class219.privateChatMode == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class219.privateChatMode.field3793; - } - - return 1; - } else if (var0 == ScriptOpcodes.CHAT_SENDPUBLIC) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - String var14 = var3.toLowerCase(); - byte var17 = 0; - if (var14.startsWith("yellow:")) { - var17 = 0; - var3 = var3.substring("yellow:".length()); - } else if (var14.startsWith("red:")) { - var17 = 1; - var3 = var3.substring("red:".length()); - } else if (var14.startsWith("green:")) { - var17 = 2; - var3 = var3.substring("green:".length()); - } else if (var14.startsWith("cyan:")) { - var17 = 3; - var3 = var3.substring("cyan:".length()); - } else if (var14.startsWith("purple:")) { - var17 = 4; - var3 = var3.substring("purple:".length()); - } else if (var14.startsWith("white:")) { - var17 = 5; - var3 = var3.substring("white:".length()); - } else if (var14.startsWith("flash1:")) { - var17 = 6; - var3 = var3.substring("flash1:".length()); - } else if (var14.startsWith("flash2:")) { - var17 = 7; - var3 = var3.substring("flash2:".length()); - } else if (var14.startsWith("flash3:")) { - var17 = 8; - var3 = var3.substring("flash3:".length()); - } else if (var14.startsWith("glow1:")) { - var17 = 9; - var3 = var3.substring("glow1:".length()); - } else if (var14.startsWith("glow2:")) { - var17 = 10; - var3 = var3.substring("glow2:".length()); - } else if (var14.startsWith("glow3:")) { - var17 = 11; - var3 = var3.substring("glow3:".length()); - } else if (WorldMapLabelSize.clientLanguage != Language.Language_EN) { - if (var14.startsWith("yellow:")) { - var17 = 0; - var3 = var3.substring("yellow:".length()); - } else if (var14.startsWith("red:")) { - var17 = 1; - var3 = var3.substring("red:".length()); - } else if (var14.startsWith("green:")) { - var17 = 2; - var3 = var3.substring("green:".length()); - } else if (var14.startsWith("cyan:")) { - var17 = 3; - var3 = var3.substring("cyan:".length()); - } else if (var14.startsWith("purple:")) { - var17 = 4; - var3 = var3.substring("purple:".length()); - } else if (var14.startsWith("white:")) { - var17 = 5; - var3 = var3.substring("white:".length()); - } else if (var14.startsWith("flash1:")) { - var17 = 6; - var3 = var3.substring("flash1:".length()); - } else if (var14.startsWith("flash2:")) { - var17 = 7; - var3 = var3.substring("flash2:".length()); - } else if (var14.startsWith("flash3:")) { - var17 = 8; - var3 = var3.substring("flash3:".length()); - } else if (var14.startsWith("glow1:")) { - var17 = 9; - var3 = var3.substring("glow1:".length()); - } else if (var14.startsWith("glow2:")) { - var17 = 10; - var3 = var3.substring("glow2:".length()); - } else if (var14.startsWith("glow3:")) { - var17 = 11; - var3 = var3.substring("glow3:".length()); - } - } - - var14 = var3.toLowerCase(); - byte var7 = 0; - if (var14.startsWith("wave:")) { - var7 = 1; - var3 = var3.substring("wave:".length()); - } else if (var14.startsWith("wave2:")) { - var7 = 2; - var3 = var3.substring("wave2:".length()); - } else if (var14.startsWith("shake:")) { - var7 = 3; - var3 = var3.substring("shake:".length()); - } else if (var14.startsWith("scroll:")) { - var7 = 4; - var3 = var3.substring("scroll:".length()); - } else if (var14.startsWith("slide:")) { - var7 = 5; - var3 = var3.substring("slide:".length()); - } else if (Language.Language_EN != WorldMapLabelSize.clientLanguage) { - if (var14.startsWith("wave:")) { - var7 = 1; - var3 = var3.substring("wave:".length()); - } else if (var14.startsWith("wave2:")) { - var7 = 2; - var3 = var3.substring("wave2:".length()); - } else if (var14.startsWith("shake:")) { - var7 = 3; - var3 = var3.substring("shake:".length()); - } else if (var14.startsWith("scroll:")) { - var7 = 4; - var3 = var3.substring("scroll:".length()); - } else if (var14.startsWith("slide:")) { - var7 = 5; - var3 = var3.substring("slide:".length()); - } - } - - PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2216, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeByte(0); - int var9 = var8.packetBuffer.offset; - var8.packetBuffer.writeByte(var4); - var8.packetBuffer.writeByte(var17); - var8.packetBuffer.writeByte(var7); - ArchiveDisk.method5796(var8.packetBuffer, var3); - var8.packetBuffer.writeLengthByte(var8.packetBuffer.offset - var9); - Client.packetWriter.addNode(var8); - return 1; - } else if (var0 == ScriptOpcodes.CHAT_SENDPRIVATE) { - Interpreter.Interpreter_stringStackSize -= 2; - var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; - String var12 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - PacketBufferNode var11 = InterfaceParent.getPacketBufferNode(ClientPacket.field2193, Client.packetWriter.isaacCipher); - var11.packetBuffer.writeShort(0); - int var13 = var11.packetBuffer.offset; - var11.packetBuffer.writeStringCp1252NullTerminated(var3); - ArchiveDisk.method5796(var11.packetBuffer, var12); - var11.packetBuffer.writeLengthShort(var11.packetBuffer.offset - var13); - Client.packetWriter.addNode(var11); - return 1; - } else if (var0 != ScriptOpcodes.CHAT_PLAYERNAME) { - if (var0 == ScriptOpcodes.CHAT_GETFILTER_TRADE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.tradeChatMode; - return 1; - } else if (var0 == ScriptOpcodes.CHAT_GETHISTORYLENGTH) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Projectile.Messages_getHistorySize(var10); - return 1; - } else if (var0 == ScriptOpcodes.CHAT_GETNEXTUID) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class13.Messages_getNextChatID(var10); - return 1; - } else if (var0 == ScriptOpcodes.CHAT_GETPREVUID) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Clock.Messages_getLastChatID(var10); - return 1; - } else if (var0 == ScriptOpcodes.DOCHEAT) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - WorldMapSection0.doCheat(var3); - return 1; - } else if (var0 == ScriptOpcodes.CHAT_SETMESSAGEFILTER) { - Client.field907 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize].toLowerCase().trim(); - return 1; - } else if (var0 == ScriptOpcodes.CHAT_GETMESSAGEFILTER) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Client.field907; - return 1; - } else if (var0 == 5023) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - System.out.println(var3); - return 1; - } else { - return 2; - } - } else { - if (class223.localPlayer != null && class223.localPlayer.username != null) { - var3 = class223.localPlayer.username.getName(); - } else { - var3 = ""; - } - - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3; - return 1; - } - } + return 2; } } + + @ObfuscatedName("iy") + @ObfuscatedSignature( + signature = "(IIB)V", + garbageValue = "15" + ) + @Export("resumePauseWidget") + static void resumePauseWidget(int var0, int var1) { + PacketBufferNode var2 = SoundSystem.getPacketBufferNode(ClientPacket.field2277, Client.packetWriter.isaacCipher); + var2.packetBuffer.method5643(var1); + var2.packetBuffer.writeIntME(var0); + Client.packetWriter.addNode(var2); + } } diff --git a/runescape-client/src/main/java/Timer.java b/runescape-client/src/main/java/Timer.java index 220435a3eb..4f61bf40de 100644 --- a/runescape-client/src/main/java/Timer.java +++ b/runescape-client/src/main/java/Timer.java @@ -4,188 +4,149 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jd") +@ObfuscatedName("jt") @Implements("Timer") public class Timer { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - longValue = 4462782034314037381L + longValue = -5009265909251557427L ) - long field3561; + long field3567; + @ObfuscatedName("t") + @ObfuscatedGetter( + longValue = 3656163850803388837L + ) + long field3569; @ObfuscatedName("n") - @ObfuscatedGetter( - longValue = 6292636731397039659L - ) - long field3562; - @ObfuscatedName("v") - public boolean field3563; - @ObfuscatedName("u") - @ObfuscatedGetter( - longValue = 514076061416709505L - ) - long field3564; - @ObfuscatedName("r") - @ObfuscatedGetter( - longValue = 7643347149191032091L - ) - long field3565; - @ObfuscatedName("p") - @ObfuscatedGetter( - longValue = 5130392401661119113L - ) - long field3566; + public boolean field3568; @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1178458711 + longValue = -5484170024319161763L ) - int field3567; - @ObfuscatedName("m") + long field3570; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1318775007 + longValue = -1992086956533447559L ) - int field3568; - @ObfuscatedName("y") + long field3571; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 808032681 + longValue = 5115114623583473447L ) - int field3569; + long field3572; + @ObfuscatedName("c") + @ObfuscatedGetter( + intValue = -1585759455 + ) + int field3573; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 1782421563 + ) + int field3574; @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 1068681997 + intValue = 303521947 ) - int field3570; + int field3575; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = 19440131 + ) + int field3576; public Timer() { - this.field3561 = -1L; - this.field3562 = -1L; - this.field3563 = false; - this.field3564 = 0L; - this.field3565 = 0L; - this.field3566 = 0L; - this.field3567 = 0; - this.field3568 = 0; - this.field3569 = 0; - this.field3570 = 0; + this.field3567 = -1L; + this.field3569 = -1L; + this.field3568 = false; + this.field3570 = 0L; + this.field3571 = 0L; + this.field3572 = 0L; + this.field3573 = 0; + this.field3574 = 0; + this.field3575 = 0; + this.field3576 = 0; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-20" + signature = "(I)V", + garbageValue = "-1653711688" ) - public void method4936() { - this.field3561 = class30.currentTimeMillis(); + public void method5115() { + this.field3567 = PlayerAppearance.currentTimeMillis(); + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "2049281372" + ) + public void method5123() { + if (this.field3567 != -1L) { + this.field3571 = PlayerAppearance.currentTimeMillis() - this.field3567; + this.field3567 = -1L; + } + } @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "1" - ) - public void method4937() { - if (-1L != this.field3561) { - this.field3565 = class30.currentTimeMillis() - this.field3561; - this.field3561 = -1L; - } - - } - - @ObfuscatedName("v") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-1928577406" + garbageValue = "-1105909109" ) - public void method4938(int var1) { - this.field3562 = class30.currentTimeMillis(); - this.field3567 = var1; - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1202204199" - ) - public void method4939() { - if (-1L != this.field3562) { - this.field3564 = class30.currentTimeMillis() - this.field3562; - this.field3562 = -1L; - } - - ++this.field3569; - this.field3563 = true; - } - - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-832320221" - ) - public void method4940() { - this.field3563 = false; - this.field3568 = 0; - } - - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1318451763" - ) - public void method4941() { - this.method4939(); + public void method5118(int var1) { + this.field3569 = PlayerAppearance.currentTimeMillis(); + this.field3573 = var1; } @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-1798294121" + signature = "(I)V", + garbageValue = "-1135526321" + ) + public void method5119() { + if (-1L != this.field3569) { + this.field3570 = PlayerAppearance.currentTimeMillis() - this.field3569; + this.field3569 = -1L; + } + + ++this.field3575; + this.field3568 = true; + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "179505930" + ) + public void method5120() { + this.field3568 = false; + this.field3574 = 0; + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-287296961" + ) + public void method5121() { + this.method5119(); + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(Lkc;I)V", + garbageValue = "-549220155" ) @Export("write") public void write(Buffer var1) { - long var2 = this.field3565; - var2 /= 10L; - if (var2 < 0L) { - var2 = 0L; - } else if (var2 > 65535L) { - var2 = 65535L; - } - - var1.writeShort((int)var2); - long var4 = this.field3564; - var4 /= 10L; - if (var4 < 0L) { - var4 = 0L; - } else if (var4 > 65535L) { - var4 = 65535L; - } - - var1.writeShort((int)var4); - long var6 = this.field3566; - var6 /= 10L; - if (var6 < 0L) { - var6 = 0L; - } else if (var6 > 65535L) { - var6 = 65535L; - } - - var1.writeShort((int)var6); - var1.writeShort(this.field3567); - var1.writeShort(this.field3568); - var1.writeShort(this.field3569); - var1.writeShort(this.field3570); - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(IB)I", - garbageValue = "7" - ) - public static int method4935(int var0) { - --var0; - var0 |= var0 >>> 1; - var0 |= var0 >>> 2; - var0 |= var0 >>> 4; - var0 |= var0 >>> 8; - var0 |= var0 >>> 16; - return var0 + 1; + WorldMapIcon_1.method354(var1, this.field3571); + WorldMapIcon_1.method354(var1, this.field3570); + WorldMapIcon_1.method354(var1, this.field3572); + var1.writeShort(this.field3573); + var1.writeShort(this.field3574); + var1.writeShort(this.field3575); + var1.writeShort(this.field3576); } } diff --git a/runescape-client/src/main/java/TriBool.java b/runescape-client/src/main/java/TriBool.java index 29e75a229e..1bb9ffee3d 100644 --- a/runescape-client/src/main/java/TriBool.java +++ b/runescape-client/src/main/java/TriBool.java @@ -1,26 +1,32 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jm") +@ObfuscatedName("js") @Implements("TriBool") public class TriBool { - @ObfuscatedName("z") + @ObfuscatedName("nq") + @ObfuscatedGetter( + intValue = -1976717039 + ) + static int field3600; + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("TriBool_unknown") public static final TriBool TriBool_unknown; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("TriBool_true") public static final TriBool TriBool_true; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Ljm;" + signature = "Ljs;" ) @Export("TriBool_false") public static final TriBool TriBool_false; @@ -33,4 +39,50 @@ public class TriBool { TriBool() { } + + @ObfuscatedName("jw") + @ObfuscatedSignature( + signature = "(Lhi;IIZI)V", + garbageValue = "-723705185" + ) + @Export("alignWidgetSize") + static void alignWidgetSize(Widget var0, int var1, int var2, boolean var3) { + int var4 = var0.width; + int var5 = var0.height; + if (var0.widthAlignment == 0) { + var0.width = var0.rawWidth; + } else if (var0.widthAlignment == 1) { + var0.width = var1 - var0.rawWidth; + } else if (var0.widthAlignment == 2) { + var0.width = var0.rawWidth * var1 >> 14; + } + + if (var0.heightAlignment == 0) { + var0.height = var0.rawHeight; + } else if (var0.heightAlignment == 1) { + var0.height = var2 - var0.rawHeight; + } else if (var0.heightAlignment == 2) { + var0.height = var2 * var0.rawHeight >> 14; + } + + if (var0.widthAlignment == 4) { + var0.width = var0.field2565 * var0.height / var0.field2566; + } + + if (var0.heightAlignment == 4) { + var0.height = var0.field2566 * var0.width / var0.field2565; + } + + if (var0.contentType == 1337) { + Client.viewportWidget = var0; + } + + if (var3 && var0.onResize != null && (var4 != var0.width || var5 != var0.height)) { + ScriptEvent var6 = new ScriptEvent(); + var6.widget = var0; + var6.args = var0.onResize; + Client.scriptEvents.addFirst(var6); + } + + } } diff --git a/runescape-client/src/main/java/UrlRequest.java b/runescape-client/src/main/java/UrlRequest.java index eb33fb2edd..4224bd5eca 100644 --- a/runescape-client/src/main/java/UrlRequest.java +++ b/runescape-client/src/main/java/UrlRequest.java @@ -1,32 +1,25 @@ import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("eh") +@ObfuscatedName("er") @Implements("UrlRequest") public class UrlRequest { - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = -535227307 - ) - @Export("PcmPlayer_sampleRate") - public static int PcmPlayer_sampleRate; - @ObfuscatedName("gq") + @ObfuscatedName("dw") @ObfuscatedSignature( - signature = "[Llf;" + signature = "Lij;" ) - @Export("crossSprites") - static Sprite[] crossSprites; - @ObfuscatedName("z") + @Export("archive13") + static Archive archive13; + @ObfuscatedName("a") @Export("url") final URL url; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("isDone0") volatile boolean isDone0; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("response0") volatile byte[] response0; @@ -34,298 +27,23 @@ public class UrlRequest { this.url = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "737522726" + garbageValue = "-340522486" ) @Export("isDone") public boolean isDone() { return this.isDone0; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)[B", - garbageValue = "-213988486" + garbageValue = "-14894560" ) @Export("getResponse") public byte[] getResponse() { return this.response0; } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "142413926" - ) - public static void method3269() { - synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock) { - if (ArchiveDiskActionHandler.field3127 != 0) { - ArchiveDiskActionHandler.field3127 = 1; - - try { - ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock.wait(); - } catch (InterruptedException var3) { - } - } - - } - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Lkf;II)V", - garbageValue = "-1347303356" - ) - @Export("readPlayerUpdate") - static void readPlayerUpdate(PacketBuffer var0, int var1) { - boolean var2 = var0.readBits(1) == 1; - if (var2) { - Players.Players_pendingUpdateIndices[++Players.Players_pendingUpdateCount - 1] = var1; - } - - int var3 = var0.readBits(2); - Player var4 = Client.players[var1]; - if (var3 == 0) { - if (var2) { - var4.field621 = false; - } else if (Client.localPlayerIndex == var1) { - throw new RuntimeException(); - } else { - Players.Players_regions[var1] = (var4.plane << 28) + (class223.baseX * 64 + var4.pathX[0] >> 13 << 14) + (class286.baseY * 64 + var4.pathY[0] >> 13); - if (var4.field957 != -1) { - Players.Players_orientations[var1] = var4.field957; - } else { - Players.Players_orientations[var1] = var4.orientation; - } - - Players.Players_targetIndices[var1] = var4.targetIndex; - Client.players[var1] = null; - if (var0.readBits(1) != 0) { - class290.updateExternalPlayer(var0, var1); - } - - } - } else { - int var5; - int var6; - int var7; - if (var3 == 1) { - var5 = var0.readBits(3); - var6 = var4.pathX[0]; - var7 = var4.pathY[0]; - if (var5 == 0) { - --var6; - --var7; - } else if (var5 == 1) { - --var7; - } else if (var5 == 2) { - ++var6; - --var7; - } else if (var5 == 3) { - --var6; - } else if (var5 == 4) { - ++var6; - } else if (var5 == 5) { - --var6; - ++var7; - } else if (var5 == 6) { - ++var7; - } else if (var5 == 7) { - ++var6; - ++var7; - } - - if (Client.localPlayerIndex != var1 || var4.x >= 1536 && var4.y >= 1536 && var4.x < 11776 && var4.y < 11776) { - if (var2) { - var4.field621 = true; - var4.tileX = var6; - var4.tileY = var7; - } else { - var4.field621 = false; - var4.method1274(var6, var7, Players.field1235[var1]); - } - } else { - var4.resetPath(var6, var7); - var4.field621 = false; - } - - } else if (var3 == 2) { - var5 = var0.readBits(4); - var6 = var4.pathX[0]; - var7 = var4.pathY[0]; - if (var5 == 0) { - var6 -= 2; - var7 -= 2; - } else if (var5 == 1) { - --var6; - var7 -= 2; - } else if (var5 == 2) { - var7 -= 2; - } else if (var5 == 3) { - ++var6; - var7 -= 2; - } else if (var5 == 4) { - var6 += 2; - var7 -= 2; - } else if (var5 == 5) { - var6 -= 2; - --var7; - } else if (var5 == 6) { - var6 += 2; - --var7; - } else if (var5 == 7) { - var6 -= 2; - } else if (var5 == 8) { - var6 += 2; - } else if (var5 == 9) { - var6 -= 2; - ++var7; - } else if (var5 == 10) { - var6 += 2; - ++var7; - } else if (var5 == 11) { - var6 -= 2; - var7 += 2; - } else if (var5 == 12) { - --var6; - var7 += 2; - } else if (var5 == 13) { - var7 += 2; - } else if (var5 == 14) { - ++var6; - var7 += 2; - } else if (var5 == 15) { - var6 += 2; - var7 += 2; - } - - if (Client.localPlayerIndex == var1 && (var4.x < 1536 || var4.y < 1536 || var4.x >= 11776 || var4.y >= 11776)) { - var4.resetPath(var6, var7); - var4.field621 = false; - } else if (var2) { - var4.field621 = true; - var4.tileX = var6; - var4.tileY = var7; - } else { - var4.field621 = false; - var4.method1274(var6, var7, Players.field1235[var1]); - } - - } else { - var5 = var0.readBits(1); - int var8; - int var9; - int var10; - int var11; - if (var5 == 0) { - var6 = var0.readBits(12); - var7 = var6 >> 10; - var8 = var6 >> 5 & 31; - if (var8 > 15) { - var8 -= 32; - } - - var9 = var6 & 31; - if (var9 > 15) { - var9 -= 32; - } - - var10 = var8 + var4.pathX[0]; - var11 = var9 + var4.pathY[0]; - if (Client.localPlayerIndex == var1 && (var4.x < 1536 || var4.y < 1536 || var4.x >= 11776 || var4.y >= 11776)) { - var4.resetPath(var10, var11); - var4.field621 = false; - } else if (var2) { - var4.field621 = true; - var4.tileX = var10; - var4.tileY = var11; - } else { - var4.field621 = false; - var4.method1274(var10, var11, Players.field1235[var1]); - } - - var4.plane = (byte)(var7 + var4.plane & 3); - if (Client.localPlayerIndex == var1) { - WorldMapRectangle.plane = var4.plane; - } - - } else { - var6 = var0.readBits(30); - var7 = var6 >> 28; - var8 = var6 >> 14 & 16383; - var9 = var6 & 16383; - var10 = (class223.baseX * 64 + var8 + var4.pathX[0] & 16383) - class223.baseX * 64; - var11 = (class286.baseY * 64 + var9 + var4.pathY[0] & 16383) - class286.baseY * 64; - if (Client.localPlayerIndex != var1 || var4.x >= 1536 && var4.y >= 1536 && var4.x < 11776 && var4.y < 11776) { - if (var2) { - var4.field621 = true; - var4.tileX = var10; - var4.tileY = var11; - } else { - var4.field621 = false; - var4.method1274(var10, var11, Players.field1235[var1]); - } - } else { - var4.resetPath(var10, var11); - var4.field621 = false; - } - - var4.plane = (byte)(var7 + var4.plane & 3); - if (Client.localPlayerIndex == var1) { - WorldMapRectangle.plane = var4.plane; - } - - } - } - } - } - - @ObfuscatedName("gy") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "1" - ) - static void method3279() { - if (Client.combatTargetPlayerIndex >= 0 && Client.players[Client.combatTargetPlayerIndex] != null) { - Players.addPlayerToScene(Client.players[Client.combatTargetPlayerIndex], false); - } - - } - - @ObfuscatedName("iv") - @ObfuscatedSignature( - signature = "(Lho;Lit;IIZI)V", - garbageValue = "-1977494158" - ) - @Export("addWidgetItemMenuItem") - static final void addWidgetItemMenuItem(Widget var0, ItemDefinition var1, int var2, int var3, boolean var4) { - String[] var5 = var1.inventoryActions; - byte var6 = -1; - String var7 = null; - if (var5 != null && var5[var3] != null) { - if (var3 == 0) { - var6 = 33; - } else if (var3 == 1) { - var6 = 34; - } else if (var3 == 2) { - var6 = 35; - } else if (var3 == 3) { - var6 = 36; - } else { - var6 = 37; - } - - var7 = var5[var3]; - } else if (var3 == 4) { - var6 = 37; - var7 = "Drop"; - } - - if (var6 != -1 && var7 != null) { - AttackOption.insertMenuItem(var7, World.colorStartTag(16748608) + var1.name, var6, var1.id, var2, var0.id, var4); - } - - } } diff --git a/runescape-client/src/main/java/UrlRequester.java b/runescape-client/src/main/java/UrlRequester.java index f40f015d16..f260db0196 100644 --- a/runescape-client/src/main/java/UrlRequester.java +++ b/runescape-client/src/main/java/UrlRequester.java @@ -11,25 +11,25 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("en") +@ObfuscatedName("ev") @Implements("UrlRequester") public class UrlRequester implements Runnable { - @ObfuscatedName("u") - @Export("Interpreter_stringLocals") - static String[] Interpreter_stringLocals; - @ObfuscatedName("kx") + @ObfuscatedName("gn") + @Export("regionLandArchives") + static byte[][] regionLandArchives; + @ObfuscatedName("hb") @ObfuscatedGetter( - intValue = 1912035221 + intValue = -65542583 ) - @Export("menuX") - static int menuX; - @ObfuscatedName("z") + @Export("cameraX") + static int cameraX; + @ObfuscatedName("a") @Export("thread") final Thread thread; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("isClosed") volatile boolean isClosed; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("requests") Queue requests; @@ -40,10 +40,10 @@ public class UrlRequester implements Runnable { this.thread.start(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/net/URL;I)Leh;", - garbageValue = "1658949504" + signature = "(Ljava/net/URL;I)Ler;", + garbageValue = "575867579" ) @Export("request") public UrlRequest request(URL var1) { @@ -55,10 +55,10 @@ public class UrlRequester implements Runnable { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1861698120" + garbageValue = "-1752528799" ) @Export("close") public void close() { @@ -121,18 +121,349 @@ public class UrlRequester implements Runnable { } } catch (Exception var17) { - class32.RunException_sendStackTrace((String)null, var17); + User.RunException_sendStackTrace((String)null, var17); } } } - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(CI)C", - garbageValue = "1748894504" + signature = "(ZB)V", + garbageValue = "70" ) - static char method3260(char var0) { - return var0 != 181 && var0 != 402 ? Character.toTitleCase(var0) : var0; + public static void method3428(boolean var0) { + if (NetCache.NetCache_socket != null) { + try { + Buffer var1 = new Buffer(4); + var1.writeByte(var0 ? 2 : 3); + var1.writeMedium(0); + NetCache.NetCache_socket.write(var1.array, 0, 4); + } catch (IOException var4) { + try { + NetCache.NetCache_socket.close(); + } catch (Exception var3) { + } + + ++NetCache.NetCache_ioExceptions; + NetCache.NetCache_socket = null; + } + + } + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "693068962" + ) + @Export("changeWorldSelectSorting") + static void changeWorldSelectSorting(int var0, int var1) { + int[] var2 = new int[4]; + int[] var3 = new int[4]; + var2[0] = var0; + var3[0] = var1; + int var4 = 1; + + for (int var5 = 0; var5 < 4; ++var5) { + if (World.World_sortOption1[var5] != var0) { + var2[var4] = World.World_sortOption1[var5]; + var3[var4] = World.World_sortOption2[var5]; + ++var4; + } + } + + World.World_sortOption1 = var2; + World.World_sortOption2 = var3; + class2.sortWorlds(Username.World_worlds, 0, Username.World_worlds.length - 1, World.World_sortOption1, World.World_sortOption2); + } + + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "(Lks;Lks;I)V", + garbageValue = "149989197" + ) + static void method3430(Font var0, Font var1) { + int var4; + int var5; + if (GrandExchangeEvent.worldSelectBackSprites == null) { + Archive var3 = GrandExchangeOfferUnitPriceComparator.archive8; + var4 = var3.getGroupId("sl_back"); + var5 = var3.getFileId(var4, ""); + Sprite[] var2 = class83.SpriteBuffer_getSpriteArray(var3, var4, var5); + GrandExchangeEvent.worldSelectBackSprites = var2; + } + + if (JagexCache.worldSelectFlagSprites == null) { + JagexCache.worldSelectFlagSprites = PlayerAppearance.method4160(GrandExchangeOfferUnitPriceComparator.archive8, "sl_flags", ""); + } + + if (StudioGame.worldSelectArrows == null) { + StudioGame.worldSelectArrows = PlayerAppearance.method4160(GrandExchangeOfferUnitPriceComparator.archive8, "sl_arrows", ""); + } + + if (Interpreter.worldSelectStars == null) { + Interpreter.worldSelectStars = PlayerAppearance.method4160(GrandExchangeOfferUnitPriceComparator.archive8, "sl_stars", ""); + } + + if (class288.worldSelectLeftSprite == null) { + class288.worldSelectLeftSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(GrandExchangeOfferUnitPriceComparator.archive8, "leftarrow", ""); + } + + if (WorldMapSection2.worldSelectRightSprite == null) { + WorldMapSection2.worldSelectRightSprite = ClientPacket.SpriteBuffer_getIndexedSpriteByName(GrandExchangeOfferUnitPriceComparator.archive8, "rightarrow", ""); + } + + Rasterizer2D.Rasterizer2D_fillRectangle(Login.xPadding, 23, 765, 480, 0); + Rasterizer2D.Rasterizer2D_fillRectangleGradient(Login.xPadding, 0, 125, 23, 12425273, 9135624); + Rasterizer2D.Rasterizer2D_fillRectangleGradient(Login.xPadding + 125, 0, 640, 23, 5197647, 2697513); + var0.drawCentered("Select a world", Login.xPadding + 62, 15, 0, -1); + if (Interpreter.worldSelectStars != null) { + Interpreter.worldSelectStars[1].drawAt(Login.xPadding + 140, 1); + var1.draw("Members only world", Login.xPadding + 152, 10, 16777215, -1); + Interpreter.worldSelectStars[0].drawAt(Login.xPadding + 140, 12); + var1.draw("Free world", Login.xPadding + 152, 21, 16777215, -1); + } + + if (StudioGame.worldSelectArrows != null) { + int var22 = Login.xPadding + 280; + if (World.World_sortOption1[0] == 0 && World.World_sortOption2[0] == 0) { + StudioGame.worldSelectArrows[2].drawAt(var22, 4); + } else { + StudioGame.worldSelectArrows[0].drawAt(var22, 4); + } + + if (World.World_sortOption1[0] == 0 && World.World_sortOption2[0] == 1) { + StudioGame.worldSelectArrows[3].drawAt(var22 + 15, 4); + } else { + StudioGame.worldSelectArrows[1].drawAt(var22 + 15, 4); + } + + var0.draw("World", var22 + 32, 17, 16777215, -1); + int var23 = Login.xPadding + 390; + if (World.World_sortOption1[0] == 1 && World.World_sortOption2[0] == 0) { + StudioGame.worldSelectArrows[2].drawAt(var23, 4); + } else { + StudioGame.worldSelectArrows[0].drawAt(var23, 4); + } + + if (World.World_sortOption1[0] == 1 && World.World_sortOption2[0] == 1) { + StudioGame.worldSelectArrows[3].drawAt(var23 + 15, 4); + } else { + StudioGame.worldSelectArrows[1].drawAt(var23 + 15, 4); + } + + var0.draw("Players", var23 + 32, 17, 16777215, -1); + var4 = Login.xPadding + 500; + if (World.World_sortOption1[0] == 2 && World.World_sortOption2[0] == 0) { + StudioGame.worldSelectArrows[2].drawAt(var4, 4); + } else { + StudioGame.worldSelectArrows[0].drawAt(var4, 4); + } + + if (World.World_sortOption1[0] == 2 && World.World_sortOption2[0] == 1) { + StudioGame.worldSelectArrows[3].drawAt(var4 + 15, 4); + } else { + StudioGame.worldSelectArrows[1].drawAt(var4 + 15, 4); + } + + var0.draw("Location", var4 + 32, 17, 16777215, -1); + var5 = Login.xPadding + 610; + if (World.World_sortOption1[0] == 3 && World.World_sortOption2[0] == 0) { + StudioGame.worldSelectArrows[2].drawAt(var5, 4); + } else { + StudioGame.worldSelectArrows[0].drawAt(var5, 4); + } + + if (World.World_sortOption1[0] == 3 && World.World_sortOption2[0] == 1) { + StudioGame.worldSelectArrows[3].drawAt(var5 + 15, 4); + } else { + StudioGame.worldSelectArrows[1].drawAt(var5 + 15, 4); + } + + var0.draw("Type", var5 + 32, 17, 16777215, -1); + } + + Rasterizer2D.Rasterizer2D_fillRectangle(Login.xPadding + 708, 4, 50, 16, 0); + var1.drawCentered("Cancel", Login.xPadding + 708 + 25, 16, 16777215, -1); + Login.hoveredWorldIndex = -1; + if (GrandExchangeEvent.worldSelectBackSprites != null) { + byte var26 = 88; + byte var27 = 19; + var4 = 765 / (var26 + 1) - 1; + var5 = 480 / (var27 + 1); + + int var6; + int var7; + do { + var6 = var5; + var7 = var4; + if (var5 * (var4 - 1) >= World.World_count) { + --var4; + } + + if (var4 * (var5 - 1) >= World.World_count) { + --var5; + } + + if (var4 * (var5 - 1) >= World.World_count) { + --var5; + } + } while(var5 != var6 || var4 != var7); + + var6 = (765 - var26 * var4) / (var4 + 1); + if (var6 > 5) { + var6 = 5; + } + + var7 = (480 - var5 * var27) / (var5 + 1); + if (var7 > 5) { + var7 = 5; + } + + int var8 = (765 - var26 * var4 - var6 * (var4 - 1)) / 2; + int var9 = (480 - var5 * var27 - var7 * (var5 - 1)) / 2; + int var10 = (var5 + World.World_count - 1) / var5; + Login.worldSelectPagesCount = var10 - var4; + if (class288.worldSelectLeftSprite != null && Login.worldSelectPage > 0) { + class288.worldSelectLeftSprite.drawAt(8, FloorUnderlayDefinition.canvasHeight / 2 - class288.worldSelectLeftSprite.subHeight / 2); + } + + if (WorldMapSection2.worldSelectRightSprite != null && Login.worldSelectPage < Login.worldSelectPagesCount) { + WorldMapSection2.worldSelectRightSprite.drawAt(class286.canvasWidth - WorldMapSection2.worldSelectRightSprite.subWidth - 8, FloorUnderlayDefinition.canvasHeight / 2 - WorldMapSection2.worldSelectRightSprite.subHeight / 2); + } + + int var11 = var9 + 23; + int var12 = var8 + Login.xPadding; + int var13 = 0; + boolean var14 = false; + int var15 = Login.worldSelectPage; + + int var16; + for (var16 = var5 * var15; var16 < World.World_count && var15 - Login.worldSelectPage < var4; ++var16) { + World var24 = Username.World_worlds[var16]; + boolean var18 = true; + String var19 = Integer.toString(var24.population); + if (var24.population == -1) { + var19 = "OFF"; + var18 = false; + } else if (var24.population > 1980) { + var19 = "FULL"; + var18 = false; + } + + int var21 = 0; + byte var20; + if (var24.isBeta()) { + if (var24.isMembersOnly()) { + var20 = 7; + } else { + var20 = 6; + } + } else if (var24.isDeadman()) { + var21 = 16711680; + if (var24.isMembersOnly()) { + var20 = 5; + } else { + var20 = 4; + } + } else if (var24.method1887()) { + var20 = 8; + } else if (var24.isPvp()) { + if (var24.isMembersOnly()) { + var20 = 3; + } else { + var20 = 2; + } + } else if (var24.isMembersOnly()) { + var20 = 1; + } else { + var20 = 0; + } + + if (MouseHandler.MouseHandler_x >= var12 && MouseHandler.MouseHandler_y >= var11 && MouseHandler.MouseHandler_x < var12 + var26 && MouseHandler.MouseHandler_y < var27 + var11 && var18) { + Login.hoveredWorldIndex = var16; + GrandExchangeEvent.worldSelectBackSprites[var20].drawTransOverlayAt(var12, var11, 128, 16777215); + var14 = true; + } else { + GrandExchangeEvent.worldSelectBackSprites[var20].drawAt(var12, var11); + } + + if (JagexCache.worldSelectFlagSprites != null) { + JagexCache.worldSelectFlagSprites[(var24.isMembersOnly() ? 8 : 0) + var24.location].drawAt(var12 + 29, var11); + } + + var0.drawCentered(Integer.toString(var24.id), var12 + 15, var27 / 2 + var11 + 5, var21, -1); + var1.drawCentered(var19, var12 + 60, var27 / 2 + var11 + 5, 268435455, -1); + var11 = var11 + var7 + var27; + ++var13; + if (var13 >= var5) { + var11 = var9 + 23; + var12 = var12 + var6 + var26; + var13 = 0; + ++var15; + } + } + + if (var14) { + var16 = var1.stringWidth(Username.World_worlds[Login.hoveredWorldIndex].activity) + 6; + int var17 = var1.ascent + 8; + int var25 = MouseHandler.MouseHandler_y + 25; + if (var25 + var17 > 480) { + var25 = MouseHandler.MouseHandler_y - 25 - var17; + } + + Rasterizer2D.Rasterizer2D_fillRectangle(MouseHandler.MouseHandler_x - var16 / 2, var25, var16, var17, 16777120); + Rasterizer2D.Rasterizer2D_drawRectangle(MouseHandler.MouseHandler_x - var16 / 2, var25, var16, var17, 0); + var1.drawCentered(Username.World_worlds[Login.hoveredWorldIndex].activity, MouseHandler.MouseHandler_x, var25 + var1.ascent + 4, 0, -1); + } + } + + AbstractWorldMapData.rasterProvider.drawFull(0, 0); + } + + @ObfuscatedName("jd") + @ObfuscatedSignature( + signature = "(IIIIIII)V", + garbageValue = "710444841" + ) + static final void method3431(int var0, int var1, int var2, int var3, int var4, int var5) { + int var6 = var2 - var0; + int var7 = var3 - var1; + int var8 = var6 >= 0 ? var6 : -var6; + int var9 = var7 >= 0 ? var7 : -var7; + int var10 = var8; + if (var8 < var9) { + var10 = var9; + } + + if (var10 != 0) { + int var11 = (var6 << 16) / var10; + int var12 = (var7 << 16) / var10; + if (var12 <= var11) { + var11 = -var11; + } else { + var12 = -var12; + } + + int var13 = var5 * var12 >> 17; + int var14 = var5 * var12 + 1 >> 17; + int var15 = var5 * var11 >> 17; + int var16 = var5 * var11 + 1 >> 17; + var0 -= Rasterizer2D.Rasterizer2D_xClipStart; + var1 -= Rasterizer2D.Rasterizer2D_yClipStart; + int var17 = var0 + var13; + int var18 = var0 - var14; + int var19 = var0 + var6 - var14; + int var20 = var0 + var6 + var13; + int var21 = var15 + var1; + int var22 = var1 - var16; + int var23 = var7 + var1 - var16; + int var24 = var15 + var7 + var1; + Rasterizer3D.method3125(var17, var18, var19); + Rasterizer3D.method3134(var21, var22, var23, var17, var18, var19, var4); + Rasterizer3D.method3125(var17, var19, var20); + Rasterizer3D.method3134(var21, var23, var24, var17, var19, var20, var4); + } } } diff --git a/runescape-client/src/main/java/User.java b/runescape-client/src/main/java/User.java index 93562da35c..322bc173bf 100644 --- a/runescape-client/src/main/java/User.java +++ b/runescape-client/src/main/java/User.java @@ -1,20 +1,26 @@ +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; +import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jh") +@ObfuscatedName("jg") @Implements("User") public class User implements Comparable { - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Ljq;" + signature = "Lju;" ) @Export("username") Username username; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Ljq;" + signature = "Lju;" ) @Export("previousUsername") Username previousUsername; @@ -22,40 +28,40 @@ public class User implements Comparable { User() { } - @ObfuscatedName("s") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "(I)Ljq;", - garbageValue = "827230801" + signature = "(B)Lju;", + garbageValue = "-69" ) @Export("getUsername") public Username getUsername() { return this.username; } - @ObfuscatedName("f") + @ObfuscatedName("ad") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "-835299696" + garbageValue = "2090791766" ) @Export("getName") public String getName() { return this.username == null ? "" : this.username.getName(); } - @ObfuscatedName("j") + @ObfuscatedName("ag") @ObfuscatedSignature( signature = "(B)Ljava/lang/String;", - garbageValue = "116" + garbageValue = "2" ) @Export("getPreviousName") public String getPreviousName() { return this.previousUsername == null ? "" : this.previousUsername.getName(); } - @ObfuscatedName("d") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(Ljq;Ljq;I)V", - garbageValue = "-1357976341" + signature = "(Lju;Lju;I)V", + garbageValue = "-1125908358" ) @Export("set") void set(Username var1, Username var2) { @@ -67,10 +73,10 @@ public class User implements Comparable { } } - @ObfuscatedName("l") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(Ljh;I)I", - garbageValue = "-531306911" + signature = "(Ljg;I)I", + garbageValue = "105019827" ) @Export("compareTo_user") public int compareTo_user(User var1) { @@ -80,4 +86,94 @@ public class User implements Comparable { public int compareTo(Object var1) { return this.compareTo_user((User)var1); } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;Ljava/lang/Throwable;I)V", + garbageValue = "711675432" + ) + @Export("RunException_sendStackTrace") + public static void RunException_sendStackTrace(String var0, Throwable var1) { + if (var1 != null) { + var1.printStackTrace(); + } else { + try { + String var2 = ""; + if (var1 != null) { + Throwable var4 = var1; + String var5; + if (var1 instanceof RunException) { + RunException var6 = (RunException)var1; + var5 = var6.message + " | "; + var4 = var6.throwable; + } else { + var5 = ""; + } + + StringWriter var18 = new StringWriter(); + PrintWriter var7 = new PrintWriter(var18); + var4.printStackTrace(var7); + var7.close(); + String var8 = var18.toString(); + BufferedReader var9 = new BufferedReader(new StringReader(var8)); + String var10 = var9.readLine(); + + label63: + while (true) { + while (true) { + String var11 = var9.readLine(); + if (var11 == null) { + var5 = var5 + "| " + var10; + var2 = var5; + break label63; + } + + int var12 = var11.indexOf(40); + int var13 = var11.indexOf(41, var12 + 1); + if (var12 >= 0 && var13 >= 0) { + String var14 = var11.substring(var12 + 1, var13); + int var15 = var14.indexOf(".java:"); + if (var15 >= 0) { + var14 = var14.substring(0, var15) + var14.substring(var15 + 5); + var5 = var5 + var14 + ' '; + continue; + } + + var11 = var11.substring(0, var12); + } + + var11 = var11.trim(); + var11 = var11.substring(var11.lastIndexOf(32) + 1); + var11 = var11.substring(var11.lastIndexOf(9) + 1); + var5 = var5 + var11 + ' '; + } + } + } + + if (var0 != null) { + if (var1 != null) { + var2 = var2 + " | "; + } + + var2 = var2 + var0; + } + + System.out.println("Error: " + var2); + var2 = var2.replace(':', '.'); + var2 = var2.replace('@', '_'); + var2 = var2.replace('&', '_'); + var2 = var2.replace('#', '_'); + if (RunException.RunException_applet == null) { + return; + } + + URL var3 = new URL(RunException.RunException_applet.getCodeBase(), "clienterror.ws?c=" + RunException.RunException_revision + "&u=" + RunException.localPlayerName + "&v1=" + TaskHandler.javaVendor + "&v2=" + TaskHandler.javaVersion + "&ct=" + TileItem.clientType + "&e=" + var2); + DataInputStream var17 = new DataInputStream(var3.openStream()); + var17.read(); + var17.close(); + } catch (Exception var16) { + } + + } + } } diff --git a/runescape-client/src/main/java/UserComparator1.java b/runescape-client/src/main/java/UserComparator1.java index dc4600f3eb..0ef343d045 100644 --- a/runescape-client/src/main/java/UserComparator1.java +++ b/runescape-client/src/main/java/UserComparator1.java @@ -4,10 +4,10 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lw") +@ObfuscatedName("la") @Implements("UserComparator1") public class UserComparator1 implements Comparator { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -15,10 +15,10 @@ public class UserComparator1 implements Comparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljh;Ljh;I)I", - garbageValue = "-67354255" + signature = "(Ljg;Ljg;B)I", + garbageValue = "30" ) @Export("compare_bridged") int compare_bridged(User var1, User var2) { @@ -32,13 +32,4 @@ public class UserComparator1 implements Comparator { public boolean equals(Object var1) { return super.equals(var1); } - - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "456557125" - ) - public static void method5847() { - PlayerAppearance.PlayerAppearance_cachedModels.clear(); - } } diff --git a/runescape-client/src/main/java/UserComparator10.java b/runescape-client/src/main/java/UserComparator10.java index 5cedec1a03..106d77c9aa 100644 --- a/runescape-client/src/main/java/UserComparator10.java +++ b/runescape-client/src/main/java/UserComparator10.java @@ -1,20 +1,14 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("et") +@ObfuscatedName("ej") @Implements("UserComparator10") public class UserComparator10 extends AbstractUserComparator { - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = 406517207 - ) - static int field1956; - @ObfuscatedName("o") - static boolean field1957; - @ObfuscatedName("z") + @ObfuscatedName("i") + static int[][] field1964; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -22,10 +16,10 @@ public class UserComparator10 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-1576408369" + signature = "(Ljx;Ljx;I)I", + garbageValue = "251102733" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -40,25 +34,39 @@ public class UserComparator10 extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)Lia;", - garbageValue = "12340961" + signature = "(Lkc;Llr;B)Llr;", + garbageValue = "0" ) - @Export("getEnum") - public static EnumDefinition getEnum(int var0) { - EnumDefinition var1 = (EnumDefinition)EnumDefinition.EnumDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; - } else { - byte[] var2 = EnumDefinition.EnumDefinition_archive.takeFile(8, var0); - var1 = new EnumDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); + @Export("readStringIntParameters") + static final IterableNodeHashTable readStringIntParameters(Buffer var0, IterableNodeHashTable var1) { + int var2 = var0.readUnsignedByte(); + int var3; + if (var1 == null) { + int var4 = var2 - 1; + var4 |= var4 >>> 1; + var4 |= var4 >>> 2; + var4 |= var4 >>> 4; + var4 |= var4 >>> 8; + var4 |= var4 >>> 16; + var3 = var4 + 1; + var1 = new IterableNodeHashTable(var3); + } + + for (var3 = 0; var3 < var2; ++var3) { + boolean var7 = var0.readUnsignedByte() == 1; + int var5 = var0.readMedium(); + Object var6; + if (var7) { + var6 = new ObjectNode(var0.readStringCp1252NullTerminated()); + } else { + var6 = new IntegerNode(var0.readInt()); } - EnumDefinition.EnumDefinition_cached.put(var1, (long)var0); - return var1; + var1.put((Node)var6, (long)var5); } + + return var1; } } diff --git a/runescape-client/src/main/java/UserComparator2.java b/runescape-client/src/main/java/UserComparator2.java index 6c6e24e3a7..633b552095 100644 --- a/runescape-client/src/main/java/UserComparator2.java +++ b/runescape-client/src/main/java/UserComparator2.java @@ -4,10 +4,10 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ld") +@ObfuscatedName("lq") @Implements("UserComparator2") public class UserComparator2 implements Comparator { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -15,21 +15,21 @@ public class UserComparator2 implements Comparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljh;Ljh;I)I", - garbageValue = "1965280999" + signature = "(Ljg;Ljg;B)I", + garbageValue = "34" ) @Export("compare_bridged") int compare_bridged(User var1, User var2) { return this.reversed ? var1.getUsername().compareToTyped(var2.getUsername()) : var2.getUsername().compareToTyped(var1.getUsername()); } - public boolean equals(Object var1) { - return super.equals(var1); - } - public int compare(Object var1, Object var2) { return this.compare_bridged((User)var1, (User)var2); } + + public boolean equals(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 8c794337f2..06abbea3e1 100644 --- a/runescape-client/src/main/java/UserComparator3.java +++ b/runescape-client/src/main/java/UserComparator3.java @@ -1,18 +1,15 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("fe") @Implements("UserComparator3") public class UserComparator3 extends AbstractUserComparator { - @ObfuscatedName("b") - @ObfuscatedGetter( - intValue = -2030399033 - ) - static int field1971; - @ObfuscatedName("z") + @ObfuscatedName("gf") + @Export("regionMapArchives") + static byte[][] regionMapArchives; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -20,10 +17,10 @@ public class UserComparator3 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-1163251881" + signature = "(Ljx;Ljx;B)I", + garbageValue = "8" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -38,78 +35,50 @@ public class UserComparator3 extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("r") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;I)[B", - garbageValue = "-772174627" + signature = "(III)I", + garbageValue = "-673755666" ) - public static byte[] method3394(CharSequence var0) { - int var1 = var0.length(); - byte[] var2 = new byte[var1]; - - for (int var3 = 0; var3 < var1; ++var3) { - char var4 = var0.charAt(var3); - if (var4 > 0 && var4 < 128 || var4 >= 160 && var4 <= 255) { - var2[var3] = (byte)var4; - } else if (var4 == 8364) { - var2[var3] = -128; - } else if (var4 == 8218) { - var2[var3] = -126; - } else if (var4 == 402) { - var2[var3] = -125; - } else if (var4 == 8222) { - var2[var3] = -124; - } else if (var4 == 8230) { - var2[var3] = -123; - } else if (var4 == 8224) { - var2[var3] = -122; - } else if (var4 == 8225) { - var2[var3] = -121; - } else if (var4 == 710) { - var2[var3] = -120; - } else if (var4 == 8240) { - var2[var3] = -119; - } else if (var4 == 352) { - var2[var3] = -118; - } else if (var4 == 8249) { - var2[var3] = -117; - } else if (var4 == 338) { - var2[var3] = -116; - } else if (var4 == 381) { - var2[var3] = -114; - } else if (var4 == 8216) { - var2[var3] = -111; - } else if (var4 == 8217) { - var2[var3] = -110; - } else if (var4 == 8220) { - var2[var3] = -109; - } else if (var4 == 8221) { - var2[var3] = -108; - } else if (var4 == 8226) { - var2[var3] = -107; - } else if (var4 == 8211) { - var2[var3] = -106; - } else if (var4 == 8212) { - var2[var3] = -105; - } else if (var4 == 732) { - var2[var3] = -104; - } else if (var4 == 8482) { - var2[var3] = -103; - } else if (var4 == 353) { - var2[var3] = -102; - } else if (var4 == 8250) { - var2[var3] = -101; - } else if (var4 == 339) { - var2[var3] = -100; - } else if (var4 == 382) { - var2[var3] = -98; - } else if (var4 == 376) { - var2[var3] = -97; - } else { - var2[var3] = 63; - } + public static int method3565(int var0, int var1) { + int var2; + for (var2 = 0; var1 > 0; --var1) { + var2 = var2 << 1 | var0 & 1; + var0 >>>= 1; } return var2; } + + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "(ZB)V", + garbageValue = "-86" + ) + @Export("Login_promptCredentials") + static void Login_promptCredentials(boolean var0) { + Login.Login_response1 = ""; + Login.Login_response2 = "Enter your username/email & password."; + Login.Login_response3 = ""; + Login.loginIndex = 2; + if (var0) { + Login.Login_password = ""; + } + + if (Login.Login_username == null || Login.Login_username.length() <= 0) { + if (ScriptEvent.clientPreferences.rememberedUsername != null) { + Login.Login_username = ScriptEvent.clientPreferences.rememberedUsername; + Client.Login_isUsernameRemembered = true; + } else { + Client.Login_isUsernameRemembered = false; + } + } + + if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { + Login.currentLoginField = 1; + } else { + Login.currentLoginField = 0; + } + + } } diff --git a/runescape-client/src/main/java/UserComparator4.java b/runescape-client/src/main/java/UserComparator4.java index b378fd8030..9609031010 100644 --- a/runescape-client/src/main/java/UserComparator4.java +++ b/runescape-client/src/main/java/UserComparator4.java @@ -4,12 +4,13 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ey") +@ObfuscatedName("ec") @Implements("UserComparator4") public class UserComparator4 implements Comparator { - @ObfuscatedName("t") - public static String[] field1948; - @ObfuscatedName("z") + @ObfuscatedName("sj") + @Export("foundItemIds") + static short[] foundItemIds; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -17,10 +18,10 @@ public class UserComparator4 implements Comparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-1358641411" + signature = "(Ljx;Ljx;I)I", + garbageValue = "1036024151" ) @Export("compare_bridged") int compare_bridged(Buddy var1, Buddy var2) { @@ -35,26 +36,22 @@ public class UserComparator4 implements Comparator { return super.equals(var1); } - @ObfuscatedName("z") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lhp;Ljava/lang/String;Ljava/lang/String;IZI)V", - garbageValue = "-1960498787" + signature = "(I)I", + garbageValue = "-616459830" ) - public static void method3349(AbstractArchive var0, String var1, String var2, int var3, boolean var4) { - int var5 = var0.getGroupId(var1); - int var6 = var0.getFileId(var5, var2); - class83.method2068(var0, var5, var6, var3, var4); + public static int method3502() { + return ++MouseHandler.MouseHandler_idleCycles - 1; } - @ObfuscatedName("ka") + @ObfuscatedName("fe") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2110753861" + signature = "(I)Llo;", + garbageValue = "1928339538" ) - static void method3350() { - if (Client.oculusOrbState == 1) { - Client.field879 = true; - } - + @Export("getWorldMap") + static WorldMap getWorldMap() { + return Login.worldMap; } } diff --git a/runescape-client/src/main/java/UserComparator5.java b/runescape-client/src/main/java/UserComparator5.java index 4ef2378f5e..077585d5d2 100644 --- a/runescape-client/src/main/java/UserComparator5.java +++ b/runescape-client/src/main/java/UserComparator5.java @@ -3,19 +3,10 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fb") +@ObfuscatedName("ft") @Implements("UserComparator5") public class UserComparator5 extends AbstractUserComparator { - @ObfuscatedName("r") - @Export("ArchiveDiskActionHandler_thread") - static Thread ArchiveDiskActionHandler_thread; - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "[[Lho;" - ) - @Export("Widget_interfaceComponents") - public static Widget[][] Widget_interfaceComponents; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -23,10 +14,10 @@ public class UserComparator5 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-1400201048" + signature = "(Ljx;Ljx;I)I", + garbageValue = "1570722017" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -45,42 +36,12 @@ public class UserComparator5 extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;Llb;I)Llb;", - garbageValue = "1757701513" + signature = "(IB)I", + garbageValue = "-67" ) - @Export("readStringIntParameters") - static final IterableNodeHashTable readStringIntParameters(Buffer var0, IterableNodeHashTable var1) { - int var2 = var0.readUnsignedByte(); - int var3; - if (var1 == null) { - var3 = Timer.method4935(var2); - var1 = new IterableNodeHashTable(var3); - } - - for (var3 = 0; var3 < var2; ++var3) { - boolean var4 = var0.readUnsignedByte() == 1; - int var5 = var0.readMedium(); - Object var6; - if (var4) { - var6 = new ObjectNode(var0.readStringCp1252NullTerminated()); - } else { - var6 = new IntegerNode(var0.readInt()); - } - - var1.put((Node)var6, (long)var5); - } - - return var1; - } - - @ObfuscatedName("af") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;B)I", - garbageValue = "103" - ) - public static int method3387(String var0) { - return var0.length() + 2; + public static int method3551(int var0) { + return var0 >> 11 & 63; } } diff --git a/runescape-client/src/main/java/UserComparator6.java b/runescape-client/src/main/java/UserComparator6.java index 06dd016bc4..6bb63577bd 100644 --- a/runescape-client/src/main/java/UserComparator6.java +++ b/runescape-client/src/main/java/UserComparator6.java @@ -2,12 +2,17 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("fy") +@ObfuscatedName("fi") @Implements("UserComparator6") public class UserComparator6 extends AbstractUserComparator { - @ObfuscatedName("z") + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "Lho;" + ) + @Export("NetCache_currentResponse") + public static NetFileRequest NetCache_currentResponse; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -15,10 +20,10 @@ public class UserComparator6 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-1158182029" + signature = "(Ljx;Ljx;B)I", + garbageValue = "67" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -33,557 +38,13 @@ public class UserComparator6 extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("v") + @ObfuscatedName("bx") @ObfuscatedSignature( - signature = "([BIII)Ljava/lang/String;", - garbageValue = "1774248129" + signature = "(Ljava/lang/String;I)I", + garbageValue = "-1069282044" ) - public static String method3408(byte[] var0, int var1, int var2) { - char[] var3 = new char[var2]; - int var4 = 0; - int var5 = var1; - - int var8; - for (int var6 = var2 + var1; var5 < var6; var3[var4++] = (char)var8) { - int var7 = var0[var5++] & 255; - if (var7 < 128) { - if (var7 == 0) { - var8 = 65533; - } else { - var8 = var7; - } - } else if (var7 < 192) { - var8 = 65533; - } else if (var7 < 224) { - if (var5 < var6 && (var0[var5] & 192) == 128) { - var8 = (var7 & 31) << 6 | var0[var5++] & 63; - if (var8 < 128) { - var8 = 65533; - } - } else { - var8 = 65533; - } - } else if (var7 < 240) { - if (var5 + 1 < var6 && (var0[var5] & 192) == 128 && (var0[var5 + 1] & 192) == 128) { - var8 = (var7 & 15) << 12 | (var0[var5++] & 63) << 6 | var0[var5++] & 63; - if (var8 < 2048) { - var8 = 65533; - } - } else { - var8 = 65533; - } - } else if (var7 < 248) { - if (var5 + 2 < var6 && (var0[var5] & 192) == 128 && (var0[var5 + 1] & 192) == 128 && (var0[var5 + 2] & 192) == 128) { - var8 = (var7 & 7) << 18 | (var0[var5++] & 63) << 12 | (var0[var5++] & 63) << 6 | var0[var5++] & 63; - if (var8 >= 65536 && var8 <= 1114111) { - var8 = 65533; - } else { - var8 = 65533; - } - } else { - var8 = 65533; - } - } else { - var8 = 65533; - } - } - - return new String(var3, 0, var4); - } - - @ObfuscatedName("a") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1182264787" - ) - static int method3407(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - if (var0 == ScriptOpcodes.CC_GETSCROLLX) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollX; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETSCROLLY) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollY; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETTEXT) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.text; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETSCROLLWIDTH) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollWidth; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETSCROLLHEIGHT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollHeight; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETMODELZOOM) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelZoom; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETMODELANGLE_X) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleX; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETMODELANGLE_Z) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleZ; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETMODELANGLE_Y) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleY; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETTRANSTOP) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyTop; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETTRANSBOT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyBot; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETCOLOUR) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETFILLCOLOUR) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color2; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETFILLMODE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.fillMode.rsOrdinal(); - return 1; - } else if (var0 == ScriptOpcodes.CC_GETMODELTRANSPARENT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelTransparency ? 1 : 0; - return 1; - } else { - return 2; - } - } - - @ObfuscatedName("j") - @ObfuscatedSignature( - signature = "(ILcu;ZB)I", - garbageValue = "126" - ) - static int method3411(int var0, Script var1, boolean var2) { - Widget var3; - if (var0 == ScriptOpcodes.IF_GETINVOBJECT) { - var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemId; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETINVCOUNT) { - var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - if (var3.itemId != -1) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemQuantity; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.IF_HASSUB) { - int var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - InterfaceParent var4 = (InterfaceParent)Client.interfaceParents.get((long)var5); - if (var4 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.IF_GETTOP) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.rootInterface; - return 1; - } else { - return 2; - } - } - - @ObfuscatedName("ae") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "600807723" - ) - static int method3402(int var0, Script var1, boolean var2) { - int var3; - if (var0 == 6600) { - var3 = WorldMapRectangle.plane; - int var9 = class223.baseX * 64 + (class223.localPlayer.x >> 7); - int var5 = class286.baseY * 64 + (class223.localPlayer.y >> 7); - Decimator.getWorldMap().method6272(var3, var9, var5, true); - return 1; - } else { - WorldMapArea var11; - if (var0 == ScriptOpcodes.WORLDMAP_GETMAPNAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - String var16 = ""; - var11 = Decimator.getWorldMap().getMapArea(var3); - if (var11 != null) { - var16 = var11.getExternalName(); - } - - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var16; - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_SETMAP) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Decimator.getWorldMap().setCurrentMapAreaId(var3); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETZOOM) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().getZoomLevel(); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_SETZOOM) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Decimator.getWorldMap().setZoomPercentage(var3); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_ISLOADED) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().isCacheLoaded() ? 1 : 0; - return 1; - } else { - Coord var15; - if (var0 == ScriptOpcodes.WORLDMAP_JUMPTODISPLAYCOORD) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - Decimator.getWorldMap().setWorldMapPositionTarget(var15.x, var15.y); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_JUMPTODISPLAYCOORD_INSTANT) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - Decimator.getWorldMap().setWorldMapPositionTargetInstant(var15.x, var15.y); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_JUMPTOSOURCECOORD) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - Decimator.getWorldMap().jumpToSourceCoord(var15.plane, var15.x, var15.y); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_JUMPTOSOURCECOORD_INSTANT) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - Decimator.getWorldMap().jumpToSourceCoordInstant(var15.plane, var15.x, var15.y); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISPLAYPOSITION) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().getDisplayX(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().getDisplayY(); - return 1; - } else { - WorldMapArea var13; - if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGORIGIN) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var13 = Decimator.getWorldMap().getMapArea(var3); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getOrigin().packed(); - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGSIZE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var13 = Decimator.getWorldMap().getMapArea(var3); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var13.getRegionHighX() - var13.getRegionLowX() + 1) * 64; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var13.getRegionHighY() - var13.getRegionLowY() + 1) * 64; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGBOUNDS) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var13 = Decimator.getWorldMap().getMapArea(var3); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionLowX() * 64; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionLowY() * 64; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionHighX() * 64 + 64 - 1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionHighY() * 64 + 64 - 1; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGZOOM) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var13 = Decimator.getWorldMap().getMapArea(var3); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getZoom(); - } - - return 1; - } else if (var0 == 6615) { - var15 = Decimator.getWorldMap().getDisplayCoord(); - if (var15 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.x; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.y; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETCURRENTMAP) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().currentMapAreaId(); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISPLAYCOORD) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - var13 = Decimator.getWorldMap().getCurrentMapArea(); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - return 1; - } else { - int[] var14 = var13.position(var15.plane, var15.x, var15.y); - if (var14 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14[0]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14[1]; - } - - return 1; - } - } else { - Coord var7; - if (var0 == 6618) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - var13 = Decimator.getWorldMap().getCurrentMapArea(); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - return 1; - } else { - var7 = var13.coord(var15.x, var15.y); - if (var7 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.packed(); - } - - return 1; - } - } else { - Coord var12; - if (var0 == 6619) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - WorldMapLabel.method439(var3, var12, false); - return 1; - } else if (var0 == 6620) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - WorldMapLabel.method439(var3, var12, true); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_COORDINMAP) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - var11 = Decimator.getWorldMap().getMapArea(var3); - if (var11 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.containsCoord(var12.plane, var12.x, var12.y) ? 1 : 0; - return 1; - } - } else if (var0 == ScriptOpcodes.WORLDMAP_GETSIZE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().getDisplayWith(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().getDisplayHeight(); - return 1; - } else if (var0 == 6623) { - var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - var13 = Decimator.getWorldMap().mapAreaAtCoord(var15.plane, var15.x, var15.y); - if (var13 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getId(); - } - - return 1; - } else if (var0 == 6624) { - Decimator.getWorldMap().setMaxFlashCount(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - return 1; - } else if (var0 == 6625) { - Decimator.getWorldMap().resetMaxFlashCount(); - return 1; - } else if (var0 == 6626) { - Decimator.getWorldMap().setCyclesPerFlash(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - return 1; - } else if (var0 == 6627) { - Decimator.getWorldMap().resetCyclesPerFlash(); - return 1; - } else { - boolean var10; - if (var0 == ScriptOpcodes.WORLDMAP_PERPETUALFLASH) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Decimator.getWorldMap().setPerpetualFlash(var10); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_FLASHELEMENT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Decimator.getWorldMap().flashElement(var3); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_FLASHELEMENTCATEGORY) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Decimator.getWorldMap().flashCategory(var3); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_STOPCURRENTFLASHES) { - Decimator.getWorldMap().stopCurrentFlashes(); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_DISABLEELEMENTS) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - Decimator.getWorldMap().setElementsDisabled(var10); - return 1; - } else { - boolean var4; - if (var0 == ScriptOpcodes.WORLDMAP_DISABLEELEMENT) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; - Decimator.getWorldMap().disableElement(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_DISABLEELEMENTCATEGORY) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; - Decimator.getWorldMap().setCategoryDisabled(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISABLEELEMENTS) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().getElementsDisabled() ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISABLEELEMENT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().isElementDisabled(var3) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISABLEELEMENTCATEGORY) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Decimator.getWorldMap().isCategoryDisabled(var3) ? 1 : 0; - return 1; - } else if (var0 == 6638) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); - var7 = Decimator.getWorldMap().method6316(var3, var12); - if (var7 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.packed(); - } - - return 1; - } else { - AbstractWorldMapIcon var8; - if (var0 == ScriptOpcodes.WORLDMAP_LISTELEMENT_START) { - var8 = Decimator.getWorldMap().iconStart(); - if (var8 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.getElement(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.coord2.packed(); - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_LISTELEMENT_NEXT) { - var8 = Decimator.getWorldMap().iconNext(); - if (var8 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.getElement(); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.coord2.packed(); - } - - return 1; - } else { - WorldMapElement var6; - if (var0 == ScriptOpcodes.MEC_TEXT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Decimator.WorldMapElement_get(var3); - if (var6.name == null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var6.name; - } - - return 1; - } else if (var0 == ScriptOpcodes.MEC_TEXTSIZE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Decimator.WorldMapElement_get(var3); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.textSize; - return 1; - } else if (var0 == ScriptOpcodes.MEC_CATEGORY) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Decimator.WorldMapElement_get(var3); - if (var6 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.category; - } - - return 1; - } else if (var0 == ScriptOpcodes.MEC_SPRITE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Decimator.WorldMapElement_get(var3); - if (var6 == null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.sprite1; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_ELEMENT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = EnumDefinition.worldMapEvent.mapElement; - return 1; - } else if (var0 == 6698) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = EnumDefinition.worldMapEvent.coord1.packed(); - return 1; - } else if (var0 == ScriptOpcodes.WORLDMAP_ELEMENTCOORD) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = EnumDefinition.worldMapEvent.coord2.packed(); - return 1; - } else { - return 2; - } - } - } - } - } - } - } - } - } - } - } - - @ObfuscatedName("hv") - @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "2147289809" - ) - @Export("calculateMenuBounds") - static void calculateMenuBounds(int var0, int var1) { - int var2 = class173.fontBold12.stringWidth("Choose Option"); - - int var3; - int var4; - for (var3 = 0; var3 < Client.menuOptionsCount; ++var3) { - var4 = class173.fontBold12.stringWidth(class40.method799(var3)); - if (var4 > var2) { - var2 = var4; - } - } - - var2 += 8; - var3 = Client.menuOptionsCount * 15 + 22; - var4 = var0 - var2 / 2; - if (var4 + var2 > FloorDecoration.canvasWidth) { - var4 = FloorDecoration.canvasWidth - var2; - } - - if (var4 < 0) { - var4 = 0; - } - - int var5 = var1; - if (var1 + var3 > WallDecoration.canvasHeight) { - var5 = WallDecoration.canvasHeight - var3; - } - - if (var5 < 0) { - var5 = 0; - } - - UrlRequester.menuX = var4; - class51.menuY = var5; - FriendSystem.menuWidth = var2; - WorldMapDecoration.menuHeight = Client.menuOptionsCount * 15 + 22; + @Export("stringCp1252NullTerminatedByteSize") + public static int stringCp1252NullTerminatedByteSize(String var0) { + return var0.length() + 1; } } diff --git a/runescape-client/src/main/java/UserComparator7.java b/runescape-client/src/main/java/UserComparator7.java index 470ca14c55..ed05849b80 100644 --- a/runescape-client/src/main/java/UserComparator7.java +++ b/runescape-client/src/main/java/UserComparator7.java @@ -3,22 +3,10 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("eb") +@ObfuscatedName("el") @Implements("UserComparator7") public class UserComparator7 extends AbstractUserComparator { - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "[Llp;" - ) - @Export("title_muteSprite") - static IndexedSprite[] title_muteSprite; - @ObfuscatedName("ft") - @ObfuscatedSignature( - signature = "Lkr;" - ) - @Export("WorldMapElement_fonts") - static Fonts WorldMapElement_fonts; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -26,10 +14,10 @@ public class UserComparator7 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "1477313663" + signature = "(Ljx;Ljx;I)I", + garbageValue = "249143808" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -43,62 +31,4 @@ public class UserComparator7 extends AbstractUserComparator { public int compare(Object var1, Object var2) { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "(Lbo;Lbo;IZI)I", - garbageValue = "-147225017" - ) - @Export("compareWorlds") - static int compareWorlds(World var0, World var1, int var2, boolean var3) { - if (var2 == 1) { - int var4 = var0.population; - int var5 = var1.population; - if (!var3) { - if (var4 == -1) { - var4 = 2001; - } - - if (var5 == -1) { - var5 = 2001; - } - } - - return var4 - var5; - } else if (var2 == 2) { - return var0.location - var1.location; - } else if (var2 == 3) { - if (var0.activity.equals("-")) { - if (var1.activity.equals("-")) { - return 0; - } else { - return var3 ? -1 : 1; - } - } else if (var1.activity.equals("-")) { - return var3 ? 1 : -1; - } else { - return var0.activity.compareTo(var1.activity); - } - } else if (var2 == 4) { - return var0.method1778() ? (var1.method1778() ? 0 : 1) : (var1.method1778() ? -1 : 0); - } else if (var2 == 5) { - return var0.method1806() ? (var1.method1806() ? 0 : 1) : (var1.method1806() ? -1 : 0); - } else if (var2 == 6) { - return var0.isPvp() ? (var1.isPvp() ? 0 : 1) : (var1.isPvp() ? -1 : 0); - } else if (var2 == 7) { - return var0.isMembersOnly() ? (var1.isMembersOnly() ? 0 : 1) : (var1.isMembersOnly() ? -1 : 0); - } else { - return var0.id - var1.id; - } - } - - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "(CB)Z", - garbageValue = "1" - ) - @Export("isCharAlphabetic") - public static boolean isCharAlphabetic(char var0) { - return var0 >= 'A' && var0 <= 'Z' || var0 >= 'a' && var0 <= 'z'; - } } diff --git a/runescape-client/src/main/java/UserComparator8.java b/runescape-client/src/main/java/UserComparator8.java index 7bed81686d..e44ed007ea 100644 --- a/runescape-client/src/main/java/UserComparator8.java +++ b/runescape-client/src/main/java/UserComparator8.java @@ -1,14 +1,25 @@ -import java.io.File; -import java.io.RandomAccessFile; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ea") +@ObfuscatedName("ez") @Implements("UserComparator8") public class UserComparator8 extends AbstractUserComparator { - @ObfuscatedName("z") + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "Llw;" + ) + @Export("options_buttons_0Sprite") + static IndexedSprite options_buttons_0Sprite; + @ObfuscatedName("fa") + @ObfuscatedGetter( + intValue = 1075800505 + ) + @Export("baseX") + static int baseX; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -16,10 +27,10 @@ public class UserComparator8 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;I)I", - garbageValue = "-2001610603" + signature = "(Ljx;Ljx;I)I", + garbageValue = "-2099102147" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -38,79 +49,19 @@ public class UserComparator8 extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)Ljava/io/File;", - garbageValue = "-1561719392" - ) - @Export("getFile") - public static File getFile(String var0) { - if (!FileSystem.FileSystem_hasPermissions) { - throw new RuntimeException(""); - } else { - File var1 = (File)FileSystem.FileSystem_cacheFiles.get(var0); - if (var1 != null) { - return var1; - } else { - File var2 = new File(FileSystem.FileSystem_cacheDir, var0); - RandomAccessFile var3 = null; - - try { - File var4 = new File(var2.getParent()); - if (!var4.exists()) { - throw new RuntimeException(""); - } else { - var3 = new RandomAccessFile(var2, "rw"); - int var5 = var3.read(); - var3.seek(0L); - var3.write(var5); - var3.seek(0L); - var3.close(); - FileSystem.FileSystem_cacheFiles.put(var0, var2); - return var2; - } - } catch (Exception var8) { - try { - if (var3 != null) { - var3.close(); - var3 = null; - } - } catch (Exception var7) { - } - - throw new RuntimeException(); - } - } - } + @ObfuscatedName("c") + @Export("Entity_unpackID") + public static int Entity_unpackID(long var0) { + return (int)(var0 >>> 17 & 4294967295L); } - @ObfuscatedName("fn") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "11" + signature = "(CI)Z", + garbageValue = "-1252421563" ) - @Export("setWindowedMode") - static void setWindowedMode(int var0) { - Client.field754 = 0L; - if (var0 >= 2) { - Client.isResizable = true; - } else { - Client.isResizable = false; - } - - if (class247.getWindowedMode() == 1) { - ViewportMouse.client.setMaxCanvasSize(765, 503); - } else { - ViewportMouse.client.setMaxCanvasSize(7680, 2160); - } - - if (Client.gameState >= 25) { - PacketBufferNode var1 = InterfaceParent.getPacketBufferNode(ClientPacket.field2256, Client.packetWriter.isaacCipher); - var1.packetBuffer.writeByte(class247.getWindowedMode()); - var1.packetBuffer.writeShort(FloorDecoration.canvasWidth); - var1.packetBuffer.writeShort(WallDecoration.canvasHeight); - Client.packetWriter.addNode(var1); - } - + @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/UserComparator9.java b/runescape-client/src/main/java/UserComparator9.java index d1d1e8990b..9fa8b510e9 100644 --- a/runescape-client/src/main/java/UserComparator9.java +++ b/runescape-client/src/main/java/UserComparator9.java @@ -3,10 +3,16 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("el") +@ObfuscatedName("ey") @Implements("UserComparator9") public class UserComparator9 extends AbstractUserComparator { - @ObfuscatedName("z") + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "Llw;" + ) + @Export("titlebuttonSprite") + static IndexedSprite titlebuttonSprite; + @ObfuscatedName("a") @Export("reversed") final boolean reversed; @@ -14,10 +20,10 @@ public class UserComparator9 extends AbstractUserComparator { this.reversed = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljl;Ljl;B)I", - garbageValue = "35" + signature = "(Ljx;Ljx;B)I", + garbageValue = "-80" ) @Export("compareBuddy") int compareBuddy(Buddy var1, Buddy var2) { @@ -32,35 +38,47 @@ public class UserComparator9 extends AbstractUserComparator { return this.compareBuddy((Buddy)var1, (Buddy)var2); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IB)Liu;", - garbageValue = "46" + signature = "(II)I", + garbageValue = "-728098315" ) - @Export("FloorUnderlayDefinition_get") - public static FloorUnderlayDefinition FloorUnderlayDefinition_get(int var0) { - FloorUnderlayDefinition var1 = (FloorUnderlayDefinition)FloorUnderlayDefinition.FloorUnderlayDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; + @Export("getVarbit") + public static int getVarbit(int var0) { + VarbitDefinition var2 = (VarbitDefinition)VarbitDefinition.VarbitDefinition_cached.get((long)var0); + VarbitDefinition var1; + if (var2 != null) { + var1 = var2; } else { - byte[] var2 = FloorUnderlayDefinition.FloorUnderlayDefinition_archive.takeFile(1, var0); - var1 = new FloorUnderlayDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2), var0); + byte[] var7 = VarbitDefinition.VarbitDefinition_archive.takeFile(14, var0); + var2 = new VarbitDefinition(); + if (var7 != null) { + var2.decode(new Buffer(var7)); } - var1.postDecode(); - FloorUnderlayDefinition.FloorUnderlayDefinition_cached.put(var1, (long)var0); - return var1; + VarbitDefinition.VarbitDefinition_cached.put(var2, (long)var0); + var1 = var2; } + + int var3 = var1.baseVar; + int var4 = var1.startBit; + int var5 = var1.endBit; + int var6 = Varps.Varps_masks[var5 - var4]; + return Varps.Varps_main[var3] >> var4 & var6; } - @ObfuscatedName("n") + @ObfuscatedName("lc") @ObfuscatedSignature( - signature = "(IS)I", - garbageValue = "-18305" + signature = "(Ljava/lang/String;S)V", + garbageValue = "11607" ) - public static int method3359(int var0) { - return var0 >> 17 & 7; + @Export("clanKickUser") + static final void clanKickUser(String var0) { + if (class4.clanChat != null) { + PacketBufferNode var1 = SoundSystem.getPacketBufferNode(ClientPacket.field2195, Client.packetWriter.isaacCipher); + var1.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var0)); + var1.packetBuffer.writeStringCp1252NullTerminated(var0); + Client.packetWriter.addNode(var1); + } } } diff --git a/runescape-client/src/main/java/UserList.java b/runescape-client/src/main/java/UserList.java index 57e791d3a5..0353c43a4d 100644 --- a/runescape-client/src/main/java/UserList.java +++ b/runescape-client/src/main/java/UserList.java @@ -7,34 +7,34 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jb") +@ObfuscatedName("jc") @Implements("UserList") public abstract class UserList { - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 2041615959 + intValue = 251345775 ) @Export("capacity") final int capacity; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1842381401 + intValue = 15871715 ) @Export("size") int size; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "[Ljh;" + signature = "[Ljg;" ) @Export("array") User[] array; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("usernamesMap") HashMap usernamesMap; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("previousUsernamesMap") HashMap previousUsernamesMap; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("comparator") Comparator comparator; @@ -47,26 +47,26 @@ public abstract class UserList { this.previousUsernamesMap = new HashMap(var1 / 8); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)Ljh;", - garbageValue = "2" + signature = "(I)Ljg;", + garbageValue = "-706396611" ) @Export("newInstance") abstract User newInstance(); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)[Ljh;", - garbageValue = "951526901" + signature = "(II)[Ljg;", + garbageValue = "1510983955" ) @Export("newTypedArray") abstract User[] newTypedArray(int var1); @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1173231376" + signature = "(B)V", + garbageValue = "71" ) @Export("clear") public void clear() { @@ -76,30 +76,30 @@ public abstract class UserList { this.previousUsernamesMap.clear(); } - @ObfuscatedName("b") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "377492255" + garbageValue = "-523583503" ) @Export("getSize") public int getSize() { return this.size; } - @ObfuscatedName("o") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "905555090" + garbageValue = "1719086415" ) @Export("isFull") public boolean isFull() { - return this.capacity == this.size; + return this.size == this.capacity; } - @ObfuscatedName("a") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(Ljq;I)Z", - garbageValue = "154884591" + signature = "(Lju;I)Z", + garbageValue = "-1236926402" ) @Export("contains") public boolean contains(Username var1) { @@ -110,10 +110,10 @@ public abstract class UserList { } } - @ObfuscatedName("e") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(Ljq;I)Ljh;", - garbageValue = "1786549701" + signature = "(Lju;I)Ljg;", + garbageValue = "-261322515" ) @Export("getByUsername") public User getByUsername(Username var1) { @@ -121,10 +121,10 @@ public abstract class UserList { return var2 != null ? var2 : this.getByPreviousUsername(var1); } - @ObfuscatedName("x") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(Ljq;B)Ljh;", - garbageValue = "-117" + signature = "(Lju;B)Ljg;", + garbageValue = "-41" ) @Export("getByCurrentUsername") User getByCurrentUsername(Username var1) { @@ -133,18 +133,18 @@ public abstract class UserList { @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(Ljq;I)Ljh;", - garbageValue = "-105614622" + signature = "(Lju;I)Ljg;", + garbageValue = "208205834" ) @Export("getByPreviousUsername") User getByPreviousUsername(Username var1) { return !var1.hasCleanName() ? null : (User)this.previousUsernamesMap.get(var1); } - @ObfuscatedName("s") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(Ljq;I)Z", - garbageValue = "396177459" + signature = "(Lju;I)Z", + garbageValue = "-794450034" ) @Export("removeByUsername") public final boolean removeByUsername(Username var1) { @@ -157,10 +157,10 @@ public abstract class UserList { } } - @ObfuscatedName("f") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(Ljh;I)V", - garbageValue = "-1534400390" + signature = "(Ljg;I)V", + garbageValue = "2098286912" ) @Export("remove") final void remove(User var1) { @@ -173,18 +173,18 @@ public abstract class UserList { @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(Ljq;I)Ljh;", - garbageValue = "1185457515" + signature = "(Lju;B)Ljg;", + garbageValue = "0" ) @Export("addLastNoPreviousUsername") User addLastNoPreviousUsername(Username var1) { return this.addLast(var1, (Username)null); } - @ObfuscatedName("d") + @ObfuscatedName("r") @ObfuscatedSignature( - signature = "(Ljq;Ljq;S)Ljh;", - garbageValue = "255" + signature = "(Lju;Lju;I)Ljg;", + garbageValue = "-1291980201" ) @Export("addLast") User addLast(Username var1, Username var2) { @@ -199,10 +199,10 @@ public abstract class UserList { } } - @ObfuscatedName("l") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(II)Ljh;", - garbageValue = "2063225233" + signature = "(II)Ljg;", + garbageValue = "1933268633" ) @Export("get") public final User get(int var1) { @@ -213,10 +213,10 @@ public abstract class UserList { } } - @ObfuscatedName("k") + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2147144826" + signature = "(B)V", + garbageValue = "1" ) @Export("sort") public final void sort() { @@ -228,10 +228,10 @@ public abstract class UserList { } - @ObfuscatedName("ac") + @ObfuscatedName("b") @ObfuscatedSignature( - signature = "(Ljh;Ljq;Ljq;B)V", - garbageValue = "24" + signature = "(Ljg;Lju;Lju;I)V", + garbageValue = "-952068239" ) @Export("changeName") final void changeName(User var1, Username var2, Username var3) { @@ -240,10 +240,10 @@ public abstract class UserList { this.mapPut(var1); } - @ObfuscatedName("aa") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(Ljh;B)I", - garbageValue = "4" + signature = "(Ljg;I)I", + garbageValue = "-749364555" ) @Export("indexOf") final int indexOf(User var1) { @@ -256,10 +256,10 @@ public abstract class UserList { return -1; } - @ObfuscatedName("ap") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "(Ljh;I)V", - garbageValue = "-1535395374" + signature = "(Ljg;I)V", + garbageValue = "-288832782" ) @Export("mapRemove") final void mapRemove(User var1) { @@ -273,20 +273,20 @@ public abstract class UserList { } } - @ObfuscatedName("ar") + @ObfuscatedName("ad") @ObfuscatedSignature( - signature = "(Ljh;B)V", - garbageValue = "3" + signature = "(Ljg;B)V", + garbageValue = "-74" ) @Export("arrayAddLast") final void arrayAddLast(User var1) { this.array[++this.size - 1] = var1; } - @ObfuscatedName("ab") + @ObfuscatedName("ag") @ObfuscatedSignature( - signature = "(Ljh;I)V", - garbageValue = "-1752297517" + signature = "(Ljg;I)V", + garbageValue = "243996394" ) @Export("mapPut") final void mapPut(User var1) { @@ -300,10 +300,10 @@ public abstract class UserList { } - @ObfuscatedName("ax") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(IB)V", - garbageValue = "36" + signature = "(II)V", + garbageValue = "344038656" ) @Export("arrayRemove") final void arrayRemove(int var1) { @@ -314,20 +314,20 @@ public abstract class UserList { } - @ObfuscatedName("as") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "2" + signature = "(I)V", + garbageValue = "594153756" ) @Export("removeComparator") public final void removeComparator() { this.comparator = null; } - @ObfuscatedName("ao") + @ObfuscatedName("am") @ObfuscatedSignature( signature = "(Ljava/util/Comparator;B)V", - garbageValue = "59" + garbageValue = "1" ) @Export("addComparator") public final void addComparator(Comparator var1) { diff --git a/runescape-client/src/main/java/Username.java b/runescape-client/src/main/java/Username.java index af1c8f885a..2e6ced708d 100644 --- a/runescape-client/src/main/java/Username.java +++ b/runescape-client/src/main/java/Username.java @@ -3,48 +3,92 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jq") +@ObfuscatedName("ju") @Implements("Username") public class Username implements Comparable { - @ObfuscatedName("z") + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "[Lbk;" + ) + @Export("World_worlds") + static World[] World_worlds; + @ObfuscatedName("a") @Export("name") String name; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("cleanName") String cleanName; @ObfuscatedSignature( - signature = "(Ljava/lang/String;Lli;)V" + signature = "(Ljava/lang/String;Lln;)V" ) public Username(String var1, LoginType var2) { this.name = var1; - this.cleanName = ScriptEvent.method1198(var1, var2); + String var4; + if (var1 == null) { + var4 = null; + } else { + int var5 = 0; + + int var6; + for (var6 = var1.length(); var5 < var6 && class13.method200(var1.charAt(var5)); ++var5) { + } + + while (var6 > var5 && class13.method200(var1.charAt(var6 - 1))) { + --var6; + } + + int var7 = var6 - var5; + if (var7 >= 1 && var7 <= WorldMapDecoration.method388(var2)) { + StringBuilder var8 = new StringBuilder(var7); + + for (int var9 = var5; var9 < var6; ++var9) { + char var10 = var1.charAt(var9); + if (WallDecoration.method3420(var10)) { + char var11 = Buddy.method5286(var10); + if (var11 != 0) { + var8.append(var11); + } + } + } + + if (var8.length() == 0) { + var4 = null; + } else { + var4 = var8.toString(); + } + } else { + var4 = null; + } + } + + this.cleanName = var4; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(I)Ljava/lang/String;", - garbageValue = "1788579750" + garbageValue = "-1911798816" ) @Export("getName") public String getName() { return this.name; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "415071897" + signature = "(B)Z", + garbageValue = "121" ) @Export("hasCleanName") public boolean hasCleanName() { return this.cleanName != null; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljq;I)I", - garbageValue = "432116697" + signature = "(Lju;S)I", + garbageValue = "-11004" ) @Export("compareToTyped") public int compareToTyped(Username var1) { @@ -82,12 +126,40 @@ public class Username implements Comparable { return this.compareToTyped((Username)var1); } - @ObfuscatedName("ai") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "([BII)I", - garbageValue = "-42849866" + signature = "(II)I", + garbageValue = "-300654930" ) - public static int method5147(byte[] var0, int var1) { - return LoginScreenAnimation.method1848(var0, 0, var1); + @Export("ViewportMouse_unpackX") + public static int ViewportMouse_unpackX(int var0) { + long var2 = ViewportMouse.ViewportMouse_entityTags[var0]; + int var1 = (int)(var2 >>> 14 & 3L); + return var1; + } + + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "(I)Llx;", + garbageValue = "-2059953793" + ) + static Sprite method5338() { + Sprite var0 = new Sprite(); + var0.width = class325.SpriteBuffer_spriteWidth; + var0.height = class325.SpriteBuffer_spriteHeight; + var0.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[0]; + var0.yOffset = HealthBar.SpriteBuffer_yOffsets[0]; + var0.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[0]; + var0.subHeight = AttackOption.SpriteBuffer_spriteHeights[0]; + int var1 = var0.subHeight * var0.subWidth; + byte[] var2 = class325.SpriteBuffer_pixels[0]; + var0.pixels = new int[var1]; + + for (int var3 = 0; var3 < var1; ++var3) { + var0.pixels[var3] = class325.SpriteBuffer_spritePalette[var2[var3] & 255]; + } + + WorldMapData_1.method787(); + return var0; } } diff --git a/runescape-client/src/main/java/Usernamed.java b/runescape-client/src/main/java/Usernamed.java index 5442c967a8..16bc5c1fa3 100644 --- a/runescape-client/src/main/java/Usernamed.java +++ b/runescape-client/src/main/java/Usernamed.java @@ -3,13 +3,13 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ju") +@ObfuscatedName("jv") @Implements("Usernamed") public interface Usernamed { - @ObfuscatedName("kz") + @ObfuscatedName("lz") @ObfuscatedSignature( - signature = "(S)Ljq;", - garbageValue = "9955" + signature = "(S)Lju;", + garbageValue = "1353" ) @Export("username") Username username(); diff --git a/runescape-client/src/main/java/VarbitDefinition.java b/runescape-client/src/main/java/VarbitDefinition.java index 4f3f74a277..ce754e1c40 100644 --- a/runescape-client/src/main/java/VarbitDefinition.java +++ b/runescape-client/src/main/java/VarbitDefinition.java @@ -4,36 +4,38 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("id") +@ObfuscatedName("ib") @Implements("VarbitDefinition") public class VarbitDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("VarbitDefinition_archive") public static AbstractArchive VarbitDefinition_archive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("VarbitDefinition_cached") public static EvictingDualNodeHashTable VarbitDefinition_cached; - @ObfuscatedName("v") + @ObfuscatedName("av") + static String field3288; + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -613999551 + intValue = 928721065 ) @Export("baseVar") public int baseVar; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1319012991 + intValue = 92662329 ) @Export("startBit") public int startBit; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1338326949 + intValue = 2061625257 ) @Export("endBit") public int endBit; @@ -42,10 +44,10 @@ public class VarbitDefinition extends DualNode { VarbitDefinition_cached = new EvictingDualNodeHashTable(64); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1106809134" + signature = "(Lkc;I)V", + garbageValue = "-1741375018" ) @Export("decode") public void decode(Buffer var1) { @@ -59,10 +61,10 @@ public class VarbitDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "1640448389" + signature = "(Lkc;II)V", + garbageValue = "1555734488" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -74,634 +76,15 @@ public class VarbitDefinition extends DualNode { } - @ObfuscatedName("q") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(Lkn;Lkn;Lkn;I)V", - garbageValue = "937788655" + signature = "(Ljava/lang/String;B)V", + garbageValue = "-49" ) - @Export("drawTitle") - static void drawTitle(Font var0, Font var1, Font var2) { - Login.xPadding = (FloorDecoration.canvasWidth - 765) / 2; - Login.loginBoxX = Login.xPadding + 202; - GrandExchangeOfferUnitPriceComparator.loginBoxCenter = Login.loginBoxX + 180; - if (Login.worldSelectOpen) { - if (ArchiveLoader.worldSelectBackSprites == null) { - Archive var36 = GrandExchangeOfferAgeComparator.archive8; - int var39 = var36.getGroupId("sl_back"); - int var37 = var36.getFileId(var39, ""); - Sprite[] var35 = Canvas.SpriteBuffer_getSpriteArray(var36, var39, var37); - ArchiveLoader.worldSelectBackSprites = var35; - } - - if (Language.worldSelectFlagSprites == null) { - Language.worldSelectFlagSprites = WorldMapIcon_0.method222(GrandExchangeOfferAgeComparator.archive8, "sl_flags", ""); - } - - if (GrandExchangeOfferTotalQuantityComparator.worldSelectArrows == null) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows = WorldMapIcon_0.method222(GrandExchangeOfferAgeComparator.archive8, "sl_arrows", ""); - } - - if (Frames.worldSelectStars == null) { - Frames.worldSelectStars = WorldMapIcon_0.method222(GrandExchangeOfferAgeComparator.archive8, "sl_stars", ""); - } - - if (WorldMapIcon_0.worldSelectLeftSprite == null) { - WorldMapIcon_0.worldSelectLeftSprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(GrandExchangeOfferAgeComparator.archive8, "leftarrow", ""); - } - - if (HealthBar.worldSelectRightSprite == null) { - HealthBar.worldSelectRightSprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(GrandExchangeOfferAgeComparator.archive8, "rightarrow", ""); - } - - Rasterizer2D.Rasterizer2D_fillRectangle(Login.xPadding, 23, 765, 480, 0); - Rasterizer2D.Rasterizer2D_fillRectangleGradient(Login.xPadding, 0, 125, 23, 12425273, 9135624); - Rasterizer2D.Rasterizer2D_fillRectangleGradient(Login.xPadding + 125, 0, 640, 23, 5197647, 2697513); - var0.drawCentered("Select a world", Login.xPadding + 62, 15, 0, -1); - if (Frames.worldSelectStars != null) { - Frames.worldSelectStars[1].drawAt(Login.xPadding + 140, 1); - var1.draw("Members only world", Login.xPadding + 152, 10, 0xffffff, -1); - Frames.worldSelectStars[0].drawAt(Login.xPadding + 140, 12); - var1.draw("Free world", Login.xPadding + 152, 21, 0xffffff, -1); - } - - if (GrandExchangeOfferTotalQuantityComparator.worldSelectArrows != null) { - int var45 = Login.xPadding + 280; - if (World.World_sortOption1[0] == 0 && World.World_sortOption2[0] == 0) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[2].drawAt(var45, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[0].drawAt(var45, 4); - } - - if (World.World_sortOption1[0] == 0 && World.World_sortOption2[0] == 1) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[3].drawAt(var45 + 15, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[1].drawAt(var45 + 15, 4); - } - - var0.draw("World", var45 + 32, 17, 0xffffff, -1); - int var24 = Login.xPadding + 390; - if (World.World_sortOption1[0] == 1 && World.World_sortOption2[0] == 0) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[2].drawAt(var24, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[0].drawAt(var24, 4); - } - - if (World.World_sortOption1[0] == 1 && World.World_sortOption2[0] == 1) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[3].drawAt(var24 + 15, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[1].drawAt(var24 + 15, 4); - } - - var0.draw("Players", var24 + 32, 17, 0xffffff, -1); - int var39 = Login.xPadding + 500; - if (World.World_sortOption1[0] == 2 && World.World_sortOption2[0] == 0) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[2].drawAt(var39, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[0].drawAt(var39, 4); - } - - if (World.World_sortOption1[0] == 2 && World.World_sortOption2[0] == 1) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[3].drawAt(var39 + 15, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[1].drawAt(var39 + 15, 4); - } - - var0.draw("Location", var39 + 32, 17, 0xffffff, -1); - int var37 = Login.xPadding + 610; - if (World.World_sortOption1[0] == 3 && World.World_sortOption2[0] == 0) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[2].drawAt(var37, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[0].drawAt(var37, 4); - } - - if (World.World_sortOption1[0] == 3 && World.World_sortOption2[0] == 1) { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[3].drawAt(var37 + 15, 4); - } else { - GrandExchangeOfferTotalQuantityComparator.worldSelectArrows[1].drawAt(var37 + 15, 4); - } - - var0.draw("Type", var37 + 32, 17, 0xffffff, -1); - } - - Rasterizer2D.Rasterizer2D_fillRectangle(Login.xPadding + 708, 4, 50, 16, 0); - var1.drawCentered("Cancel", Login.xPadding + 708 + 25, 16, 0xffffff, -1); - Login.hoveredWorldIndex = -1; - if (ArchiveLoader.worldSelectBackSprites != null) { - byte var23 = 88; - byte var50 = 19; - int var39 = 765 / (var23 + 1) - 1; - int var37 = 480 / (var50 + 1); - - int var28, var29; - - do { - var28 = var37; - var29 = var39; - if (var37 * (var39 - 1) >= World.World_count) { - --var39; - } - - if (var39 * (var37 - 1) >= World.World_count) { - --var37; - } - - if (var39 * (var37 - 1) >= World.World_count) { - --var37; - } - } while(var28 != var37 || var39 != var29); - - var28 = (765 - var39 * var23) / (var39 + 1); - if (var28 > 5) { - var28 = 5; - } - - var29 = (480 - var50 * var37) / (var37 + 1); - if (var29 > 5) { - var29 = 5; - } - - int var30 = (765 - var23 * var39 - var28 * (var39 - 1)) / 2; - int var10 = (480 - var37 * var50 - var29 * (var37 - 1)) / 2; - int var31 = (var37 + World.World_count - 1) / var37; - Login.worldSelectPagesCount = var31 - var39; - if (WorldMapIcon_0.worldSelectLeftSprite != null && Login.worldSelectPage > 0) { - WorldMapIcon_0.worldSelectLeftSprite.drawAt(8, WallDecoration.canvasHeight / 2 - WorldMapIcon_0.worldSelectLeftSprite.subHeight / 2); - } - - if (HealthBar.worldSelectRightSprite != null && Login.worldSelectPage < Login.worldSelectPagesCount) { - HealthBar.worldSelectRightSprite.drawAt(FloorDecoration.canvasWidth - HealthBar.worldSelectRightSprite.subWidth - 8, WallDecoration.canvasHeight / 2 - HealthBar.worldSelectRightSprite.subHeight / 2); - } - - int var12 = var10 + 23; - int var32 = var30 + Login.xPadding; - int var14 = 0; - boolean var15 = false; - int var16 = Login.worldSelectPage; - - int var17; - for (var17 = var37 * var16; var17 < World.World_count && var16 - Login.worldSelectPage < var39; ++var17) { - World var33 = World.World_worlds[var17]; - boolean var19 = true; - String var20 = Integer.toString(var33.population); - if (var33.population == -1) { - var20 = "OFF"; - var19 = false; - } else if (var33.population > 1980) { - var20 = "FULL"; - var19 = false; - } - - int var22 = 0; - byte var21; - if (var33.isBeta()) { - if (var33.isMembersOnly()) { - var21 = 7; - } else { - var21 = 6; - } - } else if (var33.isDeadman()) { - var22 = 16711680; - if (var33.isMembersOnly()) { - var21 = 5; - } else { - var21 = 4; - } - } else if (var33.isPvp()) { - if (var33.isMembersOnly()) { - var21 = 3; - } else { - var21 = 2; - } - } else if (var33.isMembersOnly()) { - var21 = 1; - } else { - var21 = 0; - } - - if (MouseHandler.MouseHandler_x >= var32 && MouseHandler.MouseHandler_y >= var12 && MouseHandler.MouseHandler_x < var23 + var32 && MouseHandler.MouseHandler_y < var50 + var12 && var19) { - Login.hoveredWorldIndex = var17; - ArchiveLoader.worldSelectBackSprites[var21].drawTransOverlayAt(var32, var12, 128, 0xffffff); - var15 = true; - } else { - ArchiveLoader.worldSelectBackSprites[var21].drawAt(var32, var12); - } - - if (Language.worldSelectFlagSprites != null) { - Language.worldSelectFlagSprites[(var33.isMembersOnly() ? 8 : 0) + var33.location].drawAt(var32 + 29, var12); - } - - var0.drawCentered(Integer.toString(var33.id), var32 + 15, var50 / 2 + var12 + 5, var22, -1); - var1.drawCentered(var20, var32 + 60, var50 / 2 + var12 + 5, 268435455, -1); - var12 = var12 + var29 + var50; - ++var14; - if (var14 >= var37) { - var12 = var10 + 23; - var32 = var32 + var23 + var28; - var14 = 0; - ++var16; - } - } - - if (var15) { - var17 = var1.stringWidth(World.World_worlds[Login.hoveredWorldIndex].activity) + 6; - int var18 = var1.ascent + 8; - int var43 = MouseHandler.MouseHandler_y + 25; - if (var18 + var43 > 480) { - var43 = MouseHandler.MouseHandler_y - 25 - var18; - } - - Rasterizer2D.Rasterizer2D_fillRectangle(MouseHandler.MouseHandler_x - var17 / 2, var43, var17, var18, 16777120); - Rasterizer2D.Rasterizer2D_drawRectangle(MouseHandler.MouseHandler_x - var17 / 2, var43, var17, var18, 0); - var1.drawCentered(World.World_worlds[Login.hoveredWorldIndex].activity, MouseHandler.MouseHandler_x, var43 + var1.ascent + 4, 0, -1); - } - } - - class42.rasterProvider.drawFull(0, 0); - return; - } - - WorldMapID.leftTitleSprite.drawAt(Login.xPadding, 0); - class51.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - FontName.logoSprite.drawAt(Login.xPadding + 382 - FontName.logoSprite.subWidth / 2, 18); - if (Client.gameState == 0 || Client.gameState == 5) { - byte var23 = 20; - var0.drawCentered("RuneScape is loading - please wait...", Login.loginBoxX + 180, 245 - var23, 0xffffff, -1); - int var24 = 253 - var23; - Rasterizer2D.Rasterizer2D_drawRectangle(Login.loginBoxX + 180 - 152, var24, 304, 34, 9179409); - Rasterizer2D.Rasterizer2D_drawRectangle(Login.loginBoxX + 180 - 151, var24 + 1, 302, 32, 0); - Rasterizer2D.Rasterizer2D_fillRectangle(Login.loginBoxX + 180 - 150, var24 + 2, Login.Login_loadingPercent * 3, 30, 9179409); - Rasterizer2D.Rasterizer2D_fillRectangle(Login.Login_loadingPercent * 3 + (Login.loginBoxX + 180 - 150), var24 + 2, 300 - Login.Login_loadingPercent * 3, 30, 0); - var0.drawCentered(Login.Login_loadingText, Login.loginBoxX + 180, 276 - var23, 0xffffff, -1); - } else if (Client.gameState == 20) { - class32.titleboxSprite.drawAt(Login.loginBoxX + 180 - class32.titleboxSprite.subWidth / 2, 271 - class32.titleboxSprite.subHeight / 2); - short var44 = 201; - var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 15; - var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var45 += 7; - if (Login.loginIndex != 4) { - var0.draw("Login: ", Login.loginBoxX + 180 - 110, var45, 0xffffff, 0); - short var46 = 200; - String var25; - if (!AbstractArchive.clientPreferences.hideUsername) { - var25 = Login.Login_username; - } else { - String var8 = Login.Login_username; - int var10 = var8.length(); - char[] var11 = new char[var10]; - - for (int var12 = 0; var12 < var10; ++var12) { - var11[var12] = '*'; - } - - String var9 = new String(var11); - var25 = var9; - } - - for (var25 = var25; var0.stringWidth(var25) > var46; var25 = var25.substring(0, var25.length() - 1)) { - } - - var0.draw(AbstractFont.escapeBrackets(var25), Login.loginBoxX + 180 - 70, var45, 0xffffff, 0); - var45 += 15; - String var8 = "Password: "; - String var27 = Login.Login_password; - int var12 = var27.length(); - char[] var13 = new char[var12]; - - for (int var14 = 0; var14 < var12; ++var14) { - var13[var14] = '*'; - } - - String var40 = new String(var13); - var0.draw(var8 + var40, Login.loginBoxX + 180 - 108, var45, 0xffffff, 0); - var45 += 15; - } - } else if (Client.gameState == 10 || Client.gameState == 11) { - class32.titleboxSprite.drawAt(Login.loginBoxX, 171); - if (Login.loginIndex == 0) { - short var44 = 251; - var0.drawCentered("Welcome to RuneScape", Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 30; - int var24 = Login.loginBoxX + 180 - 80; - short var5 = 291; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawLines("New User", var24 - 73, var5 - 20, 144, 40, 0xffffff, 0, 1, 1, 0); - var24 = Login.loginBoxX + 180 + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawLines("Existing User", var24 - 73, var5 - 20, 144, 40, 0xffffff, 0, 1, 1, 0); - } else if (Login.loginIndex == 1) { - var0.drawCentered(Login.Login_response0, Login.loginBoxX + 180, 201, 16776960, 0); - short var44 = 236; - var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var44, 0xffffff, 0); - int var45 = var44 + 15; - var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var45, 0xffffff, 0); - var45 += 15; - var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var45, 0xffffff, 0); - var45 += 15; - int var24 = Login.loginBoxX + 180 - 80; - short var5 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Continue", var24, var5 + 5, 0xffffff, 0); - var24 = Login.loginBoxX + 180 + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Cancel", var24, var5 + 5, 0xffffff, 0); - } else if (Login.loginIndex == 2) { - short var44 = 201; - var0.drawCentered(Login.Login_response1, GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var44, 16776960, 0); - int var45 = var44 + 15; - var0.drawCentered(Login.Login_response2, GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var45, 16776960, 0); - var45 += 15; - var0.drawCentered(Login.Login_response3, GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var45, 16776960, 0); - var45 += 15; - var45 += 7; - var0.draw("Login: ", GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 110, var45, 0xffffff, 0); - short var46 = 200; - String var25; - if (!AbstractArchive.clientPreferences.hideUsername) { - var25 = Login.Login_username; - } else { - String var8 = Login.Login_username; - int var10 = var8.length(); - char[] var11 = new char[var10]; - - for (int var12 = 0; var12 < var10; ++var12) { - var11[var12] = '*'; - } - - String var9 = new String(var11); - var25 = var9; - } - - for (var25 = var25; var0.stringWidth(var25) > var46; var25 = var25.substring(1)) { - } - - var0.draw(AbstractFont.escapeBrackets(var25) + (Login.currentLoginField == 0 & Client.cycle % 40 < 20 ? World.colorStartTag(16776960) + "|" : ""), GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 70, var45, 0xffffff, 0); - var45 += 15; - String var8 = "Password: "; - String var27 = Login.Login_password; - int var12 = var27.length(); - char[] var13 = new char[var12]; - - for (int var14 = 0; var14 < var12; ++var14) { - var13[var14] = '*'; - } - - String var40 = new String(var13); - var0.draw(var8 + var40 + (Login.currentLoginField == 1 & Client.cycle % 40 < 20 ? World.colorStartTag(16776960) + "|" : ""), GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 108, var45, 0xffffff, 0); - var45 += 15; - var44 = 277; - int var31 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + -117; - IndexedSprite var34 = ClientPacket.method3578(Client.Login_isUsernameRemembered, Login.field1176); - var34.drawAt(var31, var44); - var31 = var31 + var34.subWidth + 5; - var1.draw("Remember username", var31, var44 + 13, 16776960, 0); - var31 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + 24; - var34 = ClientPacket.method3578(AbstractArchive.clientPreferences.hideUsername, Login.field1192); - var34.drawAt(var31, var44); - var31 = var31 + var34.subWidth + 5; - var1.draw("Hide username", var31, var44 + 13, 16776960, 0); - var45 = var44 + 15; - int var32 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter - 80; - short var42 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var32 - 73, var42 - 20); - var0.drawCentered("Login", var32, var42 + 5, 0xffffff, 0); - var32 = GrandExchangeOfferUnitPriceComparator.loginBoxCenter + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var32 - 73, var42 - 20); - var0.drawCentered("Cancel", var32, var42 + 5, 0xffffff, 0); - var44 = 357; - switch(Login.field1171) { - case 2: - class3.field18 = "Having trouble logging in?"; - break; - default: - class3.field18 = "Can't login? Click here."; - } - - LoginScreenAnimation.field1032 = new Bounds(GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var44, var1.stringWidth(class3.field18), 11); - class162.field1988 = new Bounds(GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var44, var1.stringWidth("Still having trouble logging in?"), 11); - var1.drawCentered(class3.field18, GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var44, 0xffffff, 0); - } else if (Login.loginIndex == 3) { - short var44 = 201; - var0.drawCentered("Invalid credentials.", Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 20; - var1.drawCentered("For accounts created after 24th November 2010, please use your", Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var1.drawCentered("email address to login. Otherwise please login with your username.", Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - int var24 = Login.loginBoxX + 180; - short var5 = 276; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var2.drawCentered("Try again", var24, var5 + 5, 0xffffff, 0); - var24 = Login.loginBoxX + 180; - var5 = 326; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var2.drawCentered("Forgotten password?", var24, var5 + 5, 0xffffff, 0); - } else if (Login.loginIndex == 4) { - var0.drawCentered("Authenticator", Login.loginBoxX + 180, 201, 16776960, 0); - short var44 = 236; - var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var44, 0xffffff, 0); - int var45 = var44 + 15; - var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var45, 0xffffff, 0); - var45 += 15; - var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var45, 0xffffff, 0); - var45 += 15; - String var26 = "PIN: "; - String var7 = DesktopPlatformInfoProvider.otp; - int var30 = var7.length(); - char[] var47 = new char[var30]; - - for (int var31 = 0; var31 < var30; ++var31) { - var47[var31] = '*'; - } - - String var8 = new String(var47); - var0.draw(var26 + var8 + (Client.cycle % 40 < 20 ? World.colorStartTag(16776960) + "|" : ""), Login.loginBoxX + 180 - 108, var45, 0xffffff, 0); - var45 -= 8; - var0.draw("Trust this computer", Login.loginBoxX + 180 - 9, var45, 16776960, 0); - var45 += 15; - var0.draw("for 30 days: ", Login.loginBoxX + 180 - 9, var45, 16776960, 0); - int var29 = Login.loginBoxX + 180 - 9 + var0.stringWidth("for 30 days: ") + 15; - var30 = var45 - var0.ascent; - IndexedSprite var48; - if (Login.field1183) { - var48 = class42.options_buttons_2Sprite; - } else { - var48 = class195.options_buttons_0Sprite; - } - - var48.drawAt(var29, var30); - var45 += 15; - int var31 = Login.loginBoxX + 180 - 80; - short var41 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var31 - 73, var41 - 20); - var0.drawCentered("Continue", var31, var41 + 5, 0xffffff, 0); - var31 = Login.loginBoxX + 180 + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var31 - 73, var41 - 20); - var0.drawCentered("Cancel", var31, var41 + 5, 0xffffff, 0); - var1.drawCentered("Can't Log In?", Login.loginBoxX + 180, var41 + 36, 255, 0); - } else if (Login.loginIndex == 5) { - var0.drawCentered("Forgotten your password?", Login.loginBoxX + 180, 201, 16776960, 0); - short var44 = 221; - var2.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 15; - var2.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var2.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var45 += 14; - var0.draw("Username/email: ", Login.loginBoxX + 180 - 145, var45, 0xffffff, 0); - short var46 = 174; - String var25; - if (!AbstractArchive.clientPreferences.hideUsername) { - var25 = Login.Login_username; - } else { - String var8 = Login.Login_username; - int var10 = var8.length(); - char[] var11 = new char[var10]; - - for (int var12 = 0; var12 < var10; ++var12) { - var11[var12] = '*'; - } - - String var9 = new String(var11); - var25 = var9; - } - - for (var25 = var25; var0.stringWidth(var25) > var46; var25 = var25.substring(1)) { - } - - var0.draw(AbstractFont.escapeBrackets(var25) + (Client.cycle % 40 < 20 ? World.colorStartTag(16776960) + "|" : ""), Login.loginBoxX + 180 - 34, var45, 0xffffff, 0); - var45 += 15; - int var28 = Login.loginBoxX + 180 - 80; - short var49 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var28 - 73, var49 - 20); - var0.drawCentered("Recover", var28, var49 + 5, 0xffffff, 0); - var28 = Login.loginBoxX + 180 + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var28 - 73, var49 - 20); - var0.drawCentered("Back", var28, var49 + 5, 0xffffff, 0); - var49 = 356; - var1.drawCentered("Still having trouble logging in?", GrandExchangeOfferUnitPriceComparator.loginBoxCenter, var49, 268435455, 0); - } else if (Login.loginIndex == 6) { - short var44 = 201; - var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 15; - var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - int var24 = Login.loginBoxX + 180; - short var5 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Back", var24, var5 + 5, 0xffffff, 0); - } else if (Login.loginIndex == 7) { - short var44 = 216; - var0.drawCentered("Your date of birth isn't set.", Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 15; - var2.drawCentered("Please verify your account status by", Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var2.drawCentered("setting your date of birth.", Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - int var24 = Login.loginBoxX + 180 - 80; - short var5 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Set Date of Birth", var24, var5 + 5, 0xffffff, 0); - var24 = Login.loginBoxX + 180 + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Back", var24, var5 + 5, 0xffffff, 0); - } else if (Login.loginIndex == 8) { - short var44 = 216; - var0.drawCentered("Sorry, but your account is not eligible to play.", Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 15; - var2.drawCentered("For more information, please take a look at", Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var2.drawCentered("our privacy policy.", Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - int var24 = Login.loginBoxX + 180 - 80; - short var5 = 321; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Privacy Policy", var24, var5 + 5, 0xffffff, 0); - var24 = Login.loginBoxX + 180 + 80; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Back", var24, var5 + 5, 0xffffff, 0); - } else if (Login.loginIndex == 12) { - short var44 = 201; - String var4 = ""; - String var26 = ""; - String var25 = ""; - switch (Login.field1174) { - case 0: - var4 = "Your account has been disabled."; - var26 = Strings.field2793; - var25 = ""; - break; - case 1: - var4 = "Account locked as we suspect it has been stolen."; - var26 = Strings.field2783; - var25 = ""; - break; - default: - TilePaint.Login_promptCredentials(false); - } - - var0.drawCentered(var4, Login.loginBoxX + 180, var44, 16776960, 0); - int var45 = var44 + 15; - var2.drawCentered(var26, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - var2.drawCentered(var25, Login.loginBoxX + 180, var45, 16776960, 0); - var45 += 15; - int var28 = Login.loginBoxX + 180; - short var49 = 276; - AbstractRasterProvider.titlebuttonSprite.drawAt(var28 - 73, var49 - 20); - var0.drawCentered("Support Page", var28, var49 + 5, 0xffffff, 0); - var28 = Login.loginBoxX + 180; - var49 = 326; - AbstractRasterProvider.titlebuttonSprite.drawAt(var28 - 73, var49 - 20); - var0.drawCentered("Back", var28, var49 + 5, 0xffffff, 0); - } else if (Login.loginIndex == 24) { - short var44 = 221; - var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var44, 0xffffff, 0); - int var45 = var44 + 15; - var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var45, 0xffffff, 0); - var45 += 15; - var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var45, 0xffffff, 0); - var45 += 15; - int var24 = Login.loginBoxX + 180; - short var5 = 301; - AbstractRasterProvider.titlebuttonSprite.drawAt(var24 - 73, var5 - 20); - var0.drawCentered("Ok", var24, var5 + 5, 0xffffff, 0); - } - } - - if (Client.gameState >= 10) { - int[] var3 = new int[4]; - Rasterizer2D.Rasterizer2D_getClipArray(var3); - Rasterizer2D.Rasterizer2D_setClip(Login.xPadding, 0, Login.xPadding + 765, WallDecoration.canvasHeight); - BufferedSink.loginScreenRunesAnimation.draw(Login.xPadding - 22, Client.cycle); - BufferedSink.loginScreenRunesAnimation.draw(Login.xPadding + 22 + 765 - 128, Client.cycle); - Rasterizer2D.Rasterizer2D_setClipArray(var3); - } - - UserComparator7.title_muteSprite[AbstractArchive.clientPreferences.titleMusicDisabled ? 1 : 0].drawAt(Login.xPadding + 765 - 40, 463); - if (Client.gameState > 5 && Language.Language_EN == WorldMapLabelSize.clientLanguage) { - if (Skeleton.field1767 == null) { - Skeleton.field1767 = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(GrandExchangeOfferAgeComparator.archive8, "sl_button", ""); - } else { - int var45 = Login.xPadding + 5; - short var46 = 463; - byte var38 = 100; - byte var6 = 35; - Skeleton.field1767.drawAt(var45, var46); - var0.drawCentered("World" + " " + Client.worldId, var38 / 2 + var45, var6 / 2 + var46 - 2, 0xffffff, 0); - if (class51.World_request != null) { - var1.drawCentered("Loading...", var38 / 2 + var45, var6 / 2 + var46 + 12, 0xffffff, 0); - } else { - var1.drawCentered("Click to switch", var38 / 2 + var45, var6 / 2 + var46 + 12, 0xffffff, 0); - } - } - } - + static final void method4651(String var0) { + StringBuilder var10000 = (new StringBuilder()).append(var0); + Object var10001 = null; + String var1 = var10000.append(" is already on your ignore list").toString(); + class30.addGameMessage(30, "", var1); } } diff --git a/runescape-client/src/main/java/VarcInt.java b/runescape-client/src/main/java/VarcInt.java index de1dd1cc6b..2257218d4d 100644 --- a/runescape-client/src/main/java/VarcInt.java +++ b/runescape-client/src/main/java/VarcInt.java @@ -3,28 +3,33 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("is") +@ObfuscatedName("iz") @Implements("VarcInt") public class VarcInt extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("ns") @ObfuscatedSignature( - signature = "Lhp;" + signature = "[Lhi;" + ) + static Widget[] field3218; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "Lhq;" ) @Export("VarcInt_archive") public static AbstractArchive VarcInt_archive; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("VarcInt_cached") - public static EvictingDualNodeHashTable VarcInt_cached; - @ObfuscatedName("dp") + static EvictingDualNodeHashTable VarcInt_cached; + @ObfuscatedName("gi") @ObfuscatedSignature( - signature = "Lie;" + signature = "[Llw;" ) - @Export("archive18") - static Archive archive18; - @ObfuscatedName("v") + @Export("modIconSprites") + static IndexedSprite[] modIconSprites; + @ObfuscatedName("n") @Export("persist") public boolean persist; @@ -32,35 +37,47 @@ public class VarcInt extends DualNode { VarcInt_cached = new EvictingDualNodeHashTable(64); } - public VarcInt() { + VarcInt() { this.persist = false; } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "32" + signature = "(Lkc;I)V", + garbageValue = "-542237401" ) - public void method4372(Buffer var1) { + void method4549(Buffer var1) { while (true) { int var2 = var1.readUnsignedByte(); if (var2 == 0) { return; } - this.method4375(var1, var2); + this.method4550(var1, var2); } } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-773678840" + signature = "(Lkc;II)V", + garbageValue = "-1028868558" ) - void method4375(Buffer var1, int var2) { + void method4550(Buffer var1, int var2) { if (var2 == 2) { this.persist = true; } } + + @ObfuscatedName("gc") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1686094781" + ) + static void method4548() { + if (Client.combatTargetPlayerIndex >= 0 && Client.players[Client.combatTargetPlayerIndex] != null) { + Player.addPlayerToScene(Client.players[Client.combatTargetPlayerIndex], false); + } + + } } diff --git a/runescape-client/src/main/java/Varcs.java b/runescape-client/src/main/java/Varcs.java index 64f653b807..54ec9014ca 100644 --- a/runescape-client/src/main/java/Varcs.java +++ b/runescape-client/src/main/java/Varcs.java @@ -9,78 +9,52 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ct") +@ObfuscatedName("cz") @Implements("Varcs") public class Varcs { - @ObfuscatedName("e") - @ObfuscatedGetter( - intValue = -1292567711 - ) - @Export("graphicsTickTimeIdx") - static int graphicsTickTimeIdx; - @ObfuscatedName("ho") - @ObfuscatedGetter( - intValue = -2002882325 - ) - @Export("cameraY") - static int cameraY; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("intsPersistence") boolean[] intsPersistence; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("map") Map map; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("strings") String[] strings; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("unwrittenChanges") boolean unwrittenChanges; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - longValue = 457115256589346479L + longValue = 4894374485782924843L ) - long field1253; + long field1246; Varcs() { this.unwrittenChanges = false; - int var1 = FaceNormal.archive2.getGroupFileCount(19); + int var1 = AbstractWorldMapIcon.archive2.getGroupFileCount(19); this.map = new HashMap(); this.intsPersistence = new boolean[var1]; int var2; for (var2 = 0; var2 < var1; ++var2) { - VarcInt var4 = (VarcInt)VarcInt.VarcInt_cached.get((long)var2); - VarcInt var3; - if (var4 != null) { - var3 = var4; - } else { - byte[] var5 = VarcInt.VarcInt_archive.takeFile(19, var2); - var4 = new VarcInt(); - if (var5 != null) { - var4.method4372(new Buffer(var5)); - } - - VarcInt.VarcInt_cached.put(var4, (long)var2); - var3 = var4; - } - + VarcInt var3 = Decimator.method2694(var2); this.intsPersistence[var2] = var3.persist; } var2 = 0; - if (FaceNormal.archive2.method4244(15)) { - var2 = FaceNormal.archive2.getGroupFileCount(15); + if (AbstractWorldMapIcon.archive2.method4436(15)) { + var2 = AbstractWorldMapIcon.archive2.getGroupFileCount(15); } this.strings = new String[var2]; this.read(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "1021423877" + garbageValue = "878961648" ) @Export("setInt") void setInt(int var1, int var2) { @@ -91,10 +65,10 @@ public class Varcs { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IB)I", - garbageValue = "104" + signature = "(II)I", + garbageValue = "1218722234" ) @Export("getInt") int getInt(int var1) { @@ -102,20 +76,20 @@ public class Varcs { return var2 instanceof Integer ? (Integer)var2 : -1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(ILjava/lang/String;B)V", - garbageValue = "-65" + signature = "(ILjava/lang/String;I)V", + garbageValue = "-1237376058" ) @Export("setString") void setString(int var1, String var2) { this.map.put(var1, var2); } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(IB)Ljava/lang/String;", - garbageValue = "-74" + signature = "(II)Ljava/lang/String;", + garbageValue = "-1479997522" ) @Export("getString") String getString(int var1) { @@ -123,30 +97,30 @@ public class Varcs { return var2 instanceof String ? (String)var2 : ""; } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(ILjava/lang/String;I)V", - garbageValue = "2089409644" + signature = "(ILjava/lang/String;B)V", + garbageValue = "64" ) @Export("setStringOld") void setStringOld(int var1, String var2) { this.strings[var1] = var2; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IB)Ljava/lang/String;", - garbageValue = "1" + signature = "(II)Ljava/lang/String;", + garbageValue = "1714600398" ) @Export("getStringOld") String getStringOld(int var1) { return this.strings[var1]; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "29" + signature = "(I)V", + garbageValue = "526123607" ) @Export("clearTransient") void clearTransient() { @@ -163,20 +137,20 @@ public class Varcs { } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(ZI)Lmh;", - garbageValue = "1415923729" + signature = "(ZB)Lmh;", + garbageValue = "1" ) @Export("getPreferencesFile") AccessFile getPreferencesFile(boolean var1) { - return class185.getPreferencesFile("2", class16.field101.name, var1); + return CollisionMap.getPreferencesFile("2", MouseHandler.field458.name, var1); } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-54" + signature = "(I)V", + garbageValue = "2015022450" ) @Export("write") void write() { @@ -196,61 +170,54 @@ public class Varcs { if (var7 instanceof Integer) { var2 += 4; } else if (var7 instanceof String) { - var2 += class268.stringCp1252NullTerminatedByteSize((String)var7); + var2 += UserComparator6.stringCp1252NullTerminatedByteSize((String)var7); } ++var3; } } - Buffer var26 = new Buffer(var2); - var26.writeByte(2); - var26.writeShort(var3); - Iterator var27 = this.map.entrySet().iterator(); + Buffer var23 = new Buffer(var2); + var23.writeByte(2); + var23.writeShort(var3); + Iterator var24 = this.map.entrySet().iterator(); - while (var27.hasNext()) { - Entry var15 = (Entry)var27.next(); - int var16 = (Integer)var15.getKey(); - if (this.intsPersistence[var16]) { - var26.writeShort(var16); - Object var8 = var15.getValue(); - class3 var9 = class3.method33(var8.getClass()); - var26.writeByte(var9.field9); - Class var11 = var8.getClass(); - class3 var12 = class3.method33(var11); - if (var12 == null) { - throw new IllegalArgumentException(); - } - - class0 var10 = var12.field13; - var10.vmethod64(var8, var26); + while (var24.hasNext()) { + Entry var12 = (Entry)var24.next(); + int var13 = (Integer)var12.getKey(); + if (this.intsPersistence[var13]) { + var23.writeShort(var13); + Object var8 = var12.getValue(); + class3 var9 = class3.method51(var8.getClass()); + var23.writeByte(var9.field14); + class3.method52(var8, var23); } } - var1.write(var26.array, 0, var26.offset); - } catch (Exception var24) { + var1.write(var23.array, 0, var23.offset); + } catch (Exception var21) { } finally { try { var1.close(); - } catch (Exception var23) { + } catch (Exception var20) { } } this.unwrittenChanges = false; - this.field1253 = class30.currentTimeMillis(); + this.field1246 = PlayerAppearance.currentTimeMillis(); } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-71" + garbageValue = "37" ) @Export("read") void read() { AccessFile var1 = this.getPreferencesFile(false); - label227: { + label225: { try { byte[] var2 = new byte[(int)var1.length()]; @@ -262,67 +229,68 @@ public class Varcs { } } - Buffer var14 = new Buffer(var2); - if (var14.array.length - var14.offset < 1) { + Buffer var15 = new Buffer(var2); + if (var15.array.length - var15.offset < 1) { return; } - int var15 = var14.readUnsignedByte(); - if (var15 >= 0 && var15 <= 2) { + int var16 = var15.readUnsignedByte(); + if (var16 >= 0 && var16 <= 2) { int var7; int var8; int var9; - int var16; - if (var15 >= 2) { - var16 = var14.readUnsignedShort(); + int var17; + if (var16 >= 2) { + var17 = var15.readUnsignedShort(); var7 = 0; while (true) { - if (var7 >= var16) { - break label227; + if (var7 >= var17) { + break label225; } - var8 = var14.readUnsignedShort(); - var9 = var14.readUnsignedByte(); - class3 var10 = (class3)NetSocket.findEnumerated(class3.method41(), var9); - Object var11 = var10.method35(var14); + var8 = var15.readUnsignedShort(); + var9 = var15.readUnsignedByte(); + class3[] var10 = new class3[]{class3.field13, class3.field18, class3.field17}; + class3 var11 = (class3)WorldMapIcon_1.findEnumerated(var10, var9); + Object var12 = var11.method55(var15); if (this.intsPersistence[var8]) { - this.map.put(var8, var11); + this.map.put(var8, var12); } ++var7; } } else { - var16 = var14.readUnsignedShort(); + var17 = var15.readUnsignedShort(); - for (var7 = 0; var7 < var16; ++var7) { - var8 = var14.readUnsignedShort(); - var9 = var14.readInt(); + for (var7 = 0; var7 < var17; ++var7) { + var8 = var15.readUnsignedShort(); + var9 = var15.readInt(); if (this.intsPersistence[var8]) { this.map.put(var8, var9); } } - var7 = var14.readUnsignedShort(); + var7 = var15.readUnsignedShort(); var8 = 0; while (true) { if (var8 >= var7) { - break label227; + break label225; } - var14.readUnsignedShort(); - var14.readStringCp1252NullTerminated(); + var15.readUnsignedShort(); + var15.readStringCp1252NullTerminated(); ++var8; } } } - } catch (Exception var25) { - break label227; + } catch (Exception var26) { + break label225; } finally { try { var1.close(); - } catch (Exception var24) { + } catch (Exception var25) { } } @@ -333,26 +301,47 @@ public class Varcs { this.unwrittenChanges = false; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-71" + signature = "(I)V", + garbageValue = "-53918442" ) @Export("tryWrite") void tryWrite() { - if (this.unwrittenChanges && this.field1253 < class30.currentTimeMillis() - 60000L) { + if (this.unwrittenChanges && this.field1246 < PlayerAppearance.currentTimeMillis() - 60000L) { this.write(); } } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-1985614095" + signature = "(B)Z", + garbageValue = "4" ) @Export("hasUnwrittenChanges") boolean hasUnwrittenChanges() { return this.unwrittenChanges; } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(II)Liu;", + garbageValue = "-1999284157" + ) + public static VarpDefinition method2352(int var0) { + VarpDefinition var1 = (VarpDefinition)VarpDefinition.VarpDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = VarpDefinition.VarpDefinition_archive.takeFile(16, var0); + var1 = new VarpDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + + VarpDefinition.VarpDefinition_cached.put(var1, (long)var0); + return var1; + } + } } diff --git a/runescape-client/src/main/java/VarpDefinition.java b/runescape-client/src/main/java/VarpDefinition.java index aa26531e67..84fb8b60fe 100644 --- a/runescape-client/src/main/java/VarpDefinition.java +++ b/runescape-client/src/main/java/VarpDefinition.java @@ -3,32 +3,31 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("iq") +@ObfuscatedName("iu") @Implements("VarpDefinition") public class VarpDefinition extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("VarpDefinition_archive") - public static AbstractArchive VarpDefinition_archive; - @ObfuscatedName("n") + static AbstractArchive VarpDefinition_archive; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1786777659 + intValue = -444432513 ) @Export("VarpDefinition_fileCount") public static int VarpDefinition_fileCount; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("VarpDefinition_cached") static EvictingDualNodeHashTable VarpDefinition_cached; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 223624365 + intValue = 1197454389 ) @Export("type") public int type; @@ -43,8 +42,8 @@ public class VarpDefinition extends DualNode { @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "769888015" + signature = "(Lkc;B)V", + garbageValue = "-86" ) @Export("decode") void decode(Buffer var1) { @@ -58,10 +57,10 @@ public class VarpDefinition extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "217607439" + signature = "(Lkc;II)V", + garbageValue = "735169328" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { @@ -70,30 +69,4 @@ public class VarpDefinition extends DualNode { } } - - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1744608160" - ) - static int method4347(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - if (var0 == ScriptOpcodes.CC_GETINVOBJECT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemId; - return 1; - } else if (var0 == ScriptOpcodes.CC_GETINVCOUNT) { - if (var3.itemId != -1) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemQuantity; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_GETID) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.childIndex; - return 1; - } else { - return 2; - } - } } diff --git a/runescape-client/src/main/java/Varps.java b/runescape-client/src/main/java/Varps.java index f9b7f62afc..7c00a03e1b 100644 --- a/runescape-client/src/main/java/Varps.java +++ b/runescape-client/src/main/java/Varps.java @@ -1,24 +1,17 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hl") +@ObfuscatedName("hj") @Implements("Varps") public class Varps { - @ObfuscatedName("pb") - @ObfuscatedSignature( - signature = "Ljk;" - ) - @Export("clanChat") - static ClanChat clanChat; - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("Varps_masks") static int[] Varps_masks; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("Varps_temp") public static int[] Varps_temp; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("Varps_main") public static int[] Varps_main; diff --git a/runescape-client/src/main/java/VertexNormal.java b/runescape-client/src/main/java/VertexNormal.java index 55067059b0..ce68ee5452 100644 --- a/runescape-client/src/main/java/VertexNormal.java +++ b/runescape-client/src/main/java/VertexNormal.java @@ -1,47 +1,45 @@ +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("dp") +@ObfuscatedName("de") @Implements("VertexNormal") public class VertexNormal { - @ObfuscatedName("bd") - @ObfuscatedSignature( - signature = "Lhs;" - ) - static ServerBuild field1726; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 511779629 - ) - @Export("magnitude") - int magnitude; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = 162355823 + intValue = 300716537 ) @Export("x") int x; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 669484941 + intValue = -888954877 ) @Export("y") int y; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1691554905 + intValue = -284116179 ) @Export("z") int z; + @ObfuscatedName("q") + @ObfuscatedGetter( + intValue = -1281469655 + ) + @Export("magnitude") + int magnitude; VertexNormal() { } @ObfuscatedSignature( - signature = "(Ldp;)V" + signature = "(Lde;)V" ) VertexNormal(VertexNormal var1) { this.x = var1.x; @@ -50,85 +48,191 @@ public class VertexNormal { this.magnitude = var1.magnitude; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;I)Ljava/lang/String;", - garbageValue = "-1499927610" + signature = "(Ljava/lang/String;Ljava/lang/String;II)Ljava/io/File;", + garbageValue = "43195180" ) - public static String method2961(CharSequence var0) { - long var3 = 0L; - int var5 = var0.length(); + @Export("getCacheDir") + static File getCacheDir(String var0, String var1, int var2) { + String var3 = var2 == 0 ? "" : "" + var2; + SecureRandomCallable.JagexCache_locationFile = new File(class30.userHomeDirectory, "jagex_cl_" + var0 + "_" + var1 + var3 + ".dat"); + String var4 = null; + String var5 = null; + boolean var6 = false; + Buffer var8; + int var11; + File var27; + if (SecureRandomCallable.JagexCache_locationFile.exists()) { + try { + AccessFile var7 = new AccessFile(SecureRandomCallable.JagexCache_locationFile, "rw", 10000L); - for (int var6 = 0; var6 < var5; ++var6) { - var3 *= 37L; - char var7 = var0.charAt(var6); - if (var7 >= 'A' && var7 <= 'Z') { - var3 += (long)(var7 + 1 - 65); - } else if (var7 >= 'a' && var7 <= 'z') { - var3 += (long)(var7 + 1 - 97); - } else if (var7 >= '0' && var7 <= '9') { - var3 += (long)(var7 + 27 - 48); + int var9; + for (var8 = new Buffer((int)var7.length()); var8.offset < var8.array.length; var8.offset += var9) { + var9 = var7.read(var8.array, var8.offset, var8.array.length - var8.offset); + if (var9 == -1) { + throw new IOException(); + } + } + + var8.offset = 0; + var9 = var8.readUnsignedByte(); + if (var9 < 1 || var9 > 3) { + throw new IOException("" + var9); + } + + int var10 = 0; + if (var9 > 1) { + var10 = var8.readUnsignedByte(); + } + + if (var9 <= 2) { + var4 = var8.readStringCp1252NullCircumfixed(); + if (var10 == 1) { + var5 = var8.readStringCp1252NullCircumfixed(); + } + } else { + var4 = var8.readCESU8(); + if (var10 == 1) { + var5 = var8.readCESU8(); + } + } + + var7.close(); + } catch (IOException var25) { + var25.printStackTrace(); } - if (var3 >= 177917621779460413L) { - break; + if (var4 != null) { + var27 = new File(var4); + if (!var27.exists()) { + var4 = null; + } + } + + if (var4 != null) { + var27 = new File(var4, "test.dat"); + + boolean var28; + try { + RandomAccessFile var15 = new RandomAccessFile(var27, "rw"); + var11 = var15.read(); + var15.seek(0L); + var15.write(var11); + var15.seek(0L); + var15.close(); + var27.delete(); + var28 = true; + } catch (Exception var23) { + var28 = false; + } + + if (!var28) { + var4 = null; + } } } - while (var3 % 37L == 0L && 0L != var3) { - var3 /= 37L; + if (var4 == null && var2 == 0) { + label155: + for (int var16 = 0; var16 < class312.field3803.length; ++var16) { + for (int var17 = 0; var17 < BoundaryObject.field1859.length; ++var17) { + File var18 = new File(BoundaryObject.field1859[var17] + class312.field3803[var16] + File.separatorChar + var0 + File.separatorChar); + if (var18.exists()) { + File var19 = new File(var18, "test.dat"); + + boolean var29; + try { + RandomAccessFile var12 = new RandomAccessFile(var19, "rw"); + int var13 = var12.read(); + var12.seek(0L); + var12.write(var13); + var12.seek(0L); + var12.close(); + var19.delete(); + var29 = true; + } catch (Exception var22) { + var29 = false; + } + + if (var29) { + var4 = var18.toString(); + var6 = true; + break label155; + } + } + } + } } - String var8 = World.base37DecodeLong(var3); - if (var8 == null) { - var8 = ""; + if (var4 == null) { + var4 = class30.userHomeDirectory + File.separatorChar + "jagexcache" + var3 + File.separatorChar + var0 + File.separatorChar + var1 + File.separatorChar; + var6 = true; } - return var8; - } + File var26; + if (var5 != null) { + var26 = new File(var5); + var27 = new File(var4); - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1992175982" - ) - public static void method2960() { - class49.midiPcmStream.clear(); - class197.field2386 = 1; - class197.musicTrackArchive = null; - } + try { + File[] var33 = var26.listFiles(); + File[] var31 = var33; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "11" - ) - public static void method2959() { - synchronized(MouseHandler.MouseHandler_instance) { - MouseHandler.MouseHandler_currentButton = MouseHandler.MouseHandler_currentButtonVolatile; - MouseHandler.MouseHandler_x = MouseHandler.MouseHandler_xVolatile; - MouseHandler.MouseHandler_y = MouseHandler.MouseHandler_yVolatile; - MouseHandler.MouseHandler_millis = MouseHandler.MouseHandler_lastMovedVolatile; - MouseHandler.MouseHandler_lastButton = MouseHandler.MouseHandler_lastButtonVolatile; - MouseHandler.MouseHandler_lastPressedX = MouseHandler.MouseHandler_lastPressedXVolatile; - MouseHandler.MouseHandler_lastPressedY = MouseHandler.MouseHandler_lastPressedYVolatile; - MouseHandler.MouseHandler_lastPressedTimeMillis = MouseHandler.MouseHandler_lastPressedTimeMillisVolatile; - MouseHandler.MouseHandler_lastButtonVolatile = 0; + for (var11 = 0; var11 < var31.length; ++var11) { + File var30 = var31[var11]; + File var20 = new File(var27, var30.getName()); + boolean var14 = var30.renameTo(var20); + if (!var14) { + throw new IOException(); + } + } + } catch (Exception var24) { + var24.printStackTrace(); + } + + var6 = true; } + + if (var6) { + var26 = new File(var4); + var8 = null; + + try { + AccessFile var34 = new AccessFile(SecureRandomCallable.JagexCache_locationFile, "rw", 10000L); + Buffer var32 = new Buffer(500); + var32.writeByte(3); + var32.writeByte(var8 != null ? 1 : 0); + var32.writeCESU8(var26.getPath()); + if (var8 != null) { + var32.writeCESU8(""); + } + + var34.write(var32.array, 0, var32.offset); + var34.close(); + } catch (IOException var21) { + var21.printStackTrace(); + } + } + + return new File(var4); } - @ObfuscatedName("i") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Lhp;IIS)Z", - garbageValue = "18259" + signature = "(Lhq;II)Llw;", + garbageValue = "-1257586004" ) - static boolean method2962(AbstractArchive var0, int var1, int var2) { - byte[] var3 = var0.takeFile(var1, var2); + public static IndexedSprite method3121(AbstractArchive var0, int var1) { + byte[] var3 = var0.takeFileFlat(var1); + boolean var2; if (var3 == null) { - return false; + var2 = false; } else { - Tiles.SpriteBuffer_decode(var3); - return true; + Message.SpriteBuffer_decode(var3); + var2 = true; } + + return !var2 ? null : class51.method975(); } } diff --git a/runescape-client/src/main/java/VerticalAlignment.java b/runescape-client/src/main/java/VerticalAlignment.java index da316ca13a..7f2b04cc15 100644 --- a/runescape-client/src/main/java/VerticalAlignment.java +++ b/runescape-client/src/main/java/VerticalAlignment.java @@ -1,43 +1,45 @@ +import java.io.IOException; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("im") +@ObfuscatedName("ik") @Implements("VerticalAlignment") public enum VerticalAlignment implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lim;" + signature = "Lik;" ) - field3172(0, 0), - @ObfuscatedName("n") + field3182(0, 0), + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lim;" + signature = "Lik;" ) @Export("VerticalAlignment_centered") - VerticalAlignment_centered(2, 1), - @ObfuscatedName("v") + VerticalAlignment_centered(1, 1), + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lim;" + signature = "Lik;" ) - field3170(1, 2); + field3183(2, 2); - @ObfuscatedName("df") - @ObfuscatedGetter( - longValue = 8439577585786440307L + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "Ldl;" ) - static long field3175; - @ObfuscatedName("u") + @Export("soundSystem") + static SoundSystem soundSystem; + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -163994147 + intValue = 190875525 ) @Export("value") public final int value; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1741450623 + intValue = 1999098453 ) @Export("id") final int id; @@ -47,26 +49,86 @@ public enum VerticalAlignment implements Enumerated { this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("ko") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lho;I)Ljava/lang/String;", - garbageValue = "-2118508660" + signature = "(Lhx;B)V", + garbageValue = "-60" ) - static String method4321(Widget var0) { - if (class2.method30(class2.getWidgetClickMask(var0)) == 0) { - return null; - } else { - return var0.spellActionName != null && var0.spellActionName.trim().length() != 0 ? var0.spellActionName : null; + public static void method4504(Huffman var0) { + class210.huffman = var0; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Lku;ZI)V", + garbageValue = "-239852992" + ) + public static void method4503(AbstractSocket var0, boolean var1) { + if (NetCache.NetCache_socket != null) { + try { + NetCache.NetCache_socket.close(); + } catch (Exception var6) { + } + + NetCache.NetCache_socket = null; + } + + NetCache.NetCache_socket = var0; + UrlRequester.method3428(var1); + NetCache.NetCache_responseHeaderBuffer.offset = 0; + UserComparator6.NetCache_currentResponse = null; + Frames.NetCache_responseArchiveBuffer = null; + NetCache.field3161 = 0; + + while (true) { + NetFileRequest var2 = (NetFileRequest)NetCache.NetCache_pendingPriorityResponses.first(); + if (var2 == null) { + while (true) { + var2 = (NetFileRequest)NetCache.NetCache_pendingResponses.first(); + if (var2 == null) { + if (NetCache.field3165 != 0) { + try { + Buffer var7 = new Buffer(4); + var7.writeByte(4); + var7.writeByte(NetCache.field3165); + var7.writeShort(0); + NetCache.NetCache_socket.write(var7.array, 0, 4); + } catch (IOException var5) { + try { + NetCache.NetCache_socket.close(); + } catch (Exception var4) { + } + + ++NetCache.NetCache_ioExceptions; + NetCache.NetCache_socket = null; + } + } + + NetCache.NetCache_loadTime = 0; + NetCache.field3149 = PlayerAppearance.currentTimeMillis(); + return; + } + + NetCache.NetCache_pendingWritesQueue.addLast(var2); + NetCache.NetCache_pendingWrites.put(var2, var2.key); + ++NetCache.NetCache_pendingWritesCount; + --NetCache.NetCache_pendingResponsesCount; + } + } + + NetCache.NetCache_pendingPriorityWrites.put(var2, var2.key); + ++NetCache.NetCache_pendingPriorityWritesCount; + --NetCache.NetCache_pendingPriorityResponsesCount; } } } diff --git a/runescape-client/src/main/java/ViewportMouse.java b/runescape-client/src/main/java/ViewportMouse.java index f79e592f46..8d7cee7e80 100644 --- a/runescape-client/src/main/java/ViewportMouse.java +++ b/runescape-client/src/main/java/ViewportMouse.java @@ -4,76 +4,61 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("db") +@ObfuscatedName("dc") @Implements("ViewportMouse") public class ViewportMouse { - @ObfuscatedName("nr") + @ObfuscatedName("rd") @ObfuscatedGetter( - intValue = 69994429 + intValue = -645347533 ) - @Export("widgetDragDuration") - static int widgetDragDuration; - @ObfuscatedName("z") + static int field1713; + @ObfuscatedName("a") @Export("ViewportMouse_isInViewport") - static boolean ViewportMouse_isInViewport; - @ObfuscatedName("n") + public static boolean ViewportMouse_isInViewport; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1421874705 + intValue = -1568349329 ) @Export("ViewportMouse_x") - static int ViewportMouse_x; - @ObfuscatedName("v") + public static int ViewportMouse_x; + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 197980329 + intValue = -1582090041 ) @Export("ViewportMouse_y") - static int ViewportMouse_y; - @ObfuscatedName("u") - @Export("ViewportMouse_false0") - static boolean ViewportMouse_false0; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = 1955374903 - ) - static int field1707; - @ObfuscatedName("p") - @ObfuscatedGetter( - intValue = -386992233 - ) - static int field1708; + public static int ViewportMouse_y; @ObfuscatedName("q") + @Export("ViewportMouse_false0") + public static boolean ViewportMouse_false0; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1018697137 + intValue = 1490381659 ) - static int field1714; - @ObfuscatedName("m") - @Export("Widget_loadedInterfaces") - static boolean[] Widget_loadedInterfaces; - @ObfuscatedName("y") + static int field1717; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -96146427 + intValue = -1887189981 ) static int field1718; - @ObfuscatedName("i") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -737509043 + intValue = 355686719 ) - static int field1711; - @ObfuscatedName("a") + static int field1719; + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 1620511435 + intValue = -1299455817 + ) + static int field1720; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = 702740743 ) @Export("ViewportMouse_entityCount") public static int ViewportMouse_entityCount; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("ViewportMouse_entityTags") public static long[] ViewportMouse_entityTags; - @ObfuscatedName("af") - @Export("client") - @ObfuscatedSignature( - signature = "Lclient;" - ) - static Client client; static { ViewportMouse_isInViewport = false; @@ -84,162 +69,13 @@ public class ViewportMouse { ViewportMouse_entityTags = new long[1000]; } - @ObfuscatedName("gm") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IIIIB)V", - garbageValue = "13" + signature = "(I)V", + garbageValue = "-1115855205" ) - static final void method2954(int var0, int var1, int var2, int var3) { - Client.overheadTextCount = 0; - boolean var4 = false; - int var5 = -1; - int var6 = -1; - int var7 = Players.Players_count; - int[] var8 = Players.Players_indices; - - int var9; - for (var9 = 0; var9 < var7 + Client.npcCount; ++var9) { - Object var10; - if (var9 < var7) { - var10 = Client.players[var8[var9]]; - if (var8[var9] == Client.combatTargetPlayerIndex) { - var4 = true; - var5 = var9; - continue; - } - - if (var10 == class223.localPlayer) { - var6 = var9; - continue; - } - } else { - var10 = Client.npcs[Client.npcIndices[var9 - var7]]; - } - - class312.drawActor2d((Actor)var10, var9, var0, var1, var2, var3); - } - - if (Client.renderSelf && var6 != -1) { - class312.drawActor2d(class223.localPlayer, var6, var0, var1, var2, var3); - } - - if (var4) { - class312.drawActor2d(Client.players[Client.combatTargetPlayerIndex], var5, var0, var1, var2, var3); - } - - for (var9 = 0; var9 < Client.overheadTextCount; ++var9) { - int var19 = Client.overheadTextXs[var9]; - int var11 = Client.overheadTextYs[var9]; - int var12 = Client.overheadTextXOffsets[var9]; - int var13 = Client.overheadTextAscents[var9]; - boolean var14 = true; - - while (var14) { - var14 = false; - - for (int var15 = 0; var15 < var9; ++var15) { - if (var11 + 2 > Client.overheadTextYs[var15] - Client.overheadTextAscents[var15] && var11 - var13 < Client.overheadTextYs[var15] + 2 && var19 - var12 < Client.overheadTextXOffsets[var15] + Client.overheadTextXs[var15] && var19 + var12 > Client.overheadTextXs[var15] - Client.overheadTextXOffsets[var15] && Client.overheadTextYs[var15] - Client.overheadTextAscents[var15] < var11) { - var11 = Client.overheadTextYs[var15] - Client.overheadTextAscents[var15]; - var14 = true; - } - } - } - - Client.viewportTempX = Client.overheadTextXs[var9]; - Client.viewportTempY = Client.overheadTextYs[var9] = var11; - String var20 = Client.overheadText[var9]; - if (Client.chatEffects == 0) { - int var16 = 16776960; - if (Client.overheadTextColors[var9] < 6) { - var16 = Client.field851[Client.overheadTextColors[var9]]; - } - - if (Client.overheadTextColors[var9] == 6) { - var16 = Client.viewportDrawCount % 20 < 10 ? 16711680 : 16776960; - } - - if (Client.overheadTextColors[var9] == 7) { - var16 = Client.viewportDrawCount % 20 < 10 ? 255 : '\uffff'; - } - - if (Client.overheadTextColors[var9] == 8) { - var16 = Client.viewportDrawCount % 20 < 10 ? '뀀' : 8454016; - } - - int var17; - if (Client.overheadTextColors[var9] == 9) { - var17 = 150 - Client.overheadTextCyclesRemaining[var9]; - if (var17 < 50) { - var16 = var17 * 1280 + 16711680; - } else if (var17 < 100) { - var16 = 16776960 - (var17 - 50) * 327680; - } else if (var17 < 150) { - var16 = (var17 - 100) * 5 + 65280; - } - } - - if (Client.overheadTextColors[var9] == 10) { - var17 = 150 - Client.overheadTextCyclesRemaining[var9]; - if (var17 < 50) { - var16 = var17 * 5 + 16711680; - } else if (var17 < 100) { - var16 = 16711935 - (var17 - 50) * 327680; - } else if (var17 < 150) { - var16 = (var17 - 100) * 327680 + 255 - (var17 - 100) * 5; - } - } - - if (Client.overheadTextColors[var9] == 11) { - var17 = 150 - Client.overheadTextCyclesRemaining[var9]; - if (var17 < 50) { - var16 = 16777215 - var17 * 327685; - } else if (var17 < 100) { - var16 = (var17 - 50) * 327685 + 65280; - } else if (var17 < 150) { - var16 = 16777215 - (var17 - 100) * 327680; - } - } - - if (Client.overheadTextEffects[var9] == 0) { - class173.fontBold12.drawCentered(var20, var0 + Client.viewportTempX, Client.viewportTempY + var1, var16, 0); - } - - if (Client.overheadTextEffects[var9] == 1) { - class173.fontBold12.drawCenteredWave(var20, var0 + Client.viewportTempX, Client.viewportTempY + var1, var16, 0, Client.viewportDrawCount); - } - - if (Client.overheadTextEffects[var9] == 2) { - class173.fontBold12.drawCenteredWave2(var20, var0 + Client.viewportTempX, Client.viewportTempY + var1, var16, 0, Client.viewportDrawCount); - } - - if (Client.overheadTextEffects[var9] == 3) { - class173.fontBold12.drawCenteredShake(var20, var0 + Client.viewportTempX, Client.viewportTempY + var1, var16, 0, Client.viewportDrawCount, 150 - Client.overheadTextCyclesRemaining[var9]); - } - - if (Client.overheadTextEffects[var9] == 4) { - var17 = (150 - Client.overheadTextCyclesRemaining[var9]) * (class173.fontBold12.stringWidth(var20) + 100) / 150; - Rasterizer2D.Rasterizer2D_expandClip(var0 + Client.viewportTempX - 50, var1, var0 + Client.viewportTempX + 50, var3 + var1); - class173.fontBold12.draw(var20, var0 + Client.viewportTempX + 50 - var17, Client.viewportTempY + var1, var16, 0); - Rasterizer2D.Rasterizer2D_setClip(var0, var1, var0 + var2, var3 + var1); - } - - if (Client.overheadTextEffects[var9] == 5) { - var17 = 150 - Client.overheadTextCyclesRemaining[var9]; - int var18 = 0; - if (var17 < 25) { - var18 = var17 - 25; - } else if (var17 > 125) { - var18 = var17 - 125; - } - - Rasterizer2D.Rasterizer2D_expandClip(var0, Client.viewportTempY + var1 - class173.fontBold12.ascent - 1, var0 + var2, Client.viewportTempY + var1 + 5); - class173.fontBold12.drawCentered(var20, var0 + Client.viewportTempX, var18 + Client.viewportTempY + var1, var16, 0); - Rasterizer2D.Rasterizer2D_setClip(var0, var1, var0 + var2, var3 + var1); - } - } else { - class173.fontBold12.drawCentered(var20, var0 + Client.viewportTempX, Client.viewportTempY + var1, 16776960, 0); - } - } - + @Export("WorldMapRegion_clearCachedSprites") + static void WorldMapRegion_clearCachedSprites() { + WorldMapRegion.WorldMapRegion_cachedSprites.clear(); } } diff --git a/runescape-client/src/main/java/VorbisCodebook.java b/runescape-client/src/main/java/VorbisCodebook.java index c02bf27928..596d17901f 100644 --- a/runescape-client/src/main/java/VorbisCodebook.java +++ b/runescape-client/src/main/java/VorbisCodebook.java @@ -2,23 +2,23 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("cx") +@ObfuscatedName("ch") @Implements("VorbisCodebook") public class VorbisCodebook { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("dimensions") int dimensions; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("entries") int entries; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("lengthMap") int[] lengthMap; - @ObfuscatedName("u") + @ObfuscatedName("q") int[] field1322; - @ObfuscatedName("r") - float[][] field1325; - @ObfuscatedName("p") + @ObfuscatedName("v") + float[][] field1323; + @ObfuscatedName("l") @Export("keys") int[] keys; @@ -35,7 +35,7 @@ public class VorbisCodebook { var2 = 0; for (var3 = VorbisSample.readBits(5) + 1; var2 < this.entries; ++var3) { - int var4 = VorbisSample.readBits(TileItem.iLog(this.entries - var2)); + int var4 = VorbisSample.readBits(Tiles.iLog(this.entries - var2)); for (var5 = 0; var5 < var4; ++var5) { this.lengthMap[var2++] = var3; @@ -53,7 +53,7 @@ public class VorbisCodebook { } } - this.method2316(); + this.method2492(); var2 = VorbisSample.readBits(4); if (var2 > 0) { float var15 = VorbisSample.float32Unpack(VorbisSample.readBits(32)); @@ -74,7 +74,7 @@ public class VorbisCodebook { this.field1322[var8] = VorbisSample.readBits(var5); } - this.field1325 = new float[this.entries][this.dimensions]; + this.field1323 = new float[this.entries][this.dimensions]; float var9; int var10; int var11; @@ -86,7 +86,7 @@ public class VorbisCodebook { for (var11 = 0; var11 < this.dimensions; ++var11) { int var12 = var8 / var10 % var7; float var13 = (float)this.field1322[var12] * var16 + var15 + var9; - this.field1325[var8][var11] = var13; + this.field1323[var8][var11] = var13; if (var6) { var9 = var13; } @@ -101,7 +101,7 @@ public class VorbisCodebook { for (var11 = 0; var11 < this.dimensions; ++var11) { float var17 = (float)this.field1322[var10] * var16 + var15 + var9; - this.field1325[var8][var11] = var17; + this.field1323[var8][var11] = var17; if (var6) { var9 = var17; } @@ -114,8 +114,8 @@ public class VorbisCodebook { } - @ObfuscatedName("n") - void method2316() { + @ObfuscatedName("t") + void method2492() { int[] var1 = new int[this.entries]; int[] var2 = new int[33]; @@ -208,8 +208,8 @@ public class VorbisCodebook { } - @ObfuscatedName("v") - int method2317() { + @ObfuscatedName("n") + int method2487() { int var1; for (var1 = 0; this.keys[var1] >= 0; var1 = VorbisSample.readBit() != 0 ? this.keys[var1] : var1 + 1) { } @@ -217,18 +217,41 @@ public class VorbisCodebook { return ~this.keys[var1]; } - @ObfuscatedName("u") - float[] method2318() { - return this.field1325[this.method2317()]; + @ObfuscatedName("q") + float[] method2496() { + return this.field1323[this.method2487()]; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("mapType1QuantValues") static int mapType1QuantValues(int var0, int var1) { - int var2; - for (var2 = (int)Math.pow((double)var0, 1.0D / (double)var1) + 1; class30.method563(var2, var1) > var0; --var2) { - } + int var2 = (int)Math.pow((double)var0, 1.0D / (double)var1) + 1; - return var2; + while (true) { + int var4 = var2; + int var5 = var1; + + int var6; + for (var6 = 1; var5 > 1; var5 >>= 1) { + if ((var5 & 1) != 0) { + var6 *= var4; + } + + var4 *= var4; + } + + int var3; + if (var5 == 1) { + var3 = var4 * var6; + } else { + var3 = var6; + } + + if (var3 <= var0) { + return var2; + } + + --var2; + } } } diff --git a/runescape-client/src/main/java/VorbisFloor.java b/runescape-client/src/main/java/VorbisFloor.java index 65bfca987c..1f0a90ef55 100644 --- a/runescape-client/src/main/java/VorbisFloor.java +++ b/runescape-client/src/main/java/VorbisFloor.java @@ -2,43 +2,43 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("dt") +@ObfuscatedName("db") @Implements("VorbisFloor") public class VorbisFloor { - @ObfuscatedName("z") - static final int[] field1371; - @ObfuscatedName("n") + @ObfuscatedName("a") + static final int[] field1372; + @ObfuscatedName("t") @Export("VorbisFloor_decibelStatics") static final float[] VorbisFloor_decibelStatics; - @ObfuscatedName("i") - static int[] field1379; - @ObfuscatedName("c") - static int[] field1380; - @ObfuscatedName("b") - static boolean[] field1381; - @ObfuscatedName("v") - int[] field1376; - @ObfuscatedName("u") + @ObfuscatedName("d") + static int[] field1377; + @ObfuscatedName("m") + static int[] field1376; + @ObfuscatedName("p") + static boolean[] field1379; + @ObfuscatedName("n") + int[] field1370; + @ObfuscatedName("q") @Export("multiplier") int multiplier; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("partitionClassList") int[] partitionClassList; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("classDimensions") int[] classDimensions; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("classSubClasses") int[] classSubClasses; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("classMasterbooks") int[] classMasterbooks; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("subclassBooks") int[][] subclassBooks; static { - field1371 = new int[]{256, 128, 86, 64}; + field1372 = new int[]{256, 128, 86, 64}; VorbisFloor_decibelStatics = new float[]{1.0649863E-7F, 1.1341951E-7F, 1.2079015E-7F, 1.2863978E-7F, 1.369995E-7F, 1.459025E-7F, 1.5538409E-7F, 1.6548181E-7F, 1.7623574E-7F, 1.8768856E-7F, 1.998856E-7F, 2.128753E-7F, 2.2670913E-7F, 2.4144197E-7F, 2.5713223E-7F, 2.7384212E-7F, 2.9163792E-7F, 3.1059022E-7F, 3.307741E-7F, 3.5226967E-7F, 3.7516213E-7F, 3.995423E-7F, 4.255068E-7F, 4.5315863E-7F, 4.8260745E-7F, 5.1397E-7F, 5.4737063E-7F, 5.829419E-7F, 6.208247E-7F, 6.611694E-7F, 7.041359E-7F, 7.4989464E-7F, 7.98627E-7F, 8.505263E-7F, 9.057983E-7F, 9.646621E-7F, 1.0273513E-6F, 1.0941144E-6F, 1.1652161E-6F, 1.2409384E-6F, 1.3215816E-6F, 1.4074654E-6F, 1.4989305E-6F, 1.5963394E-6F, 1.7000785E-6F, 1.8105592E-6F, 1.9282195E-6F, 2.053526E-6F, 2.1869757E-6F, 2.3290977E-6F, 2.4804558E-6F, 2.6416496E-6F, 2.813319E-6F, 2.9961443E-6F, 3.1908505E-6F, 3.39821E-6F, 3.619045E-6F, 3.8542307E-6F, 4.1047006E-6F, 4.371447E-6F, 4.6555283E-6F, 4.958071E-6F, 5.280274E-6F, 5.623416E-6F, 5.988857E-6F, 6.3780467E-6F, 6.7925284E-6F, 7.2339453E-6F, 7.704048E-6F, 8.2047E-6F, 8.737888E-6F, 9.305725E-6F, 9.910464E-6F, 1.0554501E-5F, 1.1240392E-5F, 1.1970856E-5F, 1.2748789E-5F, 1.3577278E-5F, 1.4459606E-5F, 1.5399271E-5F, 1.6400005E-5F, 1.7465769E-5F, 1.8600793E-5F, 1.9809577E-5F, 2.1096914E-5F, 2.2467912E-5F, 2.3928002E-5F, 2.5482977E-5F, 2.7139005E-5F, 2.890265E-5F, 3.078091E-5F, 3.2781227E-5F, 3.4911533E-5F, 3.718028E-5F, 3.9596467E-5F, 4.2169668E-5F, 4.491009E-5F, 4.7828602E-5F, 5.0936775E-5F, 5.424693E-5F, 5.7772202E-5F, 6.152657E-5F, 6.552491E-5F, 6.9783084E-5F, 7.4317984E-5F, 7.914758E-5F, 8.429104E-5F, 8.976875E-5F, 9.560242E-5F, 1.0181521E-4F, 1.0843174E-4F, 1.1547824E-4F, 1.2298267E-4F, 1.3097477E-4F, 1.3948625E-4F, 1.4855085E-4F, 1.5820454E-4F, 1.6848555E-4F, 1.7943469E-4F, 1.9109536E-4F, 2.0351382E-4F, 2.167393E-4F, 2.3082423E-4F, 2.4582449E-4F, 2.6179955E-4F, 2.7881275E-4F, 2.9693157E-4F, 3.1622787E-4F, 3.3677815E-4F, 3.5866388E-4F, 3.8197188E-4F, 4.0679457E-4F, 4.3323037E-4F, 4.613841E-4F, 4.913675E-4F, 5.2329927E-4F, 5.573062E-4F, 5.935231E-4F, 6.320936E-4F, 6.731706E-4F, 7.16917E-4F, 7.635063E-4F, 8.1312325E-4F, 8.6596457E-4F, 9.2223985E-4F, 9.821722E-4F, 0.0010459992F, 0.0011139743F, 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, 0.0019632196F, 0.0020908006F, 0.0022266726F, 0.0023713743F, 0.0025254795F, 0.0026895993F, 0.0028643848F, 0.0030505287F, 0.003248769F, 0.0034598925F, 0.0036847359F, 0.0039241905F, 0.0041792067F, 0.004450795F, 0.004740033F, 0.005048067F, 0.0053761187F, 0.005725489F, 0.0060975635F, 0.0064938175F, 0.0069158226F, 0.0073652514F, 0.007843887F, 0.008353627F, 0.008896492F, 0.009474637F, 0.010090352F, 0.01074608F, 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, 0.014722068F, 0.015678791F, 0.016697686F, 0.017782796F, 0.018938422F, 0.020169148F, 0.021479854F, 0.022875736F, 0.02436233F, 0.025945531F, 0.027631618F, 0.029427277F, 0.031339627F, 0.03337625F, 0.035545226F, 0.037855156F, 0.0403152F, 0.042935107F, 0.045725275F, 0.048696756F, 0.05186135F, 0.05523159F, 0.05882085F, 0.062643364F, 0.06671428F, 0.07104975F, 0.075666964F, 0.08058423F, 0.08582105F, 0.09139818F, 0.097337745F, 0.1036633F, 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, 0.14201812F, 0.15124726F, 0.16107617F, 0.1715438F, 0.18269168F, 0.19456401F, 0.20720787F, 0.22067343F, 0.23501402F, 0.25028655F, 0.26655158F, 0.28387362F, 0.3023213F, 0.32196787F, 0.34289113F, 0.36517414F, 0.3889052F, 0.41417846F, 0.44109413F, 0.4697589F, 0.50028646F, 0.53279793F, 0.5674221F, 0.6042964F, 0.64356697F, 0.6853896F, 0.72993004F, 0.777365F, 0.8278826F, 0.88168305F, 0.9389798F, 1.0F}; } @@ -92,30 +92,30 @@ public class VorbisFloor { var5 += this.classDimensions[this.partitionClassList[var9]]; } - this.field1376 = new int[var5]; - this.field1376[0] = 0; - this.field1376[1] = 1 << var4; + this.field1370 = new int[var5]; + this.field1370[0] = 0; + this.field1370[1] = 1 << var4; var5 = 2; for (var9 = 0; var9 < var2; ++var9) { var7 = this.partitionClassList[var9]; for (int var8 = 0; var8 < this.classDimensions[var7]; ++var8) { - this.field1376[var5++] = VorbisSample.readBits(var4); + this.field1370[var5++] = VorbisSample.readBits(var4); } } - if (field1379 == null || field1379.length < var5) { - field1379 = new int[var5]; - field1380 = new int[var5]; - field1381 = new boolean[var5]; + if (field1377 == null || field1377.length < var5) { + field1377 = new int[var5]; + field1376 = new int[var5]; + field1379 = new boolean[var5]; } } } - @ObfuscatedName("v") - int method2380(int var1, int var2, int var3, int var4, int var5) { + @ObfuscatedName("n") + int method2568(int var1, int var2, int var3, int var4, int var5) { int var6 = var4 - var2; int var7 = var3 - var1; int var8 = var6 < 0 ? -var6 : var6; @@ -124,8 +124,8 @@ public class VorbisFloor { return var6 < 0 ? var2 - var10 : var10 + var2; } - @ObfuscatedName("u") - void method2384(int var1, int var2, int var3, int var4, float[] var5, int var6) { + @ObfuscatedName("q") + void method2561(int var1, int var2, int var3, int var4, float[] var5, int var6) { int var7 = var4 - var2; int var8 = var3 - var1; int var9 = var7 < 0 ? -var7 : var7; @@ -153,54 +153,54 @@ public class VorbisFloor { } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("VarbisFloor_sort") void VarbisFloor_sort(int var1, int var2) { if (var1 < var2) { int var3 = var1; - int var4 = field1379[var1]; - int var5 = field1380[var1]; - boolean var6 = field1381[var1]; + int var4 = field1377[var1]; + int var5 = field1376[var1]; + boolean var6 = field1379[var1]; for (int var7 = var1 + 1; var7 <= var2; ++var7) { - int var8 = field1379[var7]; + int var8 = field1377[var7]; if (var8 < var4) { - field1379[var3] = var8; - field1380[var3] = field1380[var7]; - field1381[var3] = field1381[var7]; + field1377[var3] = var8; + field1376[var3] = field1376[var7]; + field1379[var3] = field1379[var7]; ++var3; + field1377[var7] = field1377[var3]; + field1376[var7] = field1376[var3]; field1379[var7] = field1379[var3]; - field1380[var7] = field1380[var3]; - field1381[var7] = field1381[var3]; } } - field1379[var3] = var4; - field1380[var3] = var5; - field1381[var3] = var6; + field1377[var3] = var4; + field1376[var3] = var5; + field1379[var3] = var6; this.VarbisFloor_sort(var1, var3 - 1); this.VarbisFloor_sort(var3 + 1, var2); } } - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("readSubmapFloor") boolean readSubmapFloor() { boolean var1 = VorbisSample.readBit() != 0; if (!var1) { return false; } else { - int var2 = this.field1376.length; + int var2 = this.field1370.length; int var3; for (var3 = 0; var3 < var2; ++var3) { - field1379[var3] = this.field1376[var3]; + field1377[var3] = this.field1370[var3]; } - var3 = field1371[this.multiplier - 1]; - int var4 = TileItem.iLog(var3 - 1); - field1380[0] = VorbisSample.readBits(var4); - field1380[1] = VorbisSample.readBits(var4); + var3 = field1372[this.multiplier - 1]; + int var4 = Tiles.iLog(var3 - 1); + field1376[0] = VorbisSample.readBits(var4); + field1376[1] = VorbisSample.readBits(var4); int var5 = 2; for (int var6 = 0; var6 < this.partitionClassList.length; ++var6) { @@ -210,13 +210,13 @@ public class VorbisFloor { int var10 = (1 << var9) - 1; int var11 = 0; if (var9 > 0) { - var11 = VorbisSample.VorbisSample_codebooks[this.classMasterbooks[var7]].method2317(); + var11 = VorbisSample.VorbisSample_codebooks[this.classMasterbooks[var7]].method2487(); } for (int var12 = 0; var12 < var8; ++var12) { int var13 = this.subclassBooks[var7][var11 & var10]; var11 >>>= var9; - field1380[var5++] = var13 >= 0 ? VorbisSample.VorbisSample_codebooks[var13].method2317() : 0; + field1376[var5++] = var13 >= 0 ? VorbisSample.VorbisSample_codebooks[var13].method2487() : 0; } } @@ -224,12 +224,12 @@ public class VorbisFloor { } } - @ObfuscatedName("q") - void method2377(float[] var1, int var2) { - int var3 = this.field1376.length; - int var4 = field1371[this.multiplier - 1]; - boolean[] var5 = field1381; - field1381[1] = true; + @ObfuscatedName("c") + void method2564(float[] var1, int var2) { + int var3 = this.field1370.length; + int var4 = field1372[this.multiplier - 1]; + boolean[] var5 = field1379; + field1379[1] = true; var5[0] = true; int var6; @@ -238,37 +238,37 @@ public class VorbisFloor { int var9; int var10; for (var6 = 2; var6 < var3; ++var6) { - var7 = method2383(field1379, var6); - var8 = method2371(field1379, var6); - var9 = this.method2380(field1379[var7], field1380[var7], field1379[var8], field1380[var8], field1379[var6]); - var10 = field1380[var6]; + var7 = method2559(field1377, var6); + var8 = method2575(field1377, var6); + var9 = this.method2568(field1377[var7], field1376[var7], field1377[var8], field1376[var8], field1377[var6]); + var10 = field1376[var6]; int var11 = var4 - var9; int var13 = (var11 < var9 ? var11 : var9) << 1; if (var10 != 0) { - boolean[] var14 = field1381; - field1381[var8] = true; + boolean[] var14 = field1379; + field1379[var8] = true; var14[var7] = true; - field1381[var6] = true; + field1379[var6] = true; if (var10 >= var13) { - field1380[var6] = var11 > var9 ? var9 + (var10 - var9) : var11 + (var9 - var10) - 1; + field1376[var6] = var11 > var9 ? var9 + (var10 - var9) : var11 + (var9 - var10) - 1; } else { - field1380[var6] = (var10 & 1) != 0 ? var9 - (var10 + 1) / 2 : var10 / 2 + var9; + field1376[var6] = (var10 & 1) != 0 ? var9 - (var10 + 1) / 2 : var10 / 2 + var9; } } else { - field1381[var6] = false; - field1380[var6] = var9; + field1379[var6] = false; + field1376[var6] = var9; } } this.VarbisFloor_sort(0, var3 - 1); var6 = 0; - var7 = field1380[0] * this.multiplier; + var7 = field1376[0] * this.multiplier; for (var8 = 1; var8 < var3; ++var8) { - if (field1381[var8]) { - var9 = field1379[var8]; - var10 = field1380[var8] * this.multiplier; - this.method2384(var6, var7, var9, var10, var1, var2); + if (field1379[var8]) { + var9 = field1377[var8]; + var10 = field1376[var8] * this.multiplier; + this.method2561(var6, var7, var9, var10, var1, var2); if (var9 >= var2) { return; } @@ -286,8 +286,8 @@ public class VorbisFloor { } - @ObfuscatedName("z") - static int method2383(int[] var0, int var1) { + @ObfuscatedName("a") + static int method2559(int[] var0, int var1) { int var2 = var0[var1]; int var3 = -1; int var4 = Integer.MIN_VALUE; @@ -303,8 +303,8 @@ public class VorbisFloor { return var3; } - @ObfuscatedName("n") - static int method2371(int[] var0, int var1) { + @ObfuscatedName("t") + static int method2575(int[] var0, int var1) { int var2 = var0[var1]; int var3 = -1; int var4 = Integer.MAX_VALUE; diff --git a/runescape-client/src/main/java/VorbisMapping.java b/runescape-client/src/main/java/VorbisMapping.java index d56bfbc6cf..0f2e901195 100644 --- a/runescape-client/src/main/java/VorbisMapping.java +++ b/runescape-client/src/main/java/VorbisMapping.java @@ -2,19 +2,19 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("di") +@ObfuscatedName("df") @Implements("VorbisMapping") public class VorbisMapping { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("submaps") int submaps; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("mappingMux") int mappingMux; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("submapFloor") int[] submapFloor; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("submapResidue") int[] submapResidue; diff --git a/runescape-client/src/main/java/VorbisResidue.java b/runescape-client/src/main/java/VorbisResidue.java index 1c278f9ceb..1aee490ea2 100644 --- a/runescape-client/src/main/java/VorbisResidue.java +++ b/runescape-client/src/main/java/VorbisResidue.java @@ -2,28 +2,28 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("df") +@ObfuscatedName("dr") @Implements("VorbisResidue") public class VorbisResidue { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("residueType") int residueType; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("begin") int begin; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("end") int end; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("partitionSize") int partitionSize; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("classifications") int classifications; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("classbook") int classbook; - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("cascade") int[] cascade; @@ -56,8 +56,8 @@ public class VorbisResidue { } - @ObfuscatedName("z") - void method2493(float[] var1, int var2, boolean var3) { + @ObfuscatedName("a") + void method2682(float[] var1, int var2, boolean var3) { int var4; for (var4 = 0; var4 < var2; ++var4) { var1[var4] = 0.0F; @@ -76,7 +76,7 @@ public class VorbisResidue { int var10; int var11; if (var8 == 0) { - var10 = VorbisSample.VorbisSample_codebooks[this.classbook].method2317(); + var10 = VorbisSample.VorbisSample_codebooks[this.classbook].method2487(); for (var11 = var4 - 1; var11 >= 0; --var11) { if (var9 + var11 < var6) { @@ -98,7 +98,7 @@ public class VorbisResidue { var15 = this.partitionSize / var14.dimensions; for (int var16 = 0; var16 < var15; ++var16) { - float[] var17 = var14.method2318(); + float[] var17 = var14.method2496(); for (int var18 = 0; var18 < var14.dimensions; ++var18) { var1[var13 + var16 + var18 * var15] += var17[var18]; @@ -108,7 +108,7 @@ public class VorbisResidue { var15 = 0; while (var15 < this.partitionSize) { - float[] var19 = var14.method2318(); + float[] var19 = var14.method2496(); for (int var20 = 0; var20 < var14.dimensions; ++var20) { var1[var13 + var15] += var19[var20]; diff --git a/runescape-client/src/main/java/VorbisSample.java b/runescape-client/src/main/java/VorbisSample.java index 20adb708b0..a7b7813347 100644 --- a/runescape-client/src/main/java/VorbisSample.java +++ b/runescape-client/src/main/java/VorbisSample.java @@ -3,105 +3,105 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cp") +@ObfuscatedName("cf") @Implements("VorbisSample") public class VorbisSample extends Node { - @ObfuscatedName("q") + @ObfuscatedName("c") @Export("VorbisSample_bytes") static byte[] VorbisSample_bytes; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("VorbisSample_byteOffset") static int VorbisSample_byteOffset; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("VorbisSample_bitOffset") static int VorbisSample_bitOffset; - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("VorbisSample_blockSize0") static int VorbisSample_blockSize0; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("VorbisSample_blockSize1") static int VorbisSample_blockSize1; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "[Lcx;" + signature = "[Lch;" ) @Export("VorbisSample_codebooks") static VorbisCodebook[] VorbisSample_codebooks; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "[Ldt;" + signature = "[Ldb;" ) @Export("VorbisSample_floors") static VorbisFloor[] VorbisSample_floors; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "[Ldf;" + signature = "[Ldr;" ) @Export("VorbisSample_residues") static VorbisResidue[] VorbisSample_residues; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "[Ldi;" + signature = "[Ldf;" ) @Export("VorbisSample_mappings") static VorbisMapping[] VorbisSample_mappings; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("VorbisSample_blockFlags") static boolean[] VorbisSample_blockFlags; - @ObfuscatedName("t") + @ObfuscatedName("r") @Export("VorbisSample_mapping") static int[] VorbisSample_mapping; - @ObfuscatedName("g") + @ObfuscatedName("e") static boolean field1348; - @ObfuscatedName("j") + @ObfuscatedName("g") + static float[] field1349; + @ObfuscatedName("w") + static float[] field1345; + @ObfuscatedName("u") static float[] field1353; - @ObfuscatedName("d") - static float[] field1331; - @ObfuscatedName("l") - static float[] field1355; - @ObfuscatedName("k") - static float[] field1339; - @ObfuscatedName("ac") - static float[] field1357; - @ObfuscatedName("az") - static float[] field1362; - @ObfuscatedName("aw") - static float[] field1359; + @ObfuscatedName("y") + static float[] field1354; @ObfuscatedName("aa") - static int[] field1360; - @ObfuscatedName("ap") - static int[] field1361; - @ObfuscatedName("z") - byte[][] field1349; - @ObfuscatedName("n") + static float[] field1355; + @ObfuscatedName("aw") + static float[] field1346; + @ObfuscatedName("ar") + static float[] field1357; + @ObfuscatedName("aq") + static int[] field1337; + @ObfuscatedName("ad") + static int[] field1359; + @ObfuscatedName("a") + byte[][] field1350; + @ObfuscatedName("t") @Export("sampleRate") int sampleRate; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("sampleCount") int sampleCount; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("start") int start; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("end") int end; - @ObfuscatedName("p") - boolean field1340; - @ObfuscatedName("x") - float[] field1333; - @ObfuscatedName("h") - int field1350; + @ObfuscatedName("l") + boolean field1334; @ObfuscatedName("s") - int field1351; + float[] field1347; + @ObfuscatedName("b") + int field1344; + @ObfuscatedName("z") + int field1362; @ObfuscatedName("f") - boolean field1356; - @ObfuscatedName("ar") + boolean field1352; + @ObfuscatedName("ag") @Export("samples") byte[] samples; - @ObfuscatedName("ab") - int field1363; - @ObfuscatedName("ax") - int field1343; + @ObfuscatedName("ak") + int field1329; + @ObfuscatedName("av") + int field1360; static { field1348 = false; @@ -111,7 +111,7 @@ public class VorbisSample extends Node { this.read(var1); } - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("read") void read(byte[] var1) { Buffer var2 = new Buffer(var1); @@ -121,11 +121,11 @@ public class VorbisSample extends Node { this.end = var2.readInt(); if (this.end < 0) { this.end = ~this.end; - this.field1340 = true; + this.field1334 = true; } int var3 = var2.readInt(); - this.field1349 = new byte[var3][]; + this.field1350 = new byte[var3][]; for (int var4 = 0; var4 < var3; ++var4) { int var5 = 0; @@ -138,16 +138,16 @@ public class VorbisSample extends Node { byte[] var7 = new byte[var5]; var2.readBytes(var7, 0, var5); - this.field1349[var4] = var7; + this.field1350[var4] = var7; } } - @ObfuscatedName("q") - float[] method2344(int var1) { - VorbisSample_setData(this.field1349[var1], 0); + @ObfuscatedName("c") + float[] method2521(int var1) { + VorbisSample_setData(this.field1350[var1], 0); readBit(); - int var2 = readBits(TileItem.iLog(VorbisSample_mapping.length - 1)); + int var2 = readBits(Tiles.iLog(VorbisSample_mapping.length - 1)); boolean var3 = VorbisSample_blockFlags[var2]; int var4 = var3 ? VorbisSample_blockSize1 : VorbisSample_blockSize0; boolean var5 = false; @@ -192,27 +192,27 @@ public class VorbisSample extends Node { for (var17 = 0; var17 < var14.submaps; ++var17) { VorbisResidue var18 = VorbisSample_residues[var14.submapResidue[var17]]; - float[] var19 = field1353; - var18.method2493(var19, var4 >> 1, var45); + float[] var19 = field1349; + var18.method2682(var19, var4 >> 1, var45); } int var40; if (!var15) { var17 = var14.mappingMux; var40 = var14.submapFloor[var17]; - VorbisSample_floors[var40].method2377(field1353, var4 >> 1); + VorbisSample_floors[var40].method2564(field1349, var4 >> 1); } int var42; if (var15) { for (var17 = var4 >> 1; var17 < var4; ++var17) { - field1353[var17] = 0.0F; + field1349[var17] = 0.0F; } } else { var17 = var4 >> 1; var40 = var4 >> 2; var42 = var4 >> 3; - float[] var43 = field1353; + float[] var43 = field1349; int var21; for (var21 = 0; var21 < var17; ++var21) { @@ -223,10 +223,10 @@ public class VorbisSample extends Node { var43[var21] = -var43[var4 - var21 - 1]; } - float[] var44 = var3 ? field1357 : field1331; - float[] var22 = var3 ? field1362 : field1355; - float[] var23 = var3 ? field1359 : field1339; - int[] var24 = var3 ? field1361 : field1360; + float[] var44 = var3 ? field1355 : field1345; + float[] var22 = var3 ? field1346 : field1353; + float[] var23 = var3 ? field1357 : field1354; + int[] var24 = var3 ? field1359 : field1337; int var25; float var26; @@ -257,7 +257,7 @@ public class VorbisSample extends Node { var43[var25 * 4 + 1] = (var27 - var29) * var30 + (var26 - var28) * var31; } - var25 = TileItem.iLog(var4 - 1); + var25 = Tiles.iLog(var4 - 1); int var47; int var48; @@ -357,49 +357,49 @@ public class VorbisSample extends Node { float[] var10000; for (var47 = var8; var47 < var9; ++var47) { var27 = (float)Math.sin(((double)(var47 - var8) + 0.5D) / (double)var10 * 0.5D * 3.141592653589793D); - var10000 = field1353; + var10000 = field1349; var10000[var47] *= (float)Math.sin(1.5707963267948966D * (double)var27 * (double)var27); } for (var47 = var11; var47 < var12; ++var47) { var27 = (float)Math.sin(((double)(var47 - var11) + 0.5D) / (double)var13 * 0.5D * 3.141592653589793D + 1.5707963267948966D); - var10000 = field1353; + var10000 = field1349; var10000[var47] *= (float)Math.sin(1.5707963267948966D * (double)var27 * (double)var27); } } float[] var41 = null; - if (this.field1350 > 0) { - var40 = var4 + this.field1350 >> 2; + if (this.field1344 > 0) { + var40 = var4 + this.field1344 >> 2; var41 = new float[var40]; int var20; - if (!this.field1356) { - for (var42 = 0; var42 < this.field1351; ++var42) { - var20 = var42 + (this.field1350 >> 1); - var41[var42] += this.field1333[var20]; + if (!this.field1352) { + for (var42 = 0; var42 < this.field1362; ++var42) { + var20 = var42 + (this.field1344 >> 1); + var41[var42] += this.field1347[var20]; } } if (!var15) { for (var42 = var8; var42 < var4 >> 1; ++var42) { var20 = var41.length - (var4 >> 1) + var42; - var41[var20] += field1353[var42]; + var41[var20] += field1349[var42]; } } } - float[] var46 = this.field1333; - this.field1333 = field1353; - field1353 = var46; - this.field1350 = var4; - this.field1351 = var12 - (var4 >> 1); - this.field1356 = var15; + float[] var46 = this.field1347; + this.field1347 = field1349; + field1349 = var46; + this.field1344 = var4; + this.field1362 = var12 - (var4 >> 1); + this.field1352 = var15; return var41; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "([I)Lch;" + signature = "([I)Lca;" ) @Export("toRawSound") RawSound toRawSound(int[] var1) { @@ -407,21 +407,21 @@ public class VorbisSample extends Node { return null; } else { if (this.samples == null) { - this.field1350 = 0; - this.field1333 = new float[VorbisSample_blockSize1]; + this.field1344 = 0; + this.field1347 = new float[VorbisSample_blockSize1]; this.samples = new byte[this.sampleCount]; - this.field1363 = 0; - this.field1343 = 0; + this.field1329 = 0; + this.field1360 = 0; } - for (; this.field1343 < this.field1349.length; ++this.field1343) { + for (; this.field1360 < this.field1350.length; ++this.field1360) { if (var1 != null && var1[0] <= 0) { return null; } - float[] var2 = this.method2344(this.field1343); + float[] var2 = this.method2521(this.field1360); if (var2 != null) { - int var3 = this.field1363; + int var3 = this.field1329; int var4 = var2.length; if (var4 > this.sampleCount - var3) { var4 = this.sampleCount - var3; @@ -437,21 +437,21 @@ public class VorbisSample extends Node { } if (var1 != null) { - var1[0] -= var3 - this.field1363; + var1[0] -= var3 - this.field1329; } - this.field1363 = var3; + this.field1329 = var3; } } - this.field1333 = null; + this.field1347 = null; byte[] var7 = this.samples; this.samples = null; - return new RawSound(this.sampleRate, var7, this.start, this.end, this.field1340); + return new RawSound(this.sampleRate, var7, this.start, this.end, this.field1334); } } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("float32Unpack") static float float32Unpack(int var0) { int var1 = var0 & 2097151; @@ -464,7 +464,7 @@ public class VorbisSample extends Node { return (float)((double)var1 * Math.pow(2.0D, (double)(var3 - 788))); } - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("VorbisSample_setData") static void VorbisSample_setData(byte[] var0, int var1) { VorbisSample_bytes = var0; @@ -472,7 +472,7 @@ public class VorbisSample extends Node { VorbisSample_bitOffset = 0; } - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("readBit") static int readBit() { int var0 = VorbisSample_bytes[VorbisSample_byteOffset] >> VorbisSample_bitOffset & 1; @@ -482,7 +482,7 @@ public class VorbisSample extends Node { return var0; } - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("readBits") static int readBits(int var0) { int var1 = 0; @@ -507,12 +507,12 @@ public class VorbisSample extends Node { return var1; } - @ObfuscatedName("p") - static void method2343(byte[] var0) { + @ObfuscatedName("l") + static void method2520(byte[] var0) { VorbisSample_setData(var0, 0); VorbisSample_blockSize0 = 1 << readBits(4); VorbisSample_blockSize1 = 1 << readBits(4); - field1353 = new float[VorbisSample_blockSize1]; + field1349 = new float[VorbisSample_blockSize1]; int var1; int var2; @@ -531,46 +531,37 @@ public class VorbisSample extends Node { var6[var7 * 2 + 1] = -((float)Math.sin((double)(var7 * 4) * 3.141592653589793D / (double)var2)); } - float[] var18 = new float[var3]; + float[] var12 = new float[var3]; for (int var8 = 0; var8 < var4; ++var8) { - var18[var8 * 2] = (float)Math.cos((double)(var8 * 2 + 1) * 3.141592653589793D / (double)(var2 * 2)); - var18[var8 * 2 + 1] = (float)Math.sin((double)(var8 * 2 + 1) * 3.141592653589793D / (double)(var2 * 2)); + var12[var8 * 2] = (float)Math.cos((double)(var8 * 2 + 1) * 3.141592653589793D / (double)(var2 * 2)); + var12[var8 * 2 + 1] = (float)Math.sin((double)(var8 * 2 + 1) * 3.141592653589793D / (double)(var2 * 2)); } - float[] var19 = new float[var4]; + float[] var13 = new float[var4]; for (int var9 = 0; var9 < var5; ++var9) { - var19[var9 * 2] = (float)Math.cos((double)(var9 * 4 + 2) * 3.141592653589793D / (double)var2); - var19[var9 * 2 + 1] = -((float)Math.sin((double)(var9 * 4 + 2) * 3.141592653589793D / (double)var2)); + var13[var9 * 2] = (float)Math.cos((double)(var9 * 4 + 2) * 3.141592653589793D / (double)var2); + var13[var9 * 2 + 1] = -((float)Math.sin((double)(var9 * 4 + 2) * 3.141592653589793D / (double)var2)); } - int[] var20 = new int[var5]; - int var10 = TileItem.iLog(var5 - 1); + int[] var14 = new int[var5]; + int var10 = Tiles.iLog(var5 - 1); for (int var11 = 0; var11 < var5; ++var11) { - int var15 = var11; - int var16 = var10; - - int var17; - for (var17 = 0; var16 > 0; --var16) { - var17 = var17 << 1 | var15 & 1; - var15 >>>= 1; - } - - var20[var11] = var17; + var14[var11] = UserComparator3.method3565(var11, var10); } if (var1 != 0) { - field1357 = var6; - field1362 = var18; - field1359 = var19; - field1361 = var20; + field1355 = var6; + field1346 = var12; + field1357 = var13; + field1359 = var14; } else { - field1331 = var6; - field1355 = var18; - field1339 = var19; - field1360 = var20; + field1345 = var6; + field1353 = var12; + field1354 = var13; + field1337 = var14; } } @@ -612,40 +603,40 @@ public class VorbisSample extends Node { VorbisSample_blockFlags = new boolean[var5]; VorbisSample_mapping = new int[var5]; - for (int var21 = 0; var21 < var5; ++var21) { - VorbisSample_blockFlags[var21] = readBit() != 0; + for (int var15 = 0; var15 < var5; ++var15) { + VorbisSample_blockFlags[var15] = readBit() != 0; readBits(16); readBits(16); - VorbisSample_mapping[var21] = readBits(8); + VorbisSample_mapping[var15] = readBits(8); } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(Lhp;)Z" + signature = "(Lhq;)Z" ) - static boolean method2345(AbstractArchive var0) { + static boolean method2523(AbstractArchive var0) { if (!field1348) { byte[] var1 = var0.takeFile(0, 0); if (var1 == null) { return false; } - method2343(var1); + method2520(var1); field1348 = true; } return true; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(Lhp;II)Lcp;" + signature = "(Lhq;II)Lcf;" ) @Export("readMusicSample") static VorbisSample readMusicSample(AbstractArchive var0, int var1, int var2) { - if (!method2345(var0)) { + if (!method2523(var0)) { var0.tryLoadFile(var1, var2); return null; } else { diff --git a/runescape-client/src/main/java/WallDecoration.java b/runescape-client/src/main/java/WallDecoration.java index 609abc00a0..c4daf66798 100644 --- a/runescape-client/src/main/java/WallDecoration.java +++ b/runescape-client/src/main/java/WallDecoration.java @@ -4,78 +4,72 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("eg") +@ObfuscatedName("ei") @Implements("WallDecoration") public final class WallDecoration { - @ObfuscatedName("l") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -1573146665 - ) - @Export("canvasHeight") - public static int canvasHeight; - @ObfuscatedName("z") - @ObfuscatedGetter( - intValue = 500861795 - ) - @Export("orientation") - int orientation; - @ObfuscatedName("n") - @ObfuscatedGetter( - intValue = 1324796191 + intValue = 423851547 ) @Export("tileHeight") int tileHeight; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1787906731 + intValue = -1677824649 ) @Export("x") int x; - @ObfuscatedName("u") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -337099317 + intValue = -538039303 ) @Export("y") int y; - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1549979331 + intValue = 1526818253 + ) + @Export("orientation") + int orientation; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = -53860035 ) @Export("orientation2") int orientation2; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 43570649 + intValue = 1526698757 ) @Export("xOffset") int xOffset; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -396532533 + intValue = 578545777 ) @Export("yOffset") int yOffset; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Ler;" + signature = "Lep;" ) @Export("entity1") public Entity entity1; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Ler;" + signature = "Lep;" ) @Export("entity2") public Entity entity2; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - longValue = 463073903231293703L + longValue = 6449837147219780293L ) @Export("tag") public long tag; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 14602599 + intValue = -972053307 ) @Export("flags") int flags; @@ -85,41 +79,479 @@ public final class WallDecoration { this.flags = 0; } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)Lif;", - garbageValue = "-746198187" + signature = "(CI)Z", + garbageValue = "-1053109132" ) - @Export("getParamDefinition") - public static ParamDefinition getParamDefinition(int var0) { - ParamDefinition var1 = (ParamDefinition)ParamDefinition.ParamDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; + public static final boolean method3420(char var0) { + if (Character.isISOControl(var0)) { + return false; + } else if (UserComparator8.isAlphaNumeric(var0)) { + return true; } else { - byte[] var2 = ParamDefinition.ParamDefinition_archive.takeFile(11, var0); - var1 = new ParamDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); + char[] var1 = class338.field4036; + + int var2; + char var3; + for (var2 = 0; var2 < var1.length; ++var2) { + var3 = var1[var2]; + if (var0 == var3) { + return true; + } } - var1.postDecode(); - ParamDefinition.ParamDefinition_cached.put(var1, (long)var0); - return var1; + var1 = class338.field4038; + + for (var2 = 0; var2 < var1.length; ++var2) { + var3 = var1[var2]; + if (var0 == var3) { + return true; + } + } + + return false; } } - @ObfuscatedName("fz") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1910753346" + signature = "(IIB)Lbt;", + garbageValue = "-95" ) - static final void method3255() { - for (int var0 = 0; var0 < Client.npcCount; ++var0) { - int var1 = Client.npcIndices[var0]; - NPC var2 = Client.npcs[var1]; - if (var2 != null) { - class325.calculateActorPosition(var2, var2.definition.size); + @Export("Messages_getByChannelAndID") + static Message Messages_getByChannelAndID(int var0, int var1) { + ChatChannel var2 = (ChatChannel)Messages.Messages_channels.get(var0); + return var2.getMessage(var1); + } + + @ObfuscatedName("gp") + @ObfuscatedSignature( + signature = "(I)I", + garbageValue = "-441211068" + ) + @Export("getWindowedMode") + static int getWindowedMode() { + return Client.isResizable ? 2 : 1; + } + + @ObfuscatedName("gz") + @ObfuscatedSignature( + signature = "(IIIII)V", + garbageValue = "-1171525777" + ) + @Export("drawEntities") + static final void drawEntities(int var0, int var1, int var2, int var3) { + ++Client.viewportDrawCount; + Frames.method3397(); + class227.method4276(); + VarcInt.method4548(); + class40.addNpcsToScene(true); + WorldMapSprite.method473(); + class40.addNpcsToScene(false); + MouseHandler.method1172(); + FontName.method5442(); + Calendar.setViewportShape(var0, var1, var2, var3, true); + var0 = Client.viewportOffsetX; + var1 = Client.viewportOffsetY; + var2 = Client.viewportWidth; + var3 = Client.viewportHeight; + Rasterizer2D.Rasterizer2D_setClip(var0, var1, var0 + var2, var3 + var1); + Rasterizer3D.Rasterizer3D_setClipFromRasterizer2D(); + int var4; + int var5; + if (!Client.isCameraLocked) { + var4 = Client.camAngleX; + if (Client.field717 / 256 > var4) { + var4 = Client.field717 / 256; } + + if (Client.field641[4] && Client.field795[4] + 128 > var4) { + var4 = Client.field795[4] + 128; + } + + var5 = Client.camAngleY & 2047; + GrandExchangeOfferNameComparator.method183(IgnoreList.oculusOrbFocalPointX, Tiles.field497, AbstractArchive.oculusOrbFocalPointY, var4, var5, WorldMapSection0.method285(var4), var3); + } + + int var6; + int var7; + int var8; + int var9; + int var10; + int var11; + int var12; + int var13; + int var14; + if (!Client.isCameraLocked) { + if (ScriptEvent.clientPreferences.roofsHidden) { + var5 = Player.Scene_plane; + } else { + label525: { + var6 = 3; + if (class247.cameraPitch < 310) { + if (Client.oculusOrbState == 1) { + var7 = IgnoreList.oculusOrbFocalPointX >> 7; + var8 = AbstractArchive.oculusOrbFocalPointY >> 7; + } else { + var7 = class215.localPlayer.x >> 7; + var8 = class215.localPlayer.y >> 7; + } + + var9 = UrlRequester.cameraX >> 7; + var10 = GrandExchangeOfferAgeComparator.cameraZ >> 7; + if (var9 < 0 || var10 < 0 || var9 >= 104 || var10 >= 104) { + var5 = Player.Scene_plane; + break label525; + } + + if (var7 < 0 || var8 < 0 || var7 >= 104 || var8 >= 104) { + var5 = Player.Scene_plane; + break label525; + } + + if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { + var6 = Player.Scene_plane; + } + + if (var7 > var9) { + var11 = var7 - var9; + } else { + var11 = var9 - var7; + } + + if (var8 > var10) { + var12 = var8 - var10; + } else { + var12 = var10 - var8; + } + + if (var11 > var12) { + var13 = var12 * 65536 / var11; + var14 = 32768; + + while (var9 != var7) { + if (var9 < var7) { + ++var9; + } else if (var9 > var7) { + --var9; + } + + if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { + var6 = Player.Scene_plane; + } + + var14 += var13; + if (var14 >= 65536) { + var14 -= 65536; + if (var10 < var8) { + ++var10; + } else if (var10 > var8) { + --var10; + } + + if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { + var6 = Player.Scene_plane; + } + } + } + } else if (var12 > 0) { + var13 = var11 * 65536 / var12; + var14 = 32768; + + while (var8 != var10) { + if (var10 < var8) { + ++var10; + } else if (var10 > var8) { + --var10; + } + + if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { + var6 = Player.Scene_plane; + } + + var14 += var13; + if (var14 >= 65536) { + var14 -= 65536; + if (var9 < var7) { + ++var9; + } else if (var9 > var7) { + --var9; + } + + if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { + var6 = Player.Scene_plane; + } + } + } + } + } + + if (class215.localPlayer.x >= 0 && class215.localPlayer.y >= 0 && class215.localPlayer.x < 13312 && class215.localPlayer.y < 13312) { + if ((Tiles.Tiles_renderFlags[Player.Scene_plane][class215.localPlayer.x >> 7][class215.localPlayer.y >> 7] & 4) != 0) { + var6 = Player.Scene_plane; + } + + var5 = var6; + } else { + var5 = Player.Scene_plane; + } + } + } + + var4 = var5; + } else { + if (ScriptEvent.clientPreferences.roofsHidden) { + var5 = Player.Scene_plane; + } else { + var6 = GraphicsObject.getTileHeight(UrlRequester.cameraX, GrandExchangeOfferAgeComparator.cameraZ, Player.Scene_plane); + if (var6 - class16.cameraY < 800 && (Tiles.Tiles_renderFlags[Player.Scene_plane][UrlRequester.cameraX >> 7][GrandExchangeOfferAgeComparator.cameraZ >> 7] & 4) != 0) { + var5 = Player.Scene_plane; + } else { + var5 = 3; + } + } + + var4 = var5; + } + + var5 = UrlRequester.cameraX; + var6 = class16.cameraY; + var7 = GrandExchangeOfferAgeComparator.cameraZ; + var8 = class247.cameraPitch; + var9 = WorldMapData_1.cameraYaw; + + for (var10 = 0; var10 < 5; ++var10) { + if (Client.field641[var10]) { + var11 = (int)(Math.random() * (double)(Client.field877[var10] * 2 + 1) - (double)Client.field877[var10] + Math.sin((double)Client.field880[var10] * ((double)Client.field879[var10] / 100.0D)) * (double)Client.field795[var10]); + if (var10 == 0) { + UrlRequester.cameraX += var11; + } + + if (var10 == 1) { + class16.cameraY += var11; + } + + if (var10 == 2) { + GrandExchangeOfferAgeComparator.cameraZ += var11; + } + + if (var10 == 3) { + WorldMapData_1.cameraYaw = var11 + WorldMapData_1.cameraYaw & 2047; + } + + if (var10 == 4) { + class247.cameraPitch += var11; + if (class247.cameraPitch < 128) { + class247.cameraPitch = 128; + } + + if (class247.cameraPitch > 383) { + class247.cameraPitch = 383; + } + } + } + } + + var10 = MouseHandler.MouseHandler_x; + var11 = MouseHandler.MouseHandler_y; + if (MouseHandler.MouseHandler_lastButton != 0) { + var10 = MouseHandler.MouseHandler_lastPressedX; + var11 = MouseHandler.MouseHandler_lastPressedY; + } + + if (var10 >= var0 && var10 < var0 + var2 && var11 >= var1 && var11 < var3 + var1) { + var12 = var10 - var0; + var13 = var11 - var1; + ViewportMouse.ViewportMouse_x = var12; + ViewportMouse.ViewportMouse_y = var13; + ViewportMouse.ViewportMouse_isInViewport = true; + ViewportMouse.ViewportMouse_entityCount = 0; + ViewportMouse.ViewportMouse_false0 = false; + } else { + ViewportMouse.ViewportMouse_isInViewport = false; + ViewportMouse.ViewportMouse_entityCount = 0; + } + + ChatChannel.playPcmPlayers(); + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var3, 0); + ChatChannel.playPcmPlayers(); + var12 = Rasterizer3D.Rasterizer3D_zoom; + Rasterizer3D.Rasterizer3D_zoom = Client.viewportZoom; + WorldMapArea.scene.draw(UrlRequester.cameraX, class16.cameraY, GrandExchangeOfferAgeComparator.cameraZ, class247.cameraPitch, WorldMapData_1.cameraYaw, var4); + Rasterizer3D.Rasterizer3D_zoom = var12; + ChatChannel.playPcmPlayers(); + WorldMapArea.scene.clearTempGameObjects(); + Client.overheadTextCount = 0; + boolean var30 = false; + var14 = -1; + int var15 = -1; + int var16 = Players.Players_count; + int[] var17 = Players.Players_indices; + + int var18; + for (var18 = 0; var18 < var16 + Client.npcCount; ++var18) { + Object var19; + if (var18 < var16) { + var19 = Client.players[var17[var18]]; + if (var17[var18] == Client.combatTargetPlayerIndex) { + var30 = true; + var14 = var18; + continue; + } + + if (var19 == class215.localPlayer) { + var15 = var18; + continue; + } + } else { + var19 = Client.npcs[Client.npcIndices[var18 - var16]]; + } + + AbstractSocket.drawActor2d((Actor)var19, var18, var0, var1, var2, var3); + } + + if (Client.renderSelf && var15 != -1) { + AbstractSocket.drawActor2d(class215.localPlayer, var15, var0, var1, var2, var3); + } + + if (var30) { + AbstractSocket.drawActor2d(Client.players[Client.combatTargetPlayerIndex], var14, var0, var1, var2, var3); + } + + for (var18 = 0; var18 < Client.overheadTextCount; ++var18) { + int var28 = Client.overheadTextXs[var18]; + int var20 = Client.overheadTextYs[var18]; + int var21 = Client.overheadTextXOffsets[var18]; + int var22 = Client.overheadTextAscents[var18]; + boolean var23 = true; + + while (var23) { + var23 = false; + + for (int var24 = 0; var24 < var18; ++var24) { + if (var20 + 2 > Client.overheadTextYs[var24] - Client.overheadTextAscents[var24] && var20 - var22 < Client.overheadTextYs[var24] + 2 && var28 - var21 < Client.overheadTextXOffsets[var24] + Client.overheadTextXs[var24] && var21 + var28 > Client.overheadTextXs[var24] - Client.overheadTextXOffsets[var24] && Client.overheadTextYs[var24] - Client.overheadTextAscents[var24] < var20) { + var20 = Client.overheadTextYs[var24] - Client.overheadTextAscents[var24]; + var23 = true; + } + } + } + + Client.viewportTempX = Client.overheadTextXs[var18]; + Client.viewportTempY = Client.overheadTextYs[var18] = var20; + String var29 = Client.overheadText[var18]; + if (Client.chatEffects == 0) { + int var25 = 16776960; + if (Client.overheadTextColors[var18] < 6) { + var25 = Client.field829[Client.overheadTextColors[var18]]; + } + + if (Client.overheadTextColors[var18] == 6) { + var25 = Client.viewportDrawCount % 20 < 10 ? 16711680 : 16776960; + } + + if (Client.overheadTextColors[var18] == 7) { + var25 = Client.viewportDrawCount % 20 < 10 ? 255 : '\uffff'; + } + + if (Client.overheadTextColors[var18] == 8) { + var25 = Client.viewportDrawCount % 20 < 10 ? '뀀' : 8454016; + } + + int var26; + if (Client.overheadTextColors[var18] == 9) { + var26 = 150 - Client.overheadTextCyclesRemaining[var18]; + if (var26 < 50) { + var25 = var26 * 1280 + 16711680; + } else if (var26 < 100) { + var25 = 16776960 - (var26 - 50) * 327680; + } else if (var26 < 150) { + var25 = (var26 - 100) * 5 + 65280; + } + } + + if (Client.overheadTextColors[var18] == 10) { + var26 = 150 - Client.overheadTextCyclesRemaining[var18]; + if (var26 < 50) { + var25 = var26 * 5 + 16711680; + } else if (var26 < 100) { + var25 = 16711935 - (var26 - 50) * 327680; + } else if (var26 < 150) { + var25 = (var26 - 100) * 327680 + 255 - (var26 - 100) * 5; + } + } + + if (Client.overheadTextColors[var18] == 11) { + var26 = 150 - Client.overheadTextCyclesRemaining[var18]; + if (var26 < 50) { + var25 = 16777215 - var26 * 327685; + } else if (var26 < 100) { + var25 = (var26 - 50) * 327685 + 65280; + } else if (var26 < 150) { + var25 = 16777215 - (var26 - 100) * 327680; + } + } + + if (Client.overheadTextEffects[var18] == 0) { + class43.fontBold12.drawCentered(var29, var0 + Client.viewportTempX, Client.viewportTempY + var1, var25, 0); + } + + if (Client.overheadTextEffects[var18] == 1) { + class43.fontBold12.drawCenteredWave(var29, var0 + Client.viewportTempX, Client.viewportTempY + var1, var25, 0, Client.viewportDrawCount); + } + + if (Client.overheadTextEffects[var18] == 2) { + class43.fontBold12.drawCenteredWave2(var29, var0 + Client.viewportTempX, Client.viewportTempY + var1, var25, 0, Client.viewportDrawCount); + } + + if (Client.overheadTextEffects[var18] == 3) { + class43.fontBold12.drawCenteredShake(var29, var0 + Client.viewportTempX, Client.viewportTempY + var1, var25, 0, Client.viewportDrawCount, 150 - Client.overheadTextCyclesRemaining[var18]); + } + + if (Client.overheadTextEffects[var18] == 4) { + var26 = (150 - Client.overheadTextCyclesRemaining[var18]) * (class43.fontBold12.stringWidth(var29) + 100) / 150; + Rasterizer2D.Rasterizer2D_expandClip(var0 + Client.viewportTempX - 50, var1, var0 + Client.viewportTempX + 50, var3 + var1); + class43.fontBold12.draw(var29, var0 + Client.viewportTempX + 50 - var26, Client.viewportTempY + var1, var25, 0); + Rasterizer2D.Rasterizer2D_setClip(var0, var1, var0 + var2, var3 + var1); + } + + if (Client.overheadTextEffects[var18] == 5) { + var26 = 150 - Client.overheadTextCyclesRemaining[var18]; + int var27 = 0; + if (var26 < 25) { + var27 = var26 - 25; + } else if (var26 > 125) { + var27 = var26 - 125; + } + + Rasterizer2D.Rasterizer2D_expandClip(var0, Client.viewportTempY + var1 - class43.fontBold12.ascent - 1, var0 + var2, Client.viewportTempY + var1 + 5); + class43.fontBold12.drawCentered(var29, var0 + Client.viewportTempX, var27 + Client.viewportTempY + var1, var25, 0); + Rasterizer2D.Rasterizer2D_setClip(var0, var1, var0 + var2, var3 + var1); + } + } else { + class43.fontBold12.drawCentered(var29, var0 + Client.viewportTempX, Client.viewportTempY + var1, 16776960, 0); + } + } + + WorldMapLabel.method475(var0, var1); + ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).animate(Client.field693); + RouteStrategy.method3734(var0, var1, var2, var3); + UrlRequester.cameraX = var5; + class16.cameraY = var6; + GrandExchangeOfferAgeComparator.cameraZ = var7; + class247.cameraPitch = var8; + WorldMapData_1.cameraYaw = var9; + if (Client.isLoading) { + byte var31 = 0; + var14 = var31 + NetCache.NetCache_pendingPriorityResponsesCount + NetCache.NetCache_pendingPriorityWritesCount; + if (var14 == 0) { + Client.isLoading = false; + } + } + + if (Client.isLoading) { + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var3, 0); + GrandExchangeEvents.drawLoadingMessage("Loading - please wait.", false); } } diff --git a/runescape-client/src/main/java/Widget.java b/runescape-client/src/main/java/Widget.java index b27711ca76..9e38f029f1 100644 --- a/runescape-client/src/main/java/Widget.java +++ b/runescape-client/src/main/java/Widget.java @@ -4,685 +4,697 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ho") +@ObfuscatedName("hi") @Implements("Widget") public class Widget extends Node { - @ObfuscatedName("y") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lhp;" + signature = "[[Lhi;" ) - @Export("Widget_archive") - static AbstractArchive Widget_archive; - @ObfuscatedName("o") + @Export("Widget_interfaceComponents") + public static Widget[][] Widget_interfaceComponents; + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Lem;" + signature = "Lhq;" + ) + @Export("Widget_spritesArchive") + static AbstractArchive Widget_spritesArchive; + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "Lhq;" + ) + @Export("Widget_fontsArchive") + static AbstractArchive Widget_fontsArchive; + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "Leb;" ) @Export("Widget_cachedSprites") public static EvictingDualNodeHashTable Widget_cachedSprites; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("Widget_cachedModels") public static EvictingDualNodeHashTable Widget_cachedModels; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("Widget_cachedFonts") public static EvictingDualNodeHashTable Widget_cachedFonts; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("Widget_cachedSpriteMasks") public static EvictingDualNodeHashTable Widget_cachedSpriteMasks; - @ObfuscatedName("t") - public static boolean field2543; - @ObfuscatedName("g") + @ObfuscatedName("r") + public static boolean field2546; + @ObfuscatedName("e") @Export("isIf3") public boolean isIf3; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = -938462923 + intValue = -280672731 ) @Export("id") public int id; - @ObfuscatedName("h") + @ObfuscatedName("b") @ObfuscatedGetter( - intValue = 970038855 + intValue = 1645861549 ) @Export("childIndex") public int childIndex; - @ObfuscatedName("s") + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = 1047333541 + intValue = -2128964865 ) @Export("type") public int type; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = -356920675 + intValue = -1250480087 ) @Export("buttonType") public int buttonType; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = -645037763 + intValue = -1066235227 ) @Export("contentType") public int contentType; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -785941721 + intValue = -1730159061 ) @Export("xAlignment") public int xAlignment; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = 2044954067 + intValue = 1386350927 ) @Export("yAlignment") public int yAlignment; - @ObfuscatedName("k") + @ObfuscatedName("y") @ObfuscatedGetter( - intValue = -1296359215 + intValue = -439179557 ) @Export("widthAlignment") public int widthAlignment; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @ObfuscatedGetter( - intValue = 998396021 + intValue = -1461401323 ) @Export("heightAlignment") public int heightAlignment; - @ObfuscatedName("az") + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = -1791986137 + intValue = 1233899185 ) @Export("rawX") public int rawX; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @ObfuscatedGetter( - intValue = 1824790061 + intValue = -890893837 ) @Export("rawY") public int rawY; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = -1720123363 + intValue = -1159275423 ) @Export("rawWidth") public int rawWidth; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedGetter( - intValue = 450063905 + intValue = 1892483003 ) @Export("rawHeight") public int rawHeight; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @ObfuscatedGetter( - intValue = 654358485 + intValue = 48491411 ) @Export("x") public int x; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @ObfuscatedGetter( - intValue = -2047854973 + intValue = -1737418803 ) @Export("y") public int y; - @ObfuscatedName("ax") + @ObfuscatedName("av") @ObfuscatedGetter( - intValue = -1115212787 + intValue = -369065525 ) @Export("width") public int width; - @ObfuscatedName("as") + @ObfuscatedName("am") @ObfuscatedGetter( - intValue = 185246961 + intValue = -977437037 ) @Export("height") public int height; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = 2031946853 + intValue = -146103693 ) - public int field2655; + public int field2565; + @ObfuscatedName("ax") + @ObfuscatedGetter( + intValue = -1709587935 + ) + public int field2566; @ObfuscatedName("al") @ObfuscatedGetter( - intValue = 540658479 - ) - public int field2629; - @ObfuscatedName("ad") - @ObfuscatedGetter( - intValue = 1499631501 + intValue = -952068239 ) @Export("parentId") public int parentId; - @ObfuscatedName("an") + @ObfuscatedName("ap") @Export("isHidden") public boolean isHidden; - @ObfuscatedName("ai") + @ObfuscatedName("aj") @ObfuscatedGetter( - intValue = 1553708193 + intValue = -1718942179 ) @Export("scrollX") public int scrollX; - @ObfuscatedName("ak") + @ObfuscatedName("ae") @ObfuscatedGetter( - intValue = -1983133743 + intValue = -951483361 ) @Export("scrollY") public int scrollY; - @ObfuscatedName("aq") + @ObfuscatedName("au") @ObfuscatedGetter( - intValue = 993795721 + intValue = -1463139927 ) @Export("scrollWidth") public int scrollWidth; - @ObfuscatedName("am") + @ObfuscatedName("ah") @ObfuscatedGetter( - intValue = 319178445 + intValue = -957272581 ) @Export("scrollHeight") public int scrollHeight; - @ObfuscatedName("ae") + @ObfuscatedName("an") @ObfuscatedGetter( - intValue = -1588056221 + intValue = 1271206161 ) @Export("color") public int color; - @ObfuscatedName("av") + @ObfuscatedName("af") @ObfuscatedGetter( - intValue = -1094977017 + intValue = -1941262011 ) @Export("color2") public int color2; - @ObfuscatedName("ah") + @ObfuscatedName("ay") @ObfuscatedGetter( - intValue = 1010030427 + intValue = 514588633 ) @Export("mouseOverColor") public int mouseOverColor; - @ObfuscatedName("ag") + @ObfuscatedName("az") @ObfuscatedGetter( - intValue = -214954083 + intValue = 2103331161 ) @Export("mouseOverColor2") public int mouseOverColor2; - @ObfuscatedName("aj") + @ObfuscatedName("ao") @Export("fill") public boolean fill; - @ObfuscatedName("ay") + @ObfuscatedName("ai") @ObfuscatedSignature( - signature = "Llu;" + signature = "Llt;" ) @Export("fillMode") public FillMode fillMode; - @ObfuscatedName("au") + @ObfuscatedName("ac") @ObfuscatedGetter( - intValue = -1182281851 + intValue = 980252295 ) @Export("transparencyTop") public int transparencyTop; - @ObfuscatedName("af") + @ObfuscatedName("at") @ObfuscatedGetter( - intValue = -1279506063 + intValue = 86266387 ) @Export("transparencyBot") public int transparencyBot; - @ObfuscatedName("at") + @ObfuscatedName("as") @ObfuscatedGetter( - intValue = 1520637795 + intValue = -698709205 ) @Export("lineWid") public int lineWid; - @ObfuscatedName("bx") - public boolean field2579; - @ObfuscatedName("bh") + @ObfuscatedName("ba") + public boolean field2641; + @ObfuscatedName("bg") @ObfuscatedGetter( - intValue = -660582185 + intValue = 984904481 ) @Export("spriteId2") public int spriteId2; - @ObfuscatedName("bd") + @ObfuscatedName("bc") @ObfuscatedGetter( - intValue = -842194727 + intValue = 2067815265 ) @Export("spriteId") public int spriteId; - @ObfuscatedName("bm") + @ObfuscatedName("bd") @ObfuscatedGetter( - intValue = 1539845703 + intValue = 656330525 ) @Export("spriteAngle") public int spriteAngle; - @ObfuscatedName("bv") + @ObfuscatedName("bx") @Export("spriteTiling") public boolean spriteTiling; - @ObfuscatedName("bj") + @ObfuscatedName("bl") @ObfuscatedGetter( - intValue = -908982873 + intValue = -1324246855 ) @Export("outline") public int outline; - @ObfuscatedName("bs") + @ObfuscatedName("bh") @ObfuscatedGetter( - intValue = 235051931 + intValue = 1573371851 ) @Export("spriteShadow") public int spriteShadow; - @ObfuscatedName("bz") + @ObfuscatedName("bu") @Export("spriteFlipV") public boolean spriteFlipV; - @ObfuscatedName("bc") + @ObfuscatedName("br") @Export("spriteFlipH") public boolean spriteFlipH; - @ObfuscatedName("bk") + @ObfuscatedName("bq") @ObfuscatedGetter( - intValue = -917602037 + intValue = -593024897 ) @Export("modelType") public int modelType; - @ObfuscatedName("ba") + @ObfuscatedName("bi") @ObfuscatedGetter( - intValue = 352337217 + intValue = -114763821 ) @Export("modelId") public int modelId; - @ObfuscatedName("bn") + @ObfuscatedName("be") @ObfuscatedGetter( - intValue = -1558533019 + intValue = -1742375397 ) @Export("modelType2") int modelType2; - @ObfuscatedName("be") + @ObfuscatedName("bt") @ObfuscatedGetter( - intValue = -1849612505 + intValue = 211034615 ) @Export("modelId2") int modelId2; - @ObfuscatedName("bu") + @ObfuscatedName("bs") @ObfuscatedGetter( - intValue = -1921357951 + intValue = -802962767 ) @Export("sequenceId") public int sequenceId; - @ObfuscatedName("bi") + @ObfuscatedName("bj") @ObfuscatedGetter( - intValue = -803672091 + intValue = 1552321185 ) @Export("sequenceId2") public int sequenceId2; - @ObfuscatedName("bb") + @ObfuscatedName("bm") @ObfuscatedGetter( - intValue = -617034503 + intValue = 932822481 ) @Export("modelOffsetX") public int modelOffsetX; - @ObfuscatedName("bt") + @ObfuscatedName("bn") @ObfuscatedGetter( - intValue = 263647227 + intValue = 869171029 ) @Export("modelOffsetY") public int modelOffsetY; - @ObfuscatedName("by") + @ObfuscatedName("bz") @ObfuscatedGetter( - intValue = -899088195 + intValue = -326232143 ) @Export("modelAngleX") public int modelAngleX; - @ObfuscatedName("bq") + @ObfuscatedName("bo") @ObfuscatedGetter( - intValue = 744470751 + intValue = 445360869 ) @Export("modelAngleY") public int modelAngleY; - @ObfuscatedName("bo") + @ObfuscatedName("bk") @ObfuscatedGetter( - intValue = 1532699993 + intValue = 1367930315 ) @Export("modelAngleZ") public int modelAngleZ; - @ObfuscatedName("br") + @ObfuscatedName("bv") @ObfuscatedGetter( - intValue = -1859343581 + intValue = -1834112819 ) @Export("modelZoom") public int modelZoom; - @ObfuscatedName("bl") + @ObfuscatedName("bw") @ObfuscatedGetter( - intValue = -516131825 + intValue = -456160553 ) - public int field2667; + public int field2577; + @ObfuscatedName("bb") + @ObfuscatedGetter( + intValue = -617398221 + ) + public int field2604; @ObfuscatedName("bf") - @ObfuscatedGetter( - intValue = 820815763 - ) - public int field2601; - @ObfuscatedName("bg") @Export("modelOrthog") public boolean modelOrthog; - @ObfuscatedName("bw") + @ObfuscatedName("by") @Export("modelTransparency") public boolean modelTransparency; @ObfuscatedName("bp") @ObfuscatedGetter( - intValue = 1908099759 + intValue = 864768915 ) @Export("itemQuantityMode") public int itemQuantityMode; - @ObfuscatedName("cz") + @ObfuscatedName("cx") @ObfuscatedGetter( - intValue = 8724653 + intValue = -1260051363 ) @Export("fontId") public int fontId; - @ObfuscatedName("ck") + @ObfuscatedName("cv") @Export("text") public String text; - @ObfuscatedName("cv") + @ObfuscatedName("ce") @Export("text2") public String text2; - @ObfuscatedName("co") + @ObfuscatedName("cw") @ObfuscatedGetter( - intValue = -1471970549 + intValue = -437750021 ) @Export("textLineHeight") public int textLineHeight; - @ObfuscatedName("cs") + @ObfuscatedName("cd") @ObfuscatedGetter( - intValue = 275090821 + intValue = 1459879157 ) @Export("textXAlignment") public int textXAlignment; - @ObfuscatedName("cg") + @ObfuscatedName("cn") @ObfuscatedGetter( - intValue = -2027130901 + intValue = -1045469939 ) @Export("textYAlignment") public int textYAlignment; - @ObfuscatedName("cn") + @ObfuscatedName("cr") @Export("textShadowed") public boolean textShadowed; - @ObfuscatedName("cd") + @ObfuscatedName("ci") @ObfuscatedGetter( - intValue = 488082575 + intValue = 305602759 ) @Export("paddingX") public int paddingX; @ObfuscatedName("cy") @ObfuscatedGetter( - intValue = 1814601209 + intValue = -782099123 ) @Export("paddingY") public int paddingY; - @ObfuscatedName("cj") + @ObfuscatedName("cl") @Export("inventoryXOffsets") public int[] inventoryXOffsets; - @ObfuscatedName("cb") + @ObfuscatedName("co") @Export("inventoryYOffsets") public int[] inventoryYOffsets; - @ObfuscatedName("cr") + @ObfuscatedName("cu") @Export("inventorySprites") public int[] inventorySprites; - @ObfuscatedName("ct") + @ObfuscatedName("cz") @Export("itemActions") public String[] itemActions; - @ObfuscatedName("ci") + @ObfuscatedName("cq") @ObfuscatedGetter( - intValue = -349261461 + intValue = 1435074299 ) @Export("clickMask") public int clickMask; - @ObfuscatedName("cu") - public boolean field2619; - @ObfuscatedName("ce") - public byte[][] field2552; + @ObfuscatedName("cj") + public boolean field2606; + @ObfuscatedName("cm") + public byte[][] field2623; + @ObfuscatedName("cb") + public byte[][] field2624; + @ObfuscatedName("ct") + public int[] field2628; @ObfuscatedName("cc") - public byte[][] field2621; - @ObfuscatedName("ca") - public int[] field2586; - @ObfuscatedName("cf") - public int[] field2548; - @ObfuscatedName("dt") + public int[] field2626; + @ObfuscatedName("db") @Export("dataText") public String dataText; - @ObfuscatedName("dv") + @ObfuscatedName("dq") @Export("actions") public String[] actions; - @ObfuscatedName("dm") + @ObfuscatedName("dd") @ObfuscatedSignature( - signature = "Lho;" + signature = "Lhi;" ) @Export("parent") public Widget parent; - @ObfuscatedName("dn") + @ObfuscatedName("dl") @ObfuscatedGetter( - intValue = 613508017 + intValue = 1506915571 ) @Export("dragZoneSize") public int dragZoneSize; - @ObfuscatedName("dq") + @ObfuscatedName("dm") @ObfuscatedGetter( - intValue = -1263499789 + intValue = 1786356727 ) @Export("dragThreshold") public int dragThreshold; - @ObfuscatedName("dy") + @ObfuscatedName("di") @Export("isScrollBar") public boolean isScrollBar; - @ObfuscatedName("de") + @ObfuscatedName("dn") @Export("spellActionName") public String spellActionName; - @ObfuscatedName("df") + @ObfuscatedName("dr") @Export("hasListener") public boolean hasListener; - @ObfuscatedName("dr") + @ObfuscatedName("do") @Export("onLoad") public Object[] onLoad; - @ObfuscatedName("du") + @ObfuscatedName("ds") @Export("onClick") public Object[] onClick; - @ObfuscatedName("ds") + @ObfuscatedName("dz") @Export("onClickRepeat") public Object[] onClickRepeat; - @ObfuscatedName("dc") + @ObfuscatedName("dj") @Export("onRelease") public Object[] onRelease; - @ObfuscatedName("di") + @ObfuscatedName("df") @Export("onHold") public Object[] onHold; - @ObfuscatedName("dk") + @ObfuscatedName("da") @Export("onMouseOver") public Object[] onMouseOver; - @ObfuscatedName("dx") + @ObfuscatedName("dg") @Export("onMouseRepeat") public Object[] onMouseRepeat; - @ObfuscatedName("dz") + @ObfuscatedName("dp") @Export("onMouseLeave") public Object[] onMouseLeave; - @ObfuscatedName("do") + @ObfuscatedName("dy") @Export("onDrag") public Object[] onDrag; - @ObfuscatedName("dw") + @ObfuscatedName("du") @Export("onDragComplete") public Object[] onDragComplete; - @ObfuscatedName("dd") + @ObfuscatedName("dk") @Export("onTargetEnter") public Object[] onTargetEnter; - @ObfuscatedName("dj") + @ObfuscatedName("dx") @Export("onTargetLeave") public Object[] onTargetLeave; - @ObfuscatedName("dg") + @ObfuscatedName("dt") @Export("onVarTransmit") public Object[] onVarTransmit; - @ObfuscatedName("da") + @ObfuscatedName("dw") @Export("varTransmitTriggers") public int[] varTransmitTriggers; - @ObfuscatedName("dl") + @ObfuscatedName("dh") @Export("onInvTransmit") public Object[] onInvTransmit; - @ObfuscatedName("dh") + @ObfuscatedName("dv") @Export("invTransmitTriggers") public int[] invTransmitTriggers; - @ObfuscatedName("db") + @ObfuscatedName("dc") @Export("onStatTransmit") public Object[] onStatTransmit; - @ObfuscatedName("dp") + @ObfuscatedName("de") @Export("statTransmitTriggers") public int[] statTransmitTriggers; - @ObfuscatedName("ek") + @ObfuscatedName("eu") @Export("onTimer") public Object[] onTimer; - @ObfuscatedName("ef") + @ObfuscatedName("eg") @Export("onOp") public Object[] onOp; - @ObfuscatedName("ew") + @ObfuscatedName("ee") @Export("onScroll") public Object[] onScroll; - @ObfuscatedName("ex") + @ObfuscatedName("ek") @Export("onChatTransmit") public Object[] onChatTransmit; - @ObfuscatedName("eq") + @ObfuscatedName("ef") @Export("onKey") public Object[] onKey; - @ObfuscatedName("er") + @ObfuscatedName("ep") @Export("onFriendTransmit") public Object[] onFriendTransmit; - @ObfuscatedName("eo") + @ObfuscatedName("et") @Export("onClanTransmit") public Object[] onClanTransmit; - @ObfuscatedName("ee") + @ObfuscatedName("eq") @Export("onMiscTransmit") public Object[] onMiscTransmit; - @ObfuscatedName("ep") + @ObfuscatedName("em") @Export("onDialogAbort") public Object[] onDialogAbort; - @ObfuscatedName("ei") + @ObfuscatedName("ew") @Export("onSubChange") public Object[] onSubChange; - @ObfuscatedName("es") + @ObfuscatedName("eh") @Export("onResize") public Object[] onResize; - @ObfuscatedName("eg") + @ObfuscatedName("ei") @Export("onStockTransmit") public Object[] onStockTransmit; - @ObfuscatedName("ej") - public Object[] field2662; - @ObfuscatedName("en") + @ObfuscatedName("ex") + public Object[] field2665; + @ObfuscatedName("ev") @Export("cs1Instructions") public int[][] cs1Instructions; - @ObfuscatedName("eh") + @ObfuscatedName("er") @Export("cs1Comparisons") public int[] cs1Comparisons; - @ObfuscatedName("em") + @ObfuscatedName("eb") @Export("cs1ComparisonValues") public int[] cs1ComparisonValues; - @ObfuscatedName("ev") + @ObfuscatedName("es") @ObfuscatedGetter( - intValue = 1603621761 + intValue = -2064419495 ) @Export("mouseOverRedirect") public int mouseOverRedirect; - @ObfuscatedName("ez") + @ObfuscatedName("en") @Export("spellName") public String spellName; - @ObfuscatedName("ec") + @ObfuscatedName("eo") @Export("buttonText") public String buttonText; - @ObfuscatedName("eu") + @ObfuscatedName("ed") @Export("itemIds") public int[] itemIds; - @ObfuscatedName("ed") + @ObfuscatedName("ea") @Export("itemQuantities") public int[] itemQuantities; - @ObfuscatedName("ey") + @ObfuscatedName("ec") @ObfuscatedGetter( - intValue = -1532577883 + intValue = 1669892041 ) @Export("itemId") public int itemId; - @ObfuscatedName("el") + @ObfuscatedName("ey") @ObfuscatedGetter( - intValue = 878258425 + intValue = 953415941 ) @Export("itemQuantity") public int itemQuantity; - @ObfuscatedName("ea") + @ObfuscatedName("ez") @ObfuscatedGetter( - intValue = 758841865 + intValue = 1038717705 ) @Export("modelFrame") public int modelFrame; - @ObfuscatedName("et") + @ObfuscatedName("ej") @ObfuscatedGetter( - intValue = 2093634115 + intValue = -1473974595 ) @Export("modelFrameCycle") public int modelFrameCycle; - @ObfuscatedName("eb") + @ObfuscatedName("el") @ObfuscatedSignature( - signature = "[Lho;" + signature = "[Lhi;" ) @Export("children") public Widget[] children; - @ObfuscatedName("fb") + @ObfuscatedName("ft") @Export("containsMouse") public boolean containsMouse; @ObfuscatedName("fe") @Export("isClicked") public boolean isClicked; - @ObfuscatedName("fd") + @ObfuscatedName("fs") @ObfuscatedGetter( - intValue = 1204314605 - ) - public int field2558; - @ObfuscatedName("fy") - @ObfuscatedGetter( - intValue = -162526605 - ) - public int field2620; - @ObfuscatedName("ff") - @ObfuscatedGetter( - intValue = 976944717 - ) - public int field2680; - @ObfuscatedName("fo") - @ObfuscatedGetter( - intValue = 1042446467 + intValue = 364825415 ) public int field2681; - @ObfuscatedName("fk") + @ObfuscatedName("fi") @ObfuscatedGetter( - intValue = -27098335 + intValue = -249487125 + ) + public int field2644; + @ObfuscatedName("fp") + @ObfuscatedGetter( + intValue = -1173942703 + ) + public int field2567; + @ObfuscatedName("fu") + @ObfuscatedGetter( + intValue = -309907897 + ) + public int field2684; + @ObfuscatedName("fy") + @ObfuscatedGetter( + intValue = -1761314171 ) @Export("rootIndex") public int rootIndex; - @ObfuscatedName("fq") + @ObfuscatedName("fn") @ObfuscatedGetter( - intValue = -433990399 + intValue = 31407323 ) @Export("cycle") public int cycle; - @ObfuscatedName("fc") - public int[] field2684; - @ObfuscatedName("fv") + @ObfuscatedName("fg") + public int[] field2627; + @ObfuscatedName("fw") @Export("noClickThrough") public boolean noClickThrough; - @ObfuscatedName("fm") + @ObfuscatedName("ff") @Export("noScrollThrough") public boolean noScrollThrough; @ObfuscatedName("fh") - public boolean field2687; + public boolean field2690; static { Widget_cachedSprites = new EvictingDualNodeHashTable(200); Widget_cachedModels = new EvictingDualNodeHashTable(50); Widget_cachedFonts = new EvictingDualNodeHashTable(20); Widget_cachedSpriteMasks = new EvictingDualNodeHashTable(8); - field2543 = false; + field2546 = false; } public Widget() { @@ -703,8 +715,8 @@ public class Widget extends Node { this.y = 0; this.width = 0; this.height = 0; - this.field2655 = 1; - this.field2629 = 1; + this.field2565 = 1; + this.field2566 = 1; this.parentId = -1; this.isHidden = false; this.scrollX = 0; @@ -720,7 +732,7 @@ public class Widget extends Node { this.transparencyTop = 0; this.transparencyBot = 0; this.lineWid = 1; - this.field2579 = false; + this.field2641 = false; this.spriteId2 = -1; this.spriteId = -1; this.spriteAngle = 0; @@ -739,8 +751,8 @@ public class Widget extends Node { this.modelAngleY = 0; this.modelAngleZ = 0; this.modelZoom = 100; - this.field2667 = 0; - this.field2601 = 0; + this.field2577 = 0; + this.field2604 = 0; this.modelOrthog = false; this.modelTransparency = false; this.itemQuantityMode = 2; @@ -754,7 +766,7 @@ public class Widget extends Node { this.paddingX = 0; this.paddingY = 0; this.clickMask = 0; - this.field2619 = false; + this.field2606 = false; this.dataText = ""; this.parent = null; this.dragZoneSize = 0; @@ -771,21 +783,21 @@ public class Widget extends Node { this.modelFrameCycle = 0; this.containsMouse = false; this.isClicked = false; - this.field2558 = -1; - this.field2620 = 0; - this.field2680 = 0; - this.field2681 = 0; + this.field2681 = -1; + this.field2644 = 0; + this.field2567 = 0; + this.field2684 = 0; this.rootIndex = -1; this.cycle = -1; this.noClickThrough = false; this.noScrollThrough = false; - this.field2687 = false; + this.field2690 = false; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lkl;S)V", - garbageValue = "15127" + signature = "(Lkc;I)V", + garbageValue = "1429632695" ) @Export("decodeLegacy") void decodeLegacy(Buffer var1) { @@ -896,9 +908,9 @@ public class Widget extends Node { this.itemActions = new String[5]; for (var8 = 0; var8 < 5; ++var8) { - String var11 = var1.readStringCp1252NullTerminated(); - if (var11.length() > 0) { - this.itemActions[var8] = var11; + String var10 = var1.readStringCp1252NullTerminated(); + if (var10.length() > 0) { + this.itemActions[var8] = var10; this.clickMask |= 1 << var8 + 23; } } @@ -969,7 +981,7 @@ public class Widget extends Node { } if (this.type == 7) { - this.itemIds = new int[this.rawHeight * this.rawWidth]; + this.itemIds = new int[this.rawWidth * this.rawHeight]; this.itemQuantities = new int[this.rawWidth * this.rawHeight]; this.textXAlignment = var1.readUnsignedByte(); this.fontId = var1.readUnsignedShort(); @@ -989,9 +1001,9 @@ public class Widget extends Node { this.itemActions = new String[5]; for (var5 = 0; var5 < 5; ++var5) { - String var10 = var1.readStringCp1252NullTerminated(); - if (var10.length() > 0) { - this.itemActions[var5] = var10; + String var11 = var1.readStringCp1252NullTerminated(); + if (var11.length() > 0) { + this.itemActions[var5] = var11; this.clickMask |= 1 << var5 + 23; } } @@ -1039,10 +1051,10 @@ public class Widget extends Node { } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-508997564" + signature = "(Lkc;I)V", + garbageValue = "2011634679" ) @Export("decode") void decode(Buffer var1) { @@ -1109,7 +1121,7 @@ public class Widget extends Node { this.modelOrthog = var1.readUnsignedByte() == 1; var1.readUnsignedShort(); if (this.widthAlignment != 0) { - this.field2667 = var1.readUnsignedShort(); + this.field2577 = var1.readUnsignedShort(); } if (this.heightAlignment != 0) { @@ -1140,7 +1152,7 @@ public class Widget extends Node { if (this.type == 9) { this.lineWid = var1.readUnsignedByte(); this.color = var1.readInt(); - this.field2579 = var1.readUnsignedByte() == 1; + this.field2641 = var1.readUnsignedByte() == 1; } this.clickMask = var1.readMedium(); @@ -1181,10 +1193,10 @@ public class Widget extends Node { this.statTransmitTriggers = this.readListenerTriggers(var1); } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(Lkl;B)[Ljava/lang/Object;", - garbageValue = "0" + signature = "(Lkc;I)[Ljava/lang/Object;", + garbageValue = "2071602540" ) @Export("readListener") Object[] readListener(Buffer var1) { @@ -1208,10 +1220,10 @@ public class Widget extends Node { } } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(Lkl;I)[I", - garbageValue = "-132337395" + signature = "(Lkc;I)[I", + garbageValue = "-1637703224" ) @Export("readListenerTriggers") int[] readListenerTriggers(Buffer var1) { @@ -1229,10 +1241,10 @@ public class Widget extends Node { } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "-1452278640" + garbageValue = "998252428" ) @Export("swapItems") public void swapItems(int var1, int var2) { @@ -1244,14 +1256,14 @@ public class Widget extends Node { this.itemQuantities[var1] = var3; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(ZB)Llf;", - garbageValue = "13" + signature = "(ZB)Llx;", + garbageValue = "125" ) @Export("getSprite") public Sprite getSprite(boolean var1) { - field2543 = false; + field2546 = false; int var2; if (var1) { var2 = this.spriteId; @@ -1262,14 +1274,14 @@ public class Widget extends Node { if (var2 == -1) { return null; } else { - long var3 = ((long)this.spriteShadow << 40) + ((this.spriteFlipH ? 1L : 0L) << 39) + (long)var2 + ((long)this.outline << 36) + ((this.spriteFlipV ? 1L : 0L) << 38); + long var3 = ((this.spriteFlipH ? 1L : 0L) << 39) + ((this.spriteFlipV ? 1L : 0L) << 38) + ((long)this.outline << 36) + (long)var2 + ((long)this.spriteShadow << 40); Sprite var5 = (Sprite)Widget_cachedSprites.get(var3); if (var5 != null) { return var5; } else { - var5 = NPCDefinition.SpriteBuffer_getSprite(ClientPreferences.Widget_spritesArchive, var2, 0); + var5 = MenuAction.SpriteBuffer_getSprite(Widget_spritesArchive, var2, 0); if (var5 == null) { - field2543 = true; + field2546 = true; return null; } else { if (this.spriteFlipV) { @@ -1303,14 +1315,14 @@ public class Widget extends Node { } } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(I)Lkn;", - garbageValue = "2078221283" + signature = "(B)Lks;", + garbageValue = "21" ) @Export("getFont") public Font getFont() { - field2543 = false; + field2546 = false; if (this.fontId == -1) { return null; } else { @@ -1318,11 +1330,11 @@ public class Widget extends Node { if (var1 != null) { return var1; } else { - var1 = ClanMate.method4976(ClientPreferences.Widget_spritesArchive, class2.Widget_fontsArchive, this.fontId, 0); + var1 = class269.method5114(Widget_spritesArchive, Widget_fontsArchive, this.fontId, 0); if (var1 != null) { Widget_cachedFonts.put(var1, (long)this.fontId); } else { - field2543 = true; + field2546 = true; } return var1; @@ -1330,14 +1342,14 @@ public class Widget extends Node { } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(II)Llf;", - garbageValue = "378738987" + signature = "(II)Llx;", + garbageValue = "1720917117" ) @Export("getInventorySprite") public Sprite getInventorySprite(int var1) { - field2543 = false; + field2546 = false; if (var1 >= 0 && var1 < this.inventorySprites.length) { int var2 = this.inventorySprites[var1]; if (var2 == -1) { @@ -1347,11 +1359,11 @@ public class Widget extends Node { if (var3 != null) { return var3; } else { - var3 = NPCDefinition.SpriteBuffer_getSprite(ClientPreferences.Widget_spritesArchive, var2, 0); + var3 = MenuAction.SpriteBuffer_getSprite(Widget_spritesArchive, var2, 0); if (var3 != null) { Widget_cachedSprites.put(var3, (long)var2); } else { - field2543 = true; + field2546 = true; } return var3; @@ -1362,14 +1374,14 @@ public class Widget extends Node { } } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(Lix;IZLhr;I)Ldh;", - garbageValue = "312121808" + signature = "(Liv;IZLhe;I)Ldv;", + garbageValue = "-1533310000" ) @Export("getModel") public Model getModel(SequenceDefinition var1, int var2, boolean var3, PlayerAppearance var4) { - field2543 = false; + field2546 = false; int var5; int var6; if (var3) { @@ -1389,9 +1401,9 @@ public class Widget extends Node { if (var7 == null) { ModelData var8; if (var5 == 1) { - var8 = ModelData.ModelData_get(TaskHandler.Widget_modelsArchive, var6, 0); + var8 = ModelData.ModelData_get(StructDefinition.Widget_modelsArchive, var6, 0); if (var8 == null) { - field2543 = true; + field2546 = true; return null; } @@ -1399,9 +1411,9 @@ public class Widget extends Node { } if (var5 == 2) { - var8 = PacketBufferNode.getNpcDefinition(var6).getModelData(); + var8 = SecureRandomCallable.getNpcDefinition(var6).getModelData(); if (var8 == null) { - field2543 = true; + field2546 = true; return null; } @@ -1415,7 +1427,7 @@ public class Widget extends Node { var8 = var4.getModelData(); if (var8 == null) { - field2543 = true; + field2546 = true; return null; } @@ -1423,10 +1435,10 @@ public class Widget extends Node { } if (var5 == 4) { - ItemDefinition var9 = Occluder.ItemDefinition_get(var6); + ItemDefinition var9 = class222.ItemDefinition_get(var6); var8 = var9.getModelData(10); if (var8 == null) { - field2543 = true; + field2546 = true; return null; } @@ -1444,10 +1456,10 @@ public class Widget extends Node { } } - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(ZB)Lhz;", - garbageValue = "0" + signature = "(ZI)Lhn;", + garbageValue = "1756032034" ) @Export("getSpriteMask") public SpriteMask getSpriteMask(boolean var1) { @@ -1459,7 +1471,7 @@ public class Widget extends Node { if (var2 == -1) { return null; } else { - long var3 = ((this.spriteFlipV ? 1L : 0L) << 38) + (long)var2 + ((long)this.outline << 36) + ((this.spriteFlipH ? 1L : 0L) << 39) + ((long)this.spriteShadow << 40); + long var3 = ((this.spriteFlipH ? 1L : 0L) << 39) + (long)var2 + ((long)this.outline << 36) + ((this.spriteFlipV ? 1L : 0L) << 38) + ((long)this.spriteShadow << 40); SpriteMask var5 = (SpriteMask)Widget_cachedSpriteMasks.get(var3); if (var5 != null) { return var5; @@ -1503,10 +1515,10 @@ public class Widget extends Node { } } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(ILjava/lang/String;S)V", - garbageValue = "-24772" + signature = "(ILjava/lang/String;I)V", + garbageValue = "1842763844" ) @Export("setAction") public void setAction(int var1, String var2) { diff --git a/runescape-client/src/main/java/World.java b/runescape-client/src/main/java/World.java index bc15988883..7891f78d5b 100644 --- a/runescape-client/src/main/java/World.java +++ b/runescape-client/src/main/java/World.java @@ -1,75 +1,69 @@ +import java.awt.Image; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bo") +@ObfuscatedName("bk") @Implements("World") public class World { - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "[Lbo;" - ) - @Export("World_worlds") - static World[] World_worlds; - @ObfuscatedName("p") + @ObfuscatedName("n") + @Export("Interpreter_intLocals") + static int[] Interpreter_intLocals; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1109260753 + intValue = 494221483 ) @Export("World_count") static int World_count; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1029210309 + intValue = -1998589339 ) @Export("World_listCount") static int World_listCount; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("World_sortOption2") static int[] World_sortOption2; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("World_sortOption1") static int[] World_sortOption1; - @ObfuscatedName("en") + @ObfuscatedName("am") + static Image field996; + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1902437399 - ) - static int field1012; - @ObfuscatedName("c") - @ObfuscatedGetter( - intValue = 974966281 + intValue = -962932589 ) @Export("id") int id; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 1702314457 + intValue = -932185849 ) @Export("properties") int properties; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 997157235 + intValue = -148659453 ) @Export("population") int population; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("host") String host; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("activity") String activity; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 1450881291 + intValue = -1478384809 ) @Export("location") int location; - @ObfuscatedName("t") + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = 1472418349 + intValue = -556966481 ) @Export("index") int index; @@ -87,173 +81,77 @@ public class World { @ObfuscatedName("i") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "858641980" + garbageValue = "1210336025" ) @Export("isMembersOnly") boolean isMembersOnly() { return (1 & this.properties) != 0; } - @ObfuscatedName("c") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-622240981" + garbageValue = "-293217805" ) - boolean method1806() { + boolean method1917() { return (2 & this.properties) != 0; } - @ObfuscatedName("b") + @ObfuscatedName("m") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "2080738289" + garbageValue = "726558642" ) @Export("isPvp") boolean isPvp() { return (4 & this.properties) != 0; } - @ObfuscatedName("o") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "100459661" + garbageValue = "526640456" ) - boolean method1778() { + boolean method1885() { return (8 & this.properties) != 0; } - @ObfuscatedName("a") + @ObfuscatedName("h") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-1262281013" + garbageValue = "-771328937" ) @Export("isDeadman") boolean isDeadman() { return (536870912 & this.properties) != 0; } - @ObfuscatedName("e") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "-24" + signature = "(I)Z", + garbageValue = "-188040655" ) @Export("isBeta") boolean isBeta() { return (33554432 & this.properties) != 0; } - @ObfuscatedName("z") - @Export("base37DecodeLong") - public static String base37DecodeLong(long var0) { - if (var0 > 0L && var0 < 6582952005840035281L) { - if (0L == var0 % 37L) { - return null; - } else { - int var2 = 0; - - for (long var3 = var0; 0L != var3; var3 /= 37L) { - ++var2; - } - - StringBuilder var5; - char var8; - for (var5 = new StringBuilder(var2); var0 != 0L; var5.append(var8)) { - long var6 = var0; - var0 /= 37L; - var8 = class288.base37Table[(int)(var6 - var0 * 37L)]; - if (var8 == '_') { - int var9 = var5.length() - 1; - var5.setCharAt(var9, Character.toUpperCase(var5.charAt(var9))); - var8 = 160; - } - } - - var5.reverse(); - var5.setCharAt(0, Character.toUpperCase(var5.charAt(0))); - return var5.toString(); - } - } else { - return null; - } + @ObfuscatedName("x") + @ObfuscatedSignature( + signature = "(I)Z", + garbageValue = "-320413166" + ) + boolean method1887() { + return (1073741824 & this.properties) != 0; } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IB)Ljava/lang/String;", - garbageValue = "118" + signature = "(IB)[B", + garbageValue = "-113" ) - @Export("colorStartTag") - static String colorStartTag(int var0) { - return ""; - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "-1827551520" - ) - public static int method1814(int var0, int var1) { - int var2 = var0 >>> 31; - return (var0 + var2) / var1 - var2; - } - - @ObfuscatedName("x") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1196159395" - ) - static int method1815(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - if (var0 == ScriptOpcodes.CC_GETTARGETMASK) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class2.method30(class2.getWidgetClickMask(var3)); - return 1; - } else if (var0 != ScriptOpcodes.CC_GETOP) { - if (var0 == ScriptOpcodes.CC_GETOPBASE) { - if (var3.dataText == null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.dataText; - } - - return 1; - } else { - return 2; - } - } else { - int var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - --var4; - if (var3.actions != null && var4 < var3.actions.length && var3.actions[var4] != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.actions[var4]; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } - } - - @ObfuscatedName("ga") - @ObfuscatedSignature( - signature = "(Lby;II)V", - garbageValue = "-310218201" - ) - @Export("getActorScreenLocation") - static final void getActorScreenLocation(Actor var0, int var1) { - PlayerAppearance.worldToScreen(var0.x, var0.y, var1); - } - - @ObfuscatedName("jj") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "1791021557" - ) - @Export("Clan_joinChat") - static final void Clan_joinChat(String var0) { - if (!var0.equals("")) { - PacketBufferNode var1 = InterfaceParent.getPacketBufferNode(ClientPacket.field2237, Client.packetWriter.isaacCipher); - var1.packetBuffer.writeByte(class268.stringCp1252NullTerminatedByteSize(var0)); - var1.packetBuffer.writeStringCp1252NullTerminated(var0); - Client.packetWriter.addNode(var1); - } + @Export("ByteArrayPool_getArray") + public static synchronized byte[] ByteArrayPool_getArray(int var0) { + return ByteArrayPool.ByteArrayPool_getArrayBool(var0, false); } } diff --git a/runescape-client/src/main/java/WorldMap.java b/runescape-client/src/main/java/WorldMap.java index 4f6d0e2954..5cfc358139 100644 --- a/runescape-client/src/main/java/WorldMap.java +++ b/runescape-client/src/main/java/WorldMap.java @@ -10,280 +10,280 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("la") +@ObfuscatedName("lo") @Implements("WorldMap") public class WorldMap { - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("fontNameVerdana11") static final FontName fontNameVerdana11; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("fontNameVerdana13") static final FontName fontNameVerdana13; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lko;" + signature = "Lkq;" ) @Export("fontNameVerdana15") static final FontName fontNameVerdana15; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("WorldMap_archive") AbstractArchive WorldMap_archive; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("WorldMap_geographyArchive") AbstractArchive WorldMap_geographyArchive; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("WorldMap_groundArchive") AbstractArchive WorldMap_groundArchive; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lkn;" + signature = "Lks;" ) @Export("font") Font font; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("fonts") HashMap fonts; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "[Llp;" + signature = "[Llw;" ) @Export("mapSceneSprites") IndexedSprite[] mapSceneSprites; - @ObfuscatedName("w") + @ObfuscatedName("j") @Export("details") HashMap details; - @ObfuscatedName("t") + @ObfuscatedName("r") @ObfuscatedSignature( - signature = "Lac;" + signature = "Laa;" ) @Export("mainMapArea") WorldMapArea mainMapArea; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "Lac;" + signature = "Laa;" ) @Export("currentMapArea") WorldMapArea currentMapArea; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "Lac;" + signature = "Laa;" ) - WorldMapArea field3960; - @ObfuscatedName("h") + WorldMapArea field3961; + @ObfuscatedName("b") @ObfuscatedSignature( - signature = "Lal;" + signature = "Lax;" ) @Export("worldMapManager") WorldMapManager worldMapManager; - @ObfuscatedName("s") + @ObfuscatedName("z") @ObfuscatedSignature( - signature = "Llj;" + signature = "Llp;" ) @Export("cacheLoader") WorldMapArchiveLoader cacheLoader; @ObfuscatedName("f") @ObfuscatedGetter( - intValue = 1954693049 + intValue = -1115855205 ) @Export("centerTileX") int centerTileX; - @ObfuscatedName("j") + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 1682895493 + intValue = 1468309867 ) @Export("centerTileY") int centerTileY; - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -1567029615 + intValue = -2095991867 ) @Export("worldMapTargetX") int worldMapTargetX; - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedGetter( - intValue = 1146650801 + intValue = 1762147861 ) @Export("worldMapTargetY") int worldMapTargetY; - @ObfuscatedName("k") + @ObfuscatedName("y") @Export("zoom") float zoom; - @ObfuscatedName("ac") + @ObfuscatedName("aa") @Export("zoomTarget") float zoomTarget; - @ObfuscatedName("az") + @ObfuscatedName("aw") @ObfuscatedGetter( - intValue = 1385726617 + intValue = -1569841957 ) @Export("worldMapDisplayWidth") int worldMapDisplayWidth; - @ObfuscatedName("aw") + @ObfuscatedName("ar") @ObfuscatedGetter( - intValue = -673171535 + intValue = -1341545561 ) @Export("worldMapDisplayHeight") int worldMapDisplayHeight; - @ObfuscatedName("aa") + @ObfuscatedName("aq") @ObfuscatedGetter( - intValue = 1837582351 + intValue = -447610921 ) @Export("worldMapDisplayX") int worldMapDisplayX; - @ObfuscatedName("ap") + @ObfuscatedName("ad") @ObfuscatedGetter( - intValue = 859234001 + intValue = -1038703537 ) @Export("worldMapDisplayY") int worldMapDisplayY; - @ObfuscatedName("ar") + @ObfuscatedName("ag") @ObfuscatedGetter( - intValue = -803250815 + intValue = -253795513 ) @Export("maxFlashCount") int maxFlashCount; - @ObfuscatedName("ab") + @ObfuscatedName("ak") @ObfuscatedGetter( - intValue = -1420038403 + intValue = 1556819123 ) @Export("cyclesPerFlash") int cyclesPerFlash; - @ObfuscatedName("ax") + @ObfuscatedName("av") @Export("perpetualFlash") boolean perpetualFlash; - @ObfuscatedName("as") + @ObfuscatedName("am") @Export("flashingElements") HashSet flashingElements; - @ObfuscatedName("ao") + @ObfuscatedName("ab") @ObfuscatedGetter( - intValue = -1316059479 + intValue = 1187879109 ) @Export("flashCount") int flashCount; - @ObfuscatedName("al") + @ObfuscatedName("ax") @ObfuscatedGetter( - intValue = 1480309149 + intValue = -2119672373 ) @Export("flashCycle") int flashCycle; - @ObfuscatedName("ad") + @ObfuscatedName("al") @ObfuscatedGetter( - intValue = 1563853833 + intValue = -1814154625 ) - int field3979; - @ObfuscatedName("an") + int field3944; + @ObfuscatedName("ap") @ObfuscatedGetter( - intValue = 50694755 + intValue = 2100622819 ) - int field3991; - @ObfuscatedName("ai") + int field3981; + @ObfuscatedName("aj") @ObfuscatedGetter( - intValue = 34575525 + intValue = 1563559575 ) - int field3957; - @ObfuscatedName("ak") - @ObfuscatedGetter( - intValue = 361888335 - ) - int field3982; - @ObfuscatedName("aq") - @ObfuscatedGetter( - longValue = 2458788586712283789L - ) - long field3983; - @ObfuscatedName("am") - @ObfuscatedGetter( - intValue = 329127117 - ) - int field3999; + int field4004; @ObfuscatedName("ae") @ObfuscatedGetter( - intValue = -1406947901 + intValue = -1136461167 ) - int field3985; - @ObfuscatedName("av") - boolean field3986; - @ObfuscatedName("aj") + int field3978; + @ObfuscatedName("au") + @ObfuscatedGetter( + longValue = -7919513397896744985L + ) + long field3984; + @ObfuscatedName("ah") + @ObfuscatedGetter( + intValue = 923626185 + ) + int field3982; + @ObfuscatedName("an") + @ObfuscatedGetter( + intValue = -1186283537 + ) + int field3963; + @ObfuscatedName("af") + boolean field3987; + @ObfuscatedName("ao") @Export("enabledElements") HashSet enabledElements; - @ObfuscatedName("ay") + @ObfuscatedName("ai") @Export("enabledCategories") HashSet enabledCategories; - @ObfuscatedName("au") + @ObfuscatedName("ac") @Export("enabledElementIds") HashSet enabledElementIds; - @ObfuscatedName("af") - HashSet field3993; @ObfuscatedName("at") + HashSet field3992; + @ObfuscatedName("as") @Export("elementsDisabled") boolean elementsDisabled; - @ObfuscatedName("bx") + @ObfuscatedName("ba") @ObfuscatedGetter( - intValue = -1409948611 + intValue = -600434803 ) - int field3990; - @ObfuscatedName("bd") + int field3994; + @ObfuscatedName("bc") @Export("menuOpcodes") final int[] menuOpcodes; - @ObfuscatedName("bm") - List field3995; - @ObfuscatedName("bv") + @ObfuscatedName("bd") + List field3996; + @ObfuscatedName("bx") @Export("iconIterator") Iterator iconIterator; - @ObfuscatedName("bj") - HashSet field3969; - @ObfuscatedName("bs") + @ObfuscatedName("bl") + HashSet field3998; + @ObfuscatedName("bh") @ObfuscatedSignature( - signature = "Lhb;" + signature = "Lhf;" ) @Export("mouseCoord") Coord mouseCoord; - @ObfuscatedName("bz") + @ObfuscatedName("bu") @Export("showCoord") public boolean showCoord; - @ObfuscatedName("bc") + @ObfuscatedName("br") @ObfuscatedSignature( - signature = "Llf;" + signature = "Llx;" ) @Export("sprite") Sprite sprite; - @ObfuscatedName("bk") + @ObfuscatedName("bq") @ObfuscatedGetter( - intValue = 111655549 + intValue = 1135924697 ) @Export("cachedPixelsPerTile") int cachedPixelsPerTile; - @ObfuscatedName("ba") + @ObfuscatedName("bi") @ObfuscatedGetter( - intValue = 2138854549 + intValue = 2064695481 ) @Export("minCachedTileX") int minCachedTileX; - @ObfuscatedName("bn") + @ObfuscatedName("be") @ObfuscatedGetter( - intValue = 84437289 + intValue = -211388965 ) @Export("minCachedTileY") int minCachedTileY; - @ObfuscatedName("be") + @ObfuscatedName("bt") @ObfuscatedGetter( - intValue = 162914603 + intValue = 1384297183 ) - int field4004; + int field4005; static { fontNameVerdana11 = FontName.FontName_verdana11; @@ -304,30 +304,30 @@ public class WorldMap { this.flashingElements = null; this.flashCount = -1; this.flashCycle = -1; - this.field3979 = -1; - this.field3991 = -1; - this.field3957 = -1; - this.field3982 = -1; - this.field3986 = true; + this.field3944 = -1; + this.field3981 = -1; + this.field4004 = -1; + this.field3978 = -1; + this.field3987 = true; this.enabledElements = new HashSet(); this.enabledCategories = new HashSet(); this.enabledElementIds = new HashSet(); - this.field3993 = new HashSet(); + this.field3992 = new HashSet(); this.elementsDisabled = false; - this.field3990 = 0; + this.field3994 = 0; this.menuOpcodes = new int[]{1008, 1009, 1010, 1011, 1012}; - this.field3969 = new HashSet(); + this.field3998 = new HashSet(); this.mouseCoord = null; this.showCoord = false; this.minCachedTileX = -1; this.minCachedTileY = -1; - this.field4004 = -1; + this.field4005 = -1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;Lhp;Lhp;Lkn;Ljava/util/HashMap;[Llp;B)V", - garbageValue = "1" + signature = "(Lhq;Lhq;Lhq;Lks;Ljava/util/HashMap;[Llw;I)V", + garbageValue = "1155853540" ) @Export("init") public void init(AbstractArchive var1, AbstractArchive var2, AbstractArchive var3, Font var4, HashMap var5, IndexedSprite[] var6) { @@ -341,7 +341,7 @@ public class WorldMap { this.fonts.put(WorldMapLabelSize.WorldMapLabelSize_medium, var5.get(fontNameVerdana13)); this.fonts.put(WorldMapLabelSize.WorldMapLabelSize_large, var5.get(fontNameVerdana15)); this.cacheLoader = new WorldMapArchiveLoader(var1); - int var7 = this.WorldMap_archive.getGroupId(WorldMapCacheName.field284.name); + int var7 = this.WorldMap_archive.getGroupId(WorldMapCacheName.field288.name); int[] var8 = this.WorldMap_archive.getGroupFileIds(var7); this.details = new HashMap(var8.length); @@ -356,22 +356,22 @@ public class WorldMap { } this.setCurrentMapArea(this.mainMapArea); - this.field3960 = null; + this.field3961 = null; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-2129173961" + ) + public void method6427() { + WorldMapRegion.WorldMapRegion_cachedSprites.demote(5); } @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-104" - ) - public void method6314() { - WorldMapRegion.WorldMapRegion_cachedSprites.demote(5); - } - - @ObfuscatedName("v") @ObfuscatedSignature( signature = "(IIZIIIII)V", - garbageValue = "1450154554" + garbageValue = "1492656677" ) @Export("onCycle") public void onCycle(int var1, int var2, boolean var3, int var4, int var5, int var6, int var7) { @@ -381,27 +381,27 @@ public class WorldMap { if (var3) { int var8 = (int)Math.ceil((double)((float)var6 / this.zoom)); int var9 = (int)Math.ceil((double)((float)var7 / this.zoom)); - List var10 = this.worldMapManager.method664(this.centerTileX - var8 / 2 - 1, this.centerTileY - var9 / 2 - 1, var8 / 2 + this.centerTileX + 1, var9 / 2 + this.centerTileY + 1, var4, var5, var6, var7, var1, var2); + List var10 = this.worldMapManager.method694(this.centerTileX - var8 / 2 - 1, this.centerTileY - var9 / 2 - 1, var8 / 2 + this.centerTileX + 1, var9 / 2 + this.centerTileY + 1, var4, var5, var6, var7, var1, var2); HashSet var11 = new HashSet(); Iterator var12; AbstractWorldMapIcon var13; ScriptEvent var14; WorldMapEvent var15; - for (var12 = var10.iterator(); var12.hasNext(); ParamDefinition.runScriptEvent(var14)) { + for (var12 = var10.iterator(); var12.hasNext(); GrandExchangeOfferAgeComparator.runScriptEvent(var14)) { var13 = (AbstractWorldMapIcon)var12.next(); var11.add(var13); var14 = new ScriptEvent(); var15 = new WorldMapEvent(var13.getElement(), var13.coord1, var13.coord2); var14.setArgs(new Object[]{var15, var1, var2}); - if (this.field3969.contains(var13)) { + if (this.field3998.contains(var13)) { var14.setType(17); } else { var14.setType(15); } } - var12 = this.field3969.iterator(); + var12 = this.field3998.iterator(); while (var12.hasNext()) { var13 = (AbstractWorldMapIcon)var12.next(); @@ -410,73 +410,82 @@ public class WorldMap { var15 = new WorldMapEvent(var13.getElement(), var13.coord1, var13.coord2); var14.setArgs(new Object[]{var15, var1, var2}); var14.setType(16); - ParamDefinition.runScriptEvent(var14); + GrandExchangeOfferAgeComparator.runScriptEvent(var14); } } - this.field3969 = var11; + this.field3998 = var11; } } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIZZI)V", - garbageValue = "-1491433552" + garbageValue = "-1358986047" ) - public void method6445(int var1, int var2, boolean var3, boolean var4) { - long var5 = class30.currentTimeMillis(); - this.method6305(var1, var2, var4, var5); + public void method6429(int var1, int var2, boolean var3, boolean var4) { + long var5 = PlayerAppearance.currentTimeMillis(); + this.method6501(var1, var2, var4, var5); if (!this.hasTarget() && (var4 || var3)) { if (var4) { - this.field3957 = var1; - this.field3982 = var2; - this.field3979 = this.centerTileX; - this.field3991 = this.centerTileY; + this.field4004 = var1; + this.field3978 = var2; + this.field3944 = this.centerTileX; + this.field3981 = this.centerTileY; } - if (this.field3979 != -1) { - int var7 = var1 - this.field3957; - int var8 = var2 - this.field3982; - this.setWorldMapPosition(this.field3979 - (int)((float)var7 / this.zoomTarget), (int)((float)var8 / this.zoomTarget) + this.field3991, false); + if (this.field3944 != -1) { + int var7 = var1 - this.field4004; + int var8 = var2 - this.field3978; + this.setWorldMapPosition(this.field3944 - (int)((float)var7 / this.zoomTarget), (int)((float)var8 / this.zoomTarget) + this.field3981, false); } } else { - this.method6269(); + this.method6434(); } if (var4) { - this.field3983 = var5; - this.field3999 = var1; - this.field3985 = var2; + this.field3984 = var5; + this.field3982 = var1; + this.field3963 = var2; } } - @ObfuscatedName("r") - void method6305(int var1, int var2, boolean var3, long var4) { + @ObfuscatedName("v") + void method6501(int var1, int var2, boolean var3, long var4) { if (this.currentMapArea != null) { int var6 = (int)((float)this.centerTileX + ((float)(var1 - this.worldMapDisplayX) - (float)this.getDisplayWith() * this.zoom / 2.0F) / this.zoom); int var7 = (int)((float)this.centerTileY - ((float)(var2 - this.worldMapDisplayY) - (float)this.getDisplayHeight() * this.zoom / 2.0F) / this.zoom); this.mouseCoord = this.currentMapArea.coord(var6 + this.currentMapArea.getRegionLowX() * 64, var7 + this.currentMapArea.getRegionLowY() * 64); if (this.mouseCoord != null && var3) { - boolean var8 = Client.staffModLevel >= 2; - if (var8 && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81]) { - class287.method5220(this.mouseCoord.x, this.mouseCoord.y, this.mouseCoord.plane, false); + int var9; + int var10; + if (PendingSpawn.method1854() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81]) { + int var13 = this.mouseCoord.x; + var9 = this.mouseCoord.y; + var10 = this.mouseCoord.plane; + PacketBufferNode var11 = SoundSystem.getPacketBufferNode(ClientPacket.field2228, Client.packetWriter.isaacCipher); + var11.packetBuffer.writeIntME(0); + var11.packetBuffer.writeByte(var10); + var11.packetBuffer.method5644(var9); + var11.packetBuffer.writeShortLE(var13); + Client.packetWriter.addNode(var11); } else { - boolean var9 = true; - if (this.field3986) { - int var10 = var1 - this.field3999; - int var11 = var2 - this.field3985; - if (var4 - this.field3983 > 500L || var10 < -25 || var10 > 25 || var11 < -25 || var11 > 25) { - var9 = false; + boolean var8 = true; + if (this.field3987) { + var9 = var1 - this.field3982; + var10 = var2 - this.field3963; + if (var4 - this.field3984 > 500L || var9 < -25 || var9 > 25 || var10 < -25 || var10 > 25) { + var8 = false; } } - if (var9) { - PacketBufferNode var12 = InterfaceParent.getPacketBufferNode(ClientPacket.field2253, Client.packetWriter.isaacCipher); - var12.packetBuffer.writeInt(this.mouseCoord.packed()); + if (var8) { + PacketBufferNode var12 = SoundSystem.getPacketBufferNode(ClientPacket.field2239, Client.packetWriter.isaacCipher); + var12.packetBuffer.method5655(this.mouseCoord.packed()); Client.packetWriter.addNode(var12); - this.field3983 = 0L; + this.field3984 = 0L; } } } @@ -486,18 +495,18 @@ public class WorldMap { } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1288599041" + signature = "(B)V", + garbageValue = "-9" ) @Export("smoothZoom") void smoothZoom() { - if (StudioGame.field3086 != null) { + if (GrandExchangeOfferWorldComparator.field30 != null) { this.zoom = this.zoomTarget; } else { if (this.zoom < this.zoomTarget) { - this.zoom = Math.min(this.zoomTarget, this.zoom + this.zoom / 30.0F); + this.zoom = Math.min(this.zoomTarget, this.zoom / 30.0F + this.zoom); } if (this.zoom > this.zoomTarget) { @@ -507,10 +516,10 @@ public class WorldMap { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1882207287" + garbageValue = "-346297372" ) @Export("scrollToTarget") void scrollToTarget() { @@ -526,7 +535,7 @@ public class WorldMap { } this.setWorldMapPosition(var1 + this.centerTileX, var2 + this.centerTileY, true); - if (this.worldMapTargetX == this.centerTileX && this.centerTileY == this.worldMapTargetY) { + if (this.centerTileX == this.worldMapTargetX && this.worldMapTargetY == this.centerTileY) { this.worldMapTargetX = -1; this.worldMapTargetY = -1; } @@ -534,48 +543,48 @@ public class WorldMap { } } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(IIZI)V", - garbageValue = "-1851971614" + garbageValue = "-1917059109" ) @Export("setWorldMapPosition") final void setWorldMapPosition(int var1, int var2, boolean var3) { this.centerTileX = var1; this.centerTileY = var2; - class30.currentTimeMillis(); + PlayerAppearance.currentTimeMillis(); if (var3) { - this.method6269(); + this.method6434(); } } - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "953529386" - ) - final void method6269() { - this.field3982 = -1; - this.field3957 = -1; - this.field3991 = -1; - this.field3979 = -1; - } - @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "2105912837" + ) + final void method6434() { + this.field3978 = -1; + this.field4004 = -1; + this.field3981 = -1; + this.field3944 = -1; + } + + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "259268213" + garbageValue = "-1225003150" ) @Export("hasTarget") boolean hasTarget() { return this.worldMapTargetX != -1 && this.worldMapTargetY != -1; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(IIII)Lac;", - garbageValue = "-621566969" + signature = "(IIII)Laa;", + garbageValue = "507723159" ) @Export("mapAreaAtCoord") public WorldMapArea mapAreaAtCoord(int var1, int var2, int var3) { @@ -593,12 +602,12 @@ public class WorldMap { return var5; } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(IIIZI)V", - garbageValue = "-2123284790" + signature = "(IIIZB)V", + garbageValue = "0" ) - public void method6272(int var1, int var2, int var3, boolean var4) { + public void method6437(int var1, int var2, int var3, boolean var4) { WorldMapArea var5 = this.mapAreaAtCoord(var1, var2, var3); if (var5 == null) { if (!var4) { @@ -609,8 +618,8 @@ public class WorldMap { } boolean var6 = false; - if (var5 != this.field3960 || var4) { - this.field3960 = var5; + if (var5 != this.field3961 || var4) { + this.field3961 = var5; this.setCurrentMapArea(var5); var6 = true; } @@ -621,10 +630,10 @@ public class WorldMap { } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1843160894" + garbageValue = "1878697498" ) @Export("setCurrentMapAreaId") public void setCurrentMapAreaId(int var1) { @@ -635,30 +644,30 @@ public class WorldMap { } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1549194975" + garbageValue = "-2059451696" ) @Export("currentMapAreaId") public int currentMapAreaId() { return this.currentMapArea == null ? -1 : this.currentMapArea.getId(); } - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(I)Lac;", - garbageValue = "-1891004879" + signature = "(I)Laa;", + garbageValue = "305086771" ) @Export("getCurrentMapArea") public WorldMapArea getCurrentMapArea() { return this.currentMapArea; } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "1608722350" + signature = "(Laa;I)V", + garbageValue = "-3278323" ) @Export("setCurrentMapArea") void setCurrentMapArea(WorldMapArea var1) { @@ -668,10 +677,10 @@ public class WorldMap { } } - @ObfuscatedName("h") + @ObfuscatedName("r") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "1970020075" + signature = "(Laa;B)V", + garbageValue = "1" ) @Export("initializeWorldMapManager") void initializeWorldMapManager(WorldMapArea var1) { @@ -680,12 +689,12 @@ public class WorldMap { this.cacheLoader.reset(this.currentMapArea.getInternalName()); } - @ObfuscatedName("s") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(Lac;Lhb;Lhb;ZI)V", - garbageValue = "-1837684354" + signature = "(Laa;Lhf;Lhf;ZI)V", + garbageValue = "-1095832709" ) - public void method6449(WorldMapArea var1, Coord var2, Coord var3, boolean var4) { + public void method6443(WorldMapArea var1, Coord var2, Coord var3, boolean var4) { if (var1 != null) { if (this.currentMapArea == null || var1 != this.currentMapArea) { this.initializeWorldMapManager(var1); @@ -700,10 +709,10 @@ public class WorldMap { } } - @ObfuscatedName("f") + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "(IIII)V", - garbageValue = "283727014" + signature = "(IIIB)V", + garbageValue = "29" ) @Export("jump") void jump(int var1, int var2, int var3) { @@ -718,16 +727,16 @@ public class WorldMap { this.worldMapTargetY = -1; this.zoom = this.getZoomFromPercentage(this.currentMapArea.getZoom()); this.zoomTarget = this.zoom; - this.field3995 = null; + this.field3996 = null; this.iconIterator = null; this.worldMapManager.clearIcons(); } } - @ObfuscatedName("j") + @ObfuscatedName("b") @ObfuscatedSignature( signature = "(IIIIII)V", - garbageValue = "-2026264211" + garbageValue = "1999151785" ) @Export("draw") public void draw(int var1, int var2, int var3, int var4, int var5) { @@ -764,15 +773,15 @@ public class WorldMap { boolean var10; if (!this.elementsDisabled) { var10 = false; - if (var5 - this.field3990 > 100) { - this.field3990 = var5; + if (var5 - this.field3994 > 100) { + this.field3994 = var5; var10 = true; } - this.worldMapManager.drawElements(this.centerTileX - var8 / 2, this.centerTileY - var9 / 2, var8 / 2 + this.centerTileX, var9 / 2 + this.centerTileY, var1, var2, var3 + var1, var2 + var4, this.field3993, this.flashingElements, this.flashCycle, this.cyclesPerFlash, var10); + this.worldMapManager.drawElements(this.centerTileX - var8 / 2, this.centerTileY - var9 / 2, var8 / 2 + this.centerTileX, var9 / 2 + this.centerTileY, var1, var2, var3 + var1, var2 + var4, this.field3992, this.flashingElements, this.flashCycle, this.cyclesPerFlash, var10); } - this.method6282(var1, var2, var3, var4, var8, var9); + this.method6447(var1, var2, var3, var4, var8, var9); var10 = Client.staffModLevel >= 2; if (var10 && this.showCoord && this.mouseCoord != null) { this.font.draw("Coord: " + this.mouseCoord, Rasterizer2D.Rasterizer2D_xClipStart + 10, Rasterizer2D.Rasterizer2D_yClipStart + 20, 16776960, -1); @@ -786,18 +795,18 @@ public class WorldMap { } } - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(IIIIIII)Z", - garbageValue = "-219082293" + signature = "(IIIIIIS)Z", + garbageValue = "-18315" ) - boolean method6336(int var1, int var2, int var3, int var4, int var5, int var6) { + boolean method6446(int var1, int var2, int var3, int var4, int var5, int var6) { if (this.sprite == null) { return true; } else if (this.sprite.subWidth == var1 && this.sprite.subHeight == var2) { if (this.worldMapManager.pixelsPerTile != this.cachedPixelsPerTile) { return true; - } else if (this.field4004 != Client.field905) { + } else if (this.field4005 != Client.field900) { return true; } else if (var3 <= 0 && var4 <= 0) { return var3 + var1 < var5 || var2 + var4 < var6; @@ -809,13 +818,13 @@ public class WorldMap { } } - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedSignature( signature = "(IIIIIIB)V", - garbageValue = "-51" + garbageValue = "1" ) - void method6282(int var1, int var2, int var3, int var4, int var5, int var6) { - if (StudioGame.field3086 != null) { + void method6447(int var1, int var2, int var3, int var4, int var5, int var6) { + if (GrandExchangeOfferWorldComparator.field30 != null) { int var7 = 512 / (this.worldMapManager.pixelsPerTile * 2); int var8 = var3 + 512; int var9 = var4 + 512; @@ -826,7 +835,7 @@ public class WorldMap { int var12 = this.getDisplayY() - var6 / 2 - var7; int var13 = var1 - (var11 + var7 - this.minCachedTileX) * this.worldMapManager.pixelsPerTile; int var14 = var2 - this.worldMapManager.pixelsPerTile * (var7 - (var12 - this.minCachedTileY)); - if (this.method6336(var8, var9, var13, var14, var3, var4)) { + if (this.method6446(var8, var9, var13, var14, var3, var4)) { if (this.sprite != null && this.sprite.subWidth == var8 && this.sprite.subHeight == var9) { Arrays.fill(this.sprite.pixels, 0); } else { @@ -836,26 +845,26 @@ public class WorldMap { this.minCachedTileX = this.getDisplayX() - var5 / 2 - var7; this.minCachedTileY = this.getDisplayY() - var6 / 2 - var7; this.cachedPixelsPerTile = this.worldMapManager.pixelsPerTile; - StudioGame.field3086.method4303(this.minCachedTileX, this.minCachedTileY, this.sprite, (float)this.cachedPixelsPerTile / var10); - this.field4004 = Client.field905; - var13 = var1 - (var7 + var11 - this.minCachedTileX) * this.worldMapManager.pixelsPerTile; + GrandExchangeOfferWorldComparator.field30.method4478(this.minCachedTileX, this.minCachedTileY, this.sprite, (float)this.cachedPixelsPerTile / var10); + this.field4005 = Client.field900; + var13 = var1 - (var11 + var7 - this.minCachedTileX) * this.worldMapManager.pixelsPerTile; var14 = var2 - this.worldMapManager.pixelsPerTile * (var7 - (var12 - this.minCachedTileY)); } Rasterizer2D.Rasterizer2D_fillRectangleAlpha(var1, var2, var3, var4, 0, 128); if (1.0F == var10) { - this.sprite.method6082(var13, var14, 192); + this.sprite.method6257(var13, var14, 192); } else { - this.sprite.method6085(var13, var14, (int)(var10 * (float)var8), (int)((float)var9 * var10), 192); + this.sprite.method6260(var13, var14, (int)(var10 * (float)var8), (int)((float)var9 * var10), 192); } } } - @ObfuscatedName("k") + @ObfuscatedName("ad") @ObfuscatedSignature( signature = "(IIIII)V", - garbageValue = "2080480921" + garbageValue = "2116267919" ) @Export("drawOverview") public void drawOverview(int var1, int var2, int var3, int var4) { @@ -871,20 +880,20 @@ public class WorldMap { } } - @ObfuscatedName("ac") + @ObfuscatedName("ag") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-182850463" + garbageValue = "-393192636" ) @Export("setZoomPercentage") public void setZoomPercentage(int var1) { this.zoomTarget = this.getZoomFromPercentage(var1); } - @ObfuscatedName("aa") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(IIIIII)V", - garbageValue = "-715174082" + signature = "(IIIIIB)V", + garbageValue = "126" ) @Export("drawLoading") void drawLoading(int var1, int var2, int var3, int var4, int var5) { @@ -897,10 +906,10 @@ public class WorldMap { this.font.drawCentered("Loading...", var7, var6 + var8, -1, -1); } - @ObfuscatedName("ap") + @ObfuscatedName("av") @ObfuscatedSignature( signature = "(II)F", - garbageValue = "-1053679854" + garbageValue = "-2137739054" ) @Export("getZoomFromPercentage") float getZoomFromPercentage(int var1) { @@ -917,10 +926,10 @@ public class WorldMap { } } - @ObfuscatedName("ar") + @ObfuscatedName("am") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-76" + signature = "(S)I", + garbageValue = "-25355" ) @Export("getZoomLevel") public int getZoomLevel() { @@ -928,7 +937,7 @@ public class WorldMap { return 25; } else if ((double)this.zoomTarget == 1.5D) { return 37; - } else if (2.0D == (double)this.zoomTarget) { + } else if ((double)this.zoomTarget == 2.0D) { return 50; } else if ((double)this.zoomTarget == 3.0D) { return 75; @@ -940,7 +949,7 @@ public class WorldMap { @ObfuscatedName("ab") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1380141937" + garbageValue = "1442346244" ) @Export("loadCache") public void loadCache() { @@ -950,17 +959,17 @@ public class WorldMap { @ObfuscatedName("ax") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-1475229253" + garbageValue = "833800696" ) @Export("isCacheLoaded") public boolean isCacheLoaded() { return this.cacheLoader.isLoaded(); } - @ObfuscatedName("as") + @ObfuscatedName("al") @ObfuscatedSignature( - signature = "(II)Lac;", - garbageValue = "1869906825" + signature = "(II)Laa;", + garbageValue = "2121241878" ) @Export("getMapArea") public WorldMapArea getMapArea(int var1) { @@ -978,10 +987,10 @@ public class WorldMap { return var3; } - @ObfuscatedName("ao") + @ObfuscatedName("ap") @ObfuscatedSignature( signature = "(III)V", - garbageValue = "368218253" + garbageValue = "-1991378608" ) @Export("setWorldMapPositionTarget") public void setWorldMapPositionTarget(int var1, int var2) { @@ -991,10 +1000,10 @@ public class WorldMap { } } - @ObfuscatedName("al") + @ObfuscatedName("aj") @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "-63" + signature = "(III)V", + garbageValue = "829538752" ) @Export("setWorldMapPositionTargetInstant") public void setWorldMapPositionTargetInstant(int var1, int var2) { @@ -1005,10 +1014,10 @@ public class WorldMap { } } - @ObfuscatedName("ad") + @ObfuscatedName("ae") @ObfuscatedSignature( - signature = "(IIII)V", - garbageValue = "-1606645646" + signature = "(IIIB)V", + garbageValue = "1" ) @Export("jumpToSourceCoord") public void jumpToSourceCoord(int var1, int var2, int var3) { @@ -1021,10 +1030,10 @@ public class WorldMap { } } - @ObfuscatedName("an") + @ObfuscatedName("au") @ObfuscatedSignature( - signature = "(IIIB)V", - garbageValue = "-123" + signature = "(IIII)V", + garbageValue = "512586439" ) @Export("jumpToSourceCoordInstant") public void jumpToSourceCoordInstant(int var1, int var2, int var3) { @@ -1037,60 +1046,60 @@ public class WorldMap { } } - @ObfuscatedName("ai") + @ObfuscatedName("ah") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1574035017" + signature = "(B)I", + garbageValue = "56" ) @Export("getDisplayX") public int getDisplayX() { return this.currentMapArea == null ? -1 : this.centerTileX + this.currentMapArea.getRegionLowX() * 64; } - @ObfuscatedName("ak") + @ObfuscatedName("an") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "73" + signature = "(I)I", + garbageValue = "-1028872941" ) @Export("getDisplayY") public int getDisplayY() { return this.currentMapArea == null ? -1 : this.centerTileY + this.currentMapArea.getRegionLowY() * 64; } - @ObfuscatedName("aq") + @ObfuscatedName("af") @ObfuscatedSignature( - signature = "(I)Lhb;", - garbageValue = "45330133" + signature = "(B)Lhf;", + garbageValue = "47" ) @Export("getDisplayCoord") public Coord getDisplayCoord() { return this.currentMapArea == null ? null : this.currentMapArea.coord(this.getDisplayX(), this.getDisplayY()); } - @ObfuscatedName("am") + @ObfuscatedName("ay") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "29" + signature = "(S)I", + garbageValue = "3411" ) @Export("getDisplayWith") public int getDisplayWith() { return this.worldMapDisplayWidth; } - @ObfuscatedName("ae") + @ObfuscatedName("az") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-913448953" + garbageValue = "1238412576" ) @Export("getDisplayHeight") public int getDisplayHeight() { return this.worldMapDisplayHeight; } - @ObfuscatedName("av") + @ObfuscatedName("ao") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "-582916792" + garbageValue = "108171617" ) @Export("setMaxFlashCount") public void setMaxFlashCount(int var1) { @@ -1100,20 +1109,20 @@ public class WorldMap { } - @ObfuscatedName("ah") + @ObfuscatedName("ai") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-46547597" + garbageValue = "2121545973" ) @Export("resetMaxFlashCount") public void resetMaxFlashCount() { this.maxFlashCount = 3; } - @ObfuscatedName("ag") + @ObfuscatedName("ac") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1061983788" + signature = "(IB)V", + garbageValue = "8" ) @Export("setCyclesPerFlash") public void setCyclesPerFlash(int var1) { @@ -1123,30 +1132,30 @@ public class WorldMap { } - @ObfuscatedName("aj") + @ObfuscatedName("at") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-996390323" + garbageValue = "1046981397" ) @Export("resetCyclesPerFlash") public void resetCyclesPerFlash() { this.cyclesPerFlash = 50; } - @ObfuscatedName("ay") + @ObfuscatedName("as") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "87961823" + garbageValue = "-548793337" ) @Export("setPerpetualFlash") public void setPerpetualFlash(boolean var1) { this.perpetualFlash = var1; } - @ObfuscatedName("au") + @ObfuscatedName("ba") @ObfuscatedSignature( signature = "(IB)V", - garbageValue = "43" + garbageValue = "-17" ) @Export("flashElement") public void flashElement(int var1) { @@ -1156,10 +1165,10 @@ public class WorldMap { this.flashCycle = 0; } - @ObfuscatedName("af") + @ObfuscatedName("bg") @ObfuscatedSignature( signature = "(IB)V", - garbageValue = "52" + garbageValue = "-62" ) @Export("flashCategory") public void flashCategory(int var1) { @@ -1167,38 +1176,38 @@ public class WorldMap { this.flashCount = 0; this.flashCycle = 0; - for (int var2 = 0; var2 < WorldMapElement.WorldMapElement_count; ++var2) { - if (Decimator.WorldMapElement_get(var2) != null && Decimator.WorldMapElement_get(var2).category == var1) { - this.flashingElements.add(Decimator.WorldMapElement_get(var2).objectId); + for (int var2 = 0; var2 < AbstractByteArrayCopier.WorldMapElement_count; ++var2) { + if (class65.WorldMapElement_get(var2) != null && class65.WorldMapElement_get(var2).category == var1) { + this.flashingElements.add(class65.WorldMapElement_get(var2).objectId); } } } - @ObfuscatedName("at") + @ObfuscatedName("bc") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-20" + signature = "(I)V", + garbageValue = "1280820785" ) @Export("stopCurrentFlashes") public void stopCurrentFlashes() { this.flashingElements = null; } - @ObfuscatedName("bx") + @ObfuscatedName("bd") @ObfuscatedSignature( signature = "(ZI)V", - garbageValue = "1945794085" + garbageValue = "-1680492621" ) @Export("setElementsDisabled") public void setElementsDisabled(boolean var1) { this.elementsDisabled = !var1; } - @ObfuscatedName("bh") + @ObfuscatedName("bx") @ObfuscatedSignature( - signature = "(IZS)V", - garbageValue = "128" + signature = "(IZI)V", + garbageValue = "-441268139" ) @Export("disableElement") public void disableElement(int var1, boolean var2) { @@ -1208,13 +1217,13 @@ public class WorldMap { this.enabledElements.remove(var1); } - this.method6270(); + this.method6479(); } - @ObfuscatedName("bd") + @ObfuscatedName("bl") @ObfuscatedSignature( signature = "(IZI)V", - garbageValue = "1967881085" + garbageValue = "67555081" ) @Export("setCategoryDisabled") public void setCategoryDisabled(int var1, boolean var2) { @@ -1224,9 +1233,9 @@ public class WorldMap { this.enabledCategories.remove(var1); } - for (int var3 = 0; var3 < WorldMapElement.WorldMapElement_count; ++var3) { - if (Decimator.WorldMapElement_get(var3) != null && Decimator.WorldMapElement_get(var3).category == var1) { - int var4 = Decimator.WorldMapElement_get(var3).objectId; + for (int var3 = 0; var3 < AbstractByteArrayCopier.WorldMapElement_count; ++var3) { + if (class65.WorldMapElement_get(var3) != null && class65.WorldMapElement_get(var3).category == var1) { + int var4 = class65.WorldMapElement_get(var3).objectId; if (!var2) { this.enabledElementIds.add(var4); } else { @@ -1235,61 +1244,61 @@ public class WorldMap { } } - this.method6270(); + this.method6479(); } - @ObfuscatedName("bm") + @ObfuscatedName("bh") @ObfuscatedSignature( - signature = "(B)Z", - garbageValue = "7" + signature = "(I)Z", + garbageValue = "1055531969" ) @Export("getElementsDisabled") public boolean getElementsDisabled() { return !this.elementsDisabled; } - @ObfuscatedName("bv") + @ObfuscatedName("bu") @ObfuscatedSignature( - signature = "(IS)Z", - garbageValue = "15242" + signature = "(II)Z", + garbageValue = "-83150813" ) @Export("isElementDisabled") public boolean isElementDisabled(int var1) { return !this.enabledElements.contains(var1); } - @ObfuscatedName("bj") + @ObfuscatedName("br") @ObfuscatedSignature( - signature = "(IB)Z", - garbageValue = "0" + signature = "(II)Z", + garbageValue = "289990921" ) @Export("isCategoryDisabled") public boolean isCategoryDisabled(int var1) { return !this.enabledCategories.contains(var1); } - @ObfuscatedName("bs") + @ObfuscatedName("bq") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1172651735" + signature = "(S)V", + garbageValue = "180" ) - void method6270() { - this.field3993.clear(); - this.field3993.addAll(this.enabledElements); - this.field3993.addAll(this.enabledElementIds); + void method6479() { + this.field3992.clear(); + this.field3992.addAll(this.enabledElements); + this.field3992.addAll(this.enabledElementIds); } - @ObfuscatedName("bz") + @ObfuscatedName("bi") @ObfuscatedSignature( - signature = "(IIIIIIB)V", - garbageValue = "-67" + signature = "(IIIIIII)V", + garbageValue = "-962932589" ) @Export("addElementMenuOptions") public void addElementMenuOptions(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)); int var8 = (int)Math.ceil((double)((float)var4 / this.zoom)); - List var9 = this.worldMapManager.method664(this.centerTileX - var7 / 2 - 1, this.centerTileY - var8 / 2 - 1, var7 / 2 + this.centerTileX + 1, var8 / 2 + this.centerTileY + 1, var1, var2, var3, var4, var5, var6); + List var9 = this.worldMapManager.method694(this.centerTileX - var7 / 2 - 1, this.centerTileY - var8 / 2 - 1, var7 / 2 + this.centerTileX + 1, var8 / 2 + this.centerTileY + 1, var1, var2, var3, var4, var5, var6); if (!var9.isEmpty()) { Iterator var10 = var9.iterator(); @@ -1300,12 +1309,12 @@ public class WorldMap { } AbstractWorldMapIcon var11 = (AbstractWorldMapIcon)var10.next(); - WorldMapElement var12 = Decimator.WorldMapElement_get(var11.getElement()); + WorldMapElement var12 = class65.WorldMapElement_get(var11.getElement()); var13 = false; for (int var14 = this.menuOpcodes.length - 1; var14 >= 0; --var14) { if (var12.menuActions[var14] != null) { - WorldMapData_1.insertMenuItemNoShift(var12.menuActions[var14], var12.menuTargetName, this.menuOpcodes[var14], var11.getElement(), var11.coord1.packed(), var11.coord2.packed()); + GameObject.insertMenuItemNoShift(var12.menuActions[var14], var12.menuTargetName, this.menuOpcodes[var14], var11.getElement(), var11.coord1.packed(), var11.coord2.packed()); var13 = true; } } @@ -1315,12 +1324,12 @@ public class WorldMap { } } - @ObfuscatedName("bc") + @ObfuscatedName("be") @ObfuscatedSignature( - signature = "(ILhb;I)Lhb;", - garbageValue = "1301957345" + signature = "(ILhf;I)Lhf;", + garbageValue = "-744470907" ) - public Coord method6316(int var1, Coord var2) { + public Coord method6481(int var1, Coord var2) { if (!this.cacheLoader.isLoaded()) { return null; } else if (!this.worldMapManager.isLoaded()) { @@ -1361,10 +1370,10 @@ public class WorldMap { } } - @ObfuscatedName("bk") + @ObfuscatedName("bt") @ObfuscatedSignature( - signature = "(IILhb;Lhb;I)V", - garbageValue = "-94159159" + signature = "(IILhf;Lhf;B)V", + garbageValue = "0" ) @Export("menuAction") public void menuAction(int var1, int var2, Coord var3, Coord var4) { @@ -1388,13 +1397,13 @@ public class WorldMap { var5.setType(14); } - ParamDefinition.runScriptEvent(var5); + GrandExchangeOfferAgeComparator.runScriptEvent(var5); } - @ObfuscatedName("ba") + @ObfuscatedName("bs") @ObfuscatedSignature( - signature = "(I)Las;", - garbageValue = "975625926" + signature = "(I)Lam;", + garbageValue = "-1043988683" ) @Export("iconStart") public AbstractWorldMapIcon iconStart() { @@ -1404,23 +1413,23 @@ public class WorldMap { return null; } else { HashMap var1 = this.worldMapManager.buildIcons(); - this.field3995 = new LinkedList(); + this.field3996 = new LinkedList(); Iterator var2 = var1.values().iterator(); while (var2.hasNext()) { List var3 = (List)var2.next(); - this.field3995.addAll(var3); + this.field3996.addAll(var3); } - this.iconIterator = this.field3995.iterator(); + this.iconIterator = this.field3996.iterator(); return this.iconNext(); } } - @ObfuscatedName("bn") + @ObfuscatedName("bj") @ObfuscatedSignature( - signature = "(I)Las;", - garbageValue = "497923892" + signature = "(B)Lam;", + garbageValue = "-116" ) @Export("iconNext") public AbstractWorldMapIcon iconNext() { diff --git a/runescape-client/src/main/java/WorldMapArchiveLoader.java b/runescape-client/src/main/java/WorldMapArchiveLoader.java index 828544b864..e08514078a 100644 --- a/runescape-client/src/main/java/WorldMapArchiveLoader.java +++ b/runescape-client/src/main/java/WorldMapArchiveLoader.java @@ -4,30 +4,30 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lj") +@ObfuscatedName("lp") @Implements("WorldMapArchiveLoader") public class WorldMapArchiveLoader { - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("cacheName") String cacheName; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("archive") AbstractArchive archive; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1787474783 + intValue = -1799315399 ) @Export("percentLoaded") int percentLoaded; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("loaded") boolean loaded; @ObfuscatedSignature( - signature = "(Lhp;)V" + signature = "(Lhq;)V" ) WorldMapArchiveLoader(AbstractArchive var1) { this.percentLoaded = 0; @@ -35,10 +35,10 @@ public class WorldMapArchiveLoader { this.archive = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/lang/String;B)V", - garbageValue = "98" + signature = "(Ljava/lang/String;I)V", + garbageValue = "926060886" ) @Export("reset") void reset(String var1) { @@ -52,10 +52,10 @@ public class WorldMapArchiveLoader { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1938361839" + garbageValue = "-910181849" ) @Export("load") int load() { @@ -68,7 +68,7 @@ public class WorldMapArchiveLoader { } if (this.percentLoaded == 33) { - if (this.archive.isValidFileName(WorldMapCacheName.field283.name, this.cacheName) && !this.archive.tryLoadFileByNames(WorldMapCacheName.field283.name, this.cacheName)) { + if (this.archive.isValidFileName(WorldMapCacheName.field290.name, this.cacheName) && !this.archive.tryLoadFileByNames(WorldMapCacheName.field290.name, this.cacheName)) { return this.percentLoaded; } @@ -76,7 +76,7 @@ public class WorldMapArchiveLoader { } if (this.percentLoaded == 66) { - if (!this.archive.tryLoadFileByNames(this.cacheName, WorldMapCacheName.field287.name)) { + if (!this.archive.tryLoadFileByNames(this.cacheName, WorldMapCacheName.field292.name)) { return this.percentLoaded; } @@ -87,20 +87,20 @@ public class WorldMapArchiveLoader { return this.percentLoaded; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "741397645" + signature = "(B)Z", + garbageValue = "71" ) @Export("isLoaded") boolean isLoaded() { return this.loaded; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1707041754" + signature = "(B)I", + garbageValue = "25" ) @Export("getPercentLoaded") int getPercentLoaded() { diff --git a/runescape-client/src/main/java/WorldMapArea.java b/runescape-client/src/main/java/WorldMapArea.java index b4f9b2e3ab..22aa1ac3d6 100644 --- a/runescape-client/src/main/java/WorldMapArea.java +++ b/runescape-client/src/main/java/WorldMapArea.java @@ -6,72 +6,79 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ac") +@ObfuscatedName("aa") @Implements("WorldMapArea") public class WorldMapArea { - @ObfuscatedName("bn") - @ObfuscatedGetter( - intValue = 1141206621 + @ObfuscatedName("gw") + @ObfuscatedSignature( + signature = "Lek;" ) - static int field218; - @ObfuscatedName("z") + @Export("scene") + static Scene scene; + @ObfuscatedName("ji") + @ObfuscatedSignature( + signature = "Ldp;" + ) + @Export("textureProvider") + static TextureProvider textureProvider; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -321078873 + intValue = 868338681 ) @Export("id") int id; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("internalName") String internalName; - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("externalName") String externalName; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 795826291 + intValue = -1095915325 ) @Export("backGroundColor") int backGroundColor; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1782121101 + intValue = -320134037 ) @Export("zoom") int zoom; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lhb;" + signature = "Lhf;" ) @Export("origin") Coord origin; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 546610083 + intValue = 1673329643 ) @Export("regionLowX") int regionLowX; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 178341683 + intValue = -693512733 ) @Export("regionHighX") int regionHighX; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -1886608901 + intValue = 1263754187 ) @Export("regionLowY") int regionLowY; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -1084185477 + intValue = -1155919979 ) @Export("regionHighY") int regionHighY; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("isMain") boolean isMain; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("sections") LinkedList sections; @@ -87,10 +94,10 @@ public class WorldMapArea { this.isMain = false; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-2114218332" + signature = "(Lkc;II)V", + garbageValue = "252507218" ) @Export("read") public void read(Buffer var1, int var2) { @@ -112,29 +119,29 @@ public class WorldMapArea { this.setBounds(); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;B)Lad;", - garbageValue = "-32" + signature = "(Lkc;I)Lal;", + garbageValue = "-45832181" ) @Export("readWorldMapSection") WorldMapSection readWorldMapSection(Buffer var1) { int var2 = var1.readUnsignedByte(); - WorldMapSectionType[] var3 = new WorldMapSectionType[]{WorldMapSectionType.WORLDMAPSECTIONTYPE0, WorldMapSectionType.WORLDMAPSECTIONTYPE2, WorldMapSectionType.WORLDMAPSECTIONTYPE3, WorldMapSectionType.WORLDMAPSECTIONTYPE1}; - WorldMapSectionType var4 = (WorldMapSectionType)NetSocket.findEnumerated(var3, var2); + WorldMapSectionType[] var3 = new WorldMapSectionType[]{WorldMapSectionType.WORLDMAPSECTIONTYPE1, WorldMapSectionType.WORLDMAPSECTIONTYPE3, WorldMapSectionType.WORLDMAPSECTIONTYPE0, WorldMapSectionType.WORLDMAPSECTIONTYPE2}; + WorldMapSectionType var4 = (WorldMapSectionType)WorldMapIcon_1.findEnumerated(var3, var2); Object var5 = null; switch(var4.type) { case 0: - var5 = new WorldMapSection2(); + var5 = new class42(); break; case 1: - var5 = new class42(); + var5 = new WorldMapSection1(); break; case 2: var5 = new WorldMapSection0(); break; case 3: - var5 = new WorldMapSection1(); + var5 = new WorldMapSection2(); break; default: throw new IllegalStateException(""); @@ -144,10 +151,10 @@ public class WorldMapArea { return (WorldMapSection)var5; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IIIS)Z", - garbageValue = "-5877" + signature = "(IIII)Z", + garbageValue = "1638730005" ) @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { @@ -165,10 +172,10 @@ public class WorldMapArea { return true; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-1223580997" + garbageValue = "-1462177792" ) @Export("containsPosition") public boolean containsPosition(int var1, int var2) { @@ -196,10 +203,10 @@ public class WorldMapArea { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(IIII)[I", - garbageValue = "-244878470" + signature = "(IIIB)[I", + garbageValue = "33" ) @Export("position") public int[] position(int var1, int var2, int var3) { @@ -217,10 +224,10 @@ public class WorldMapArea { return var5.getBorderTileLengths(var1, var2, var3); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IIS)Lhb;", - garbageValue = "4910" + signature = "(III)Lhf;", + garbageValue = "1597093580" ) @Export("coord") public Coord coord(int var1, int var2) { @@ -238,10 +245,10 @@ public class WorldMapArea { return var4.coord(var1, var2); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1572539094" + garbageValue = "2134546584" ) @Export("setBounds") void setBounds() { @@ -254,178 +261,143 @@ public class WorldMapArea { } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "5" + garbageValue = "-7" ) @Export("getId") public int getId() { return this.id; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "1098544212" + signature = "(B)Z", + garbageValue = "110" ) @Export("getIsMain") public boolean getIsMain() { return this.isMain; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(B)Ljava/lang/String;", - garbageValue = "-109" + garbageValue = "1" ) @Export("getInternalName") public String getInternalName() { return this.internalName; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(B)Ljava/lang/String;", - garbageValue = "24" + signature = "(I)Ljava/lang/String;", + garbageValue = "-1041016674" ) @Export("getExternalName") public String getExternalName() { return this.externalName; } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-614914706" + garbageValue = "1564084979" ) @Export("getBackGroundColor") int getBackGroundColor() { return this.backGroundColor; } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-441315832" + garbageValue = "2048902575" ) @Export("getZoom") public int getZoom() { return this.zoom; } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "1245166704" + garbageValue = "1802281108" ) @Export("getRegionLowX") public int getRegionLowX() { return this.regionLowX; } - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "895043593" + garbageValue = "-1688302004" ) @Export("getRegionHighX") public int getRegionHighX() { return this.regionHighX; } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1302627979" + garbageValue = "1785466127" ) @Export("getRegionLowY") public int getRegionLowY() { return this.regionLowY; } - @ObfuscatedName("h") + @ObfuscatedName("r") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-2005373633" + garbageValue = "-254845356" ) @Export("getRegionHighY") public int getRegionHighY() { return this.regionHighY; } - @ObfuscatedName("s") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-98" + signature = "(I)I", + garbageValue = "1396103207" ) @Export("getOriginX") public int getOriginX() { return this.origin.x; } - @ObfuscatedName("f") + @ObfuscatedName("s") @ObfuscatedSignature( signature = "(B)I", - garbageValue = "6" + garbageValue = "0" ) @Export("getOriginPlane") public int getOriginPlane() { return this.origin.plane; } - @ObfuscatedName("j") + @ObfuscatedName("b") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "87434352" + signature = "(B)I", + garbageValue = "1" ) @Export("getOriginY") public int getOriginY() { return this.origin.y; } - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(I)Lhb;", - garbageValue = "1917961065" + signature = "(I)Lhf;", + garbageValue = "773568512" ) @Export("getOrigin") public Coord getOrigin() { return new Coord(this.origin); } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lhp;Lhp;Lhp;I)V", - garbageValue = "-757431099" - ) - public static void method430(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2) { - HitSplatDefinition.HitSplatDefinition_archive = var0; - GrandExchangeOfferNameComparator.field66 = var1; - HitSplatDefinition.HitSplatDefinition_fontsArchive = var2; - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(ILkg;Lie;I)V", - garbageValue = "-1765321046" - ) - static void method429(int var0, ArchiveDisk var1, Archive var2) { - byte[] var3 = null; - synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue) { - for (ArchiveDiskAction var5 = (ArchiveDiskAction)ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.last(); var5 != null; var5 = (ArchiveDiskAction)ArchiveDiskActionHandler.ArchiveDiskActionHandler_requestQueue.previous()) { - if ((long)var0 == var5.key && var1 == var5.archiveDisk && var5.type == 0) { - var3 = var5.data; - break; - } - } - } - - if (var3 != null) { - var2.load(var1, var0, var3, true); - } else { - byte[] var4 = var1.read(var0); - var2.load(var1, var0, var4, true); - } - } } diff --git a/runescape-client/src/main/java/WorldMapAreaData.java b/runescape-client/src/main/java/WorldMapAreaData.java index 19d3f850b4..5c0bc1c42b 100644 --- a/runescape-client/src/main/java/WorldMapAreaData.java +++ b/runescape-client/src/main/java/WorldMapAreaData.java @@ -3,30 +3,43 @@ import java.util.LinkedList; import java.util.List; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("an") +@ObfuscatedName("ap") @Implements("WorldMapAreaData") public class WorldMapAreaData extends WorldMapArea { - @ObfuscatedName("o") + @ObfuscatedName("qe") + @ObfuscatedGetter( + intValue = 333326797 + ) + static int field323; + @ObfuscatedName("ew") + @Export("worldHost") + static String worldHost; + @ObfuscatedName("er") + @ObfuscatedGetter( + intValue = 837015313 + ) + static int field329; + @ObfuscatedName("h") @Export("worldMapData0Set") HashSet worldMapData0Set; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("worldMapData1Set") HashSet worldMapData1Set; - @ObfuscatedName("e") + @ObfuscatedName("x") @Export("iconList") List iconList; WorldMapAreaData() { } - @ObfuscatedName("cs") + @ObfuscatedName("co") @ObfuscatedSignature( - signature = "(Lkl;Lkl;IZI)V", - garbageValue = "608966722" + signature = "(Lkc;Lkc;IZI)V", + garbageValue = "-146974626" ) @Export("init") void init(Buffer var1, Buffer var2, int var3, boolean var4) { @@ -65,10 +78,10 @@ public class WorldMapAreaData extends WorldMapArea { this.initIconsList(var2, var4); } - @ObfuscatedName("cg") + @ObfuscatedName("cu") @ObfuscatedSignature( - signature = "(Lkl;ZI)V", - garbageValue = "-317910906" + signature = "(Lkc;ZB)V", + garbageValue = "114" ) @Export("initIconsList") void initIconsList(Buffer var1, boolean var2) { @@ -76,7 +89,7 @@ public class WorldMapAreaData extends WorldMapArea { int var3 = var1.readUnsignedShort(); for (int var4 = 0; var4 < var3; ++var4) { - int var5 = var1.method5453(); + int var5 = var1.method5638(); Coord var6 = new Coord(var1.readInt()); boolean var7 = var1.readUnsignedByte() == 1; if (var2 || !var7) { @@ -86,215 +99,65 @@ public class WorldMapAreaData extends WorldMapArea { } - @ObfuscatedName("p") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "-2123139883" + signature = "(Lhq;IIB)Llw;", + garbageValue = "-96" ) - static void method717(int var0) { - ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); - if (var1 != null) { - var1.remove(); - } - } - - @ObfuscatedName("ab") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-442086498" - ) - static int method716(int var0, Script var1, boolean var2) { - int var3; - int var4; - if (var0 == ScriptOpcodes.ADD) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4 + var3; - return 1; - } else if (var0 == ScriptOpcodes.SUB) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 - var4; - return 1; - } else if (var0 == ScriptOpcodes.MULTIPLY) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4 * var3; - return 1; - } else if (var0 == ScriptOpcodes.DIV) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 / var4; - return 1; - } else if (var0 == ScriptOpcodes.RANDOM) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)var3); - return 1; - } else if (var0 == ScriptOpcodes.RANDOMINC) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)(Math.random() * (double)(var3 + 1)); - return 1; - } else if (var0 == ScriptOpcodes.INTERPOLATE) { - Interpreter.Interpreter_intStackSize -= 5; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - int var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - int var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 4]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 + (var4 - var3) * (var7 - var5) / (var6 - var5); - return 1; - } else if (var0 == ScriptOpcodes.ADDPERCENT) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 + var4 * var3 / 100; - return 1; - } else if (var0 == ScriptOpcodes.SETBIT) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 | 1 << var4; - return 1; - } else if (var0 == ScriptOpcodes.CLEARBIT) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 & -1 - (1 << var4); - return 1; - } else if (var0 == ScriptOpcodes.TESTBIT) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var3 & 1 << var4) != 0 ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.MOD) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 % var4; - return 1; - } else if (var0 == ScriptOpcodes.POW) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - if (var3 == 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, (double)var4); - } - - return 1; - } else if (var0 == ScriptOpcodes.INVPOW) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - if (var3 == 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - return 1; - } else { - switch(var4) { - case 0: - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Integer.MAX_VALUE; - break; - case 1: - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; - break; - case 2: - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.sqrt((double)var3); - break; - case 3: - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.cbrt((double)var3); - break; - case 4: - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.sqrt(Math.sqrt((double)var3)); - break; - default: - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)Math.pow((double)var3, 1.0D / (double)var4); - } - - return 1; - } - } else if (var0 == ScriptOpcodes.AND) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 & var4; - return 1; - } else if (var0 == ScriptOpcodes.OR) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3 | var4; - return 1; - } else if (var0 == ScriptOpcodes.SCALE) { - Interpreter.Interpreter_intStackSize -= 3; - long var9 = (long)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - long var11 = (long)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - long var13 = (long)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (int)(var9 * var13 / var11); - return 1; + static IndexedSprite method762(AbstractArchive var0, int var1, int var2) { + if (!class32.method618(var0, var1, var2)) { + return null; } else { - return 2; + IndexedSprite var4 = new IndexedSprite(); + var4.width = class325.SpriteBuffer_spriteWidth; + var4.height = class325.SpriteBuffer_spriteHeight; + var4.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[0]; + var4.yOffset = HealthBar.SpriteBuffer_yOffsets[0]; + var4.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[0]; + var4.subHeight = AttackOption.SpriteBuffer_spriteHeights[0]; + var4.palette = class325.SpriteBuffer_spritePalette; + var4.pixels = class325.SpriteBuffer_pixels[0]; + WorldMapData_1.method787(); + return var4; } } - @ObfuscatedName("ev") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lie;Ljava/lang/String;I)V", - garbageValue = "-1244242871" + signature = "(B)[Lge;", + garbageValue = "-90" ) - static void method718(Archive var0, String var1) { - ArchiveLoader var2 = new ArchiveLoader(var0, var1); - Client.archiveLoaders.add(var2); - Client.field908 += var2.groupCount; + public static class185[] method763() { + return new class185[]{class185.field2296, class185.field2292, class185.field2293, class185.field2294, class185.field2295, class185.field2291, class185.field2298, class185.field2297, class185.field2299, class185.field2300}; } - @ObfuscatedName("id") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lho;IIIIIII)V", - garbageValue = "-1006882337" + signature = "(IIB)I", + garbageValue = "59" ) - static final void method719(Widget var0, int var1, int var2, int var3, int var4, int var5, int var6) { - if (Client.field703) { - Client.alternativeScrollbarWidth = 32; + @Export("ItemContainer_getCount") + static int ItemContainer_getCount(int var0, int var1) { + ItemContainer var2 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var2 == null) { + return 0; } else { - Client.alternativeScrollbarWidth = 0; + return var1 >= 0 && var1 < var2.quantities.length ? var2.quantities[var1] : 0; } + } - Client.field703 = false; - int var7; - if (MouseHandler.MouseHandler_currentButton == 1 || !WorldMapIcon_1.mouseCam && MouseHandler.MouseHandler_currentButton == 4) { - if (var5 >= var1 && var5 < var1 + 16 && var6 >= var2 && var6 < var2 + 16) { - var0.scrollY -= 4; - WorldMapSectionType.invalidateWidget(var0); - } else if (var5 >= var1 && var5 < var1 + 16 && var6 >= var3 + var2 - 16 && var6 < var3 + var2) { - var0.scrollY += 4; - WorldMapSectionType.invalidateWidget(var0); - } else if (var5 >= var1 - Client.alternativeScrollbarWidth && var5 < Client.alternativeScrollbarWidth + var1 + 16 && var6 >= var2 + 16 && var6 < var3 + var2 - 16) { - var7 = var3 * (var3 - 32) / var4; - if (var7 < 8) { - var7 = 8; - } - - int var8 = var6 - var2 - 16 - var7 / 2; - int var9 = var3 - 32 - var7; - var0.scrollY = var8 * (var4 - var3) / var9; - WorldMapSectionType.invalidateWidget(var0); - Client.field703 = true; - } - } - - if (Client.mouseWheelRotation != 0) { - var7 = var0.width; - if (var5 >= var1 - var7 && var6 >= var2 && var5 < var1 + 16 && var6 <= var3 + var2) { - var0.scrollY += Client.mouseWheelRotation * 45; - WorldMapSectionType.invalidateWidget(var0); + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(CI)Z", + garbageValue = "1229220823" + ) + static boolean method755(char var0) { + for (int var1 = 0; var1 < "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".length(); ++var1) { + if (var0 == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".charAt(var1)) { + return true; } } + return false; } } diff --git a/runescape-client/src/main/java/WorldMapCacheName.java b/runescape-client/src/main/java/WorldMapCacheName.java index 1dd3f19558..5ddb4abaaf 100644 --- a/runescape-client/src/main/java/WorldMapCacheName.java +++ b/runescape-client/src/main/java/WorldMapCacheName.java @@ -1,117 +1,183 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ao") +@ObfuscatedName("ab") @Implements("WorldMapCacheName") public class WorldMapCacheName { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lao;" + signature = "Lab;" ) - public static final WorldMapCacheName field284; - @ObfuscatedName("n") + public static final WorldMapCacheName field288; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lao;" + signature = "Lab;" ) public static final WorldMapCacheName field289; + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "Lab;" + ) + public static final WorldMapCacheName field290; + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "Lab;" + ) + static final WorldMapCacheName field298; @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lao;" + signature = "Lab;" ) - public static final WorldMapCacheName field283; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lao;" - ) - static final WorldMapCacheName field285; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lao;" - ) - public static final WorldMapCacheName field287; - @ObfuscatedName("ay") - @ObfuscatedGetter( - intValue = 1366497929 - ) - static int field286; - @ObfuscatedName("p") + public static final WorldMapCacheName field292; + @ObfuscatedName("gu") + @Export("regionLandArchiveIds") + static int[] regionLandArchiveIds; + @ObfuscatedName("l") @Export("name") public final String name; static { - field284 = new WorldMapCacheName("details"); + field288 = new WorldMapCacheName("details"); field289 = new WorldMapCacheName("compositemap"); - field283 = new WorldMapCacheName("compositetexture"); - field285 = new WorldMapCacheName("area"); - field287 = new WorldMapCacheName("labels"); + field290 = new WorldMapCacheName("compositetexture"); + field298 = new WorldMapCacheName("area"); + field292 = new WorldMapCacheName("labels"); } WorldMapCacheName(String var1) { this.name = var1; } - @ObfuscatedName("b") + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(IIIII)V", + garbageValue = "-1535608049" + ) + @Export("itemContainerSetItem") + static void itemContainerSetItem(int var0, int var1, int var2, int var3) { + ItemContainer var4 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var4 == null) { + var4 = new ItemContainer(); + ItemContainer.itemContainers.put(var4, (long)var0); + } + + if (var4.ids.length <= var1) { + int[] var5 = new int[var1 + 1]; + int[] var6 = new int[var1 + 1]; + + int var7; + for (var7 = 0; var7 < var4.ids.length; ++var7) { + var5[var7] = var4.ids[var7]; + var6[var7] = var4.quantities[var7]; + } + + for (var7 = var4.ids.length; var7 < var1; ++var7) { + var5[var7] = -1; + var6[var7] = 0; + } + + var4.ids = var5; + var4.quantities = var6; + } + + var4.ids[var1] = var2; + var4.quantities[var1] = var3; + } + + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1512894139" + garbageValue = "-887333641" ) - static final void method644() { - EnumDefinition.method4508("Your ignore list is full. Max of 100 for free users, and 400 for members"); + public static void method682() { + KitDefinition.KitDefinition_cached.clear(); } - @ObfuscatedName("ht") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "2059241635" + signature = "(Lhi;IB)V", + garbageValue = "-113" ) - @Export("updateItemPile") - static final void updateItemPile(int var0, int var1) { - NodeDeque var2 = Client.groundItems[WorldMapRectangle.plane][var0][var1]; - if (var2 == null) { - PacketWriter.scene.removeGroundItemPile(WorldMapRectangle.plane, var0, var1); + @Export("Widget_setKeyIgnoreHeld") + static final void Widget_setKeyIgnoreHeld(Widget var0, int var1) { + if (var0.field2623 == null) { + throw new RuntimeException(); } else { - long var3 = -99999999L; - TileItem var5 = null; - - TileItem var6; - for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) { - ItemDefinition var7 = Occluder.ItemDefinition_get(var6.id); - long var8 = (long)var7.price; - if (var7.isStackable == 1) { - var8 *= (long)(var6.quantity + 1); - } - - if (var8 > var3) { - var3 = var8; - var5 = var6; - } + if (var0.field2627 == null) { + var0.field2627 = new int[var0.field2623.length]; } - if (var5 == null) { - PacketWriter.scene.removeGroundItemPile(WorldMapRectangle.plane, var0, var1); - } else { - var2.addLast(var5); - TileItem var12 = null; - TileItem var11 = null; - - for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) { - if (var5.id != var6.id) { - if (var12 == null) { - var12 = var6; - } - - if (var6.id != var12.id && var11 == null) { - var11 = var6; - } - } - } - - long var9 = class267.calculateTag(var0, var1, 3, false, 0); - PacketWriter.scene.newGroundItemPile(WorldMapRectangle.plane, var0, var1, MusicPatchPcmStream.getTileHeight(var0 * 128 + 64, var1 * 128 + 64, WorldMapRectangle.plane), var5, var9, var12, var11); - } + var0.field2627[var1] = Integer.MAX_VALUE; } } + + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "-1095915325" + ) + static final int method686(int var0, int var1) { + if (var0 == -1) { + return 12345678; + } else { + var1 = (var0 & 127) * var1 / 128; + if (var1 < 2) { + var1 = 2; + } else if (var1 > 126) { + var1 = 126; + } + + return (var0 & 65408) + var1; + } + } + + @ObfuscatedName("hb") + @ObfuscatedSignature( + signature = "(IIIB)V", + garbageValue = "6" + ) + @Export("worldToScreen") + static final void worldToScreen(int var0, int var1, int var2) { + if (var0 >= 128 && var1 >= 128 && var0 <= 13056 && var1 <= 13056) { + int var3 = GraphicsObject.getTileHeight(var0, var1, Player.Scene_plane) - var2; + var0 -= UrlRequester.cameraX; + var3 -= class16.cameraY; + var1 -= GrandExchangeOfferAgeComparator.cameraZ; + int var4 = Rasterizer3D.Rasterizer3D_sine[class247.cameraPitch]; + int var5 = Rasterizer3D.Rasterizer3D_cosine[class247.cameraPitch]; + int var6 = Rasterizer3D.Rasterizer3D_sine[WorldMapData_1.cameraYaw]; + int var7 = Rasterizer3D.Rasterizer3D_cosine[WorldMapData_1.cameraYaw]; + int var8 = var6 * var1 + var0 * var7 >> 16; + var1 = var7 * var1 - var0 * var6 >> 16; + var0 = var8; + var8 = var3 * var5 - var4 * var1 >> 16; + var1 = var4 * var3 + var5 * var1 >> 16; + if (var1 >= 50) { + Client.viewportTempX = var0 * Client.viewportZoom / var1 + Client.viewportWidth / 2; + Client.viewportTempY = Client.viewportHeight / 2 + var8 * Client.viewportZoom / var1; + } else { + Client.viewportTempX = -1; + Client.viewportTempY = -1; + } + + } else { + Client.viewportTempX = -1; + Client.viewportTempY = -1; + } + } + + @ObfuscatedName("ig") + @ObfuscatedSignature( + signature = "(IIS)Lfc;", + garbageValue = "-31136" + ) + static RouteStrategy method685(int var0, int var1) { + Client.field904.approxDestinationX = var0; + Client.field904.approxDestinationY = var1; + Client.field904.approxDestinationSizeX = 1; + Client.field904.approxDestinationSizeY = 1; + return Client.field904; + } } diff --git a/runescape-client/src/main/java/WorldMapData_0.java b/runescape-client/src/main/java/WorldMapData_0.java index e53aa1e1bd..5fe67afb28 100644 --- a/runescape-client/src/main/java/WorldMapData_0.java +++ b/runescape-client/src/main/java/WorldMapData_0.java @@ -1,44 +1,30 @@ -import java.util.Date; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("w") +@ObfuscatedName("j") @Implements("WorldMapData_0") public class WorldMapData_0 extends AbstractWorldMapData { - @ObfuscatedName("sz") - @ObfuscatedSignature( - signature = "Lkg;" + @ObfuscatedName("eb") + @ObfuscatedGetter( + intValue = -186180581 ) - @Export("masterDisk") - static ArchiveDisk masterDisk; - @ObfuscatedName("ex") - @ObfuscatedSignature( - signature = "Lkw;" - ) - @Export("spriteIds") - static GraphicsDefaults spriteIds; - @ObfuscatedName("gz") - @ObfuscatedSignature( - signature = "[Llp;" - ) - @Export("modIconSprites") - static IndexedSprite[] modIconSprites; + static int field92; WorldMapData_0() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-443857335" + signature = "(Lkc;I)V", + garbageValue = "-1969161905" ) @Export("init") void init(Buffer var1) { int var2 = var1.readUnsignedByte(); - if (var2 != WorldMapID.field256.value) { + if (var2 != WorldMapID.field259.value) { throw new IllegalStateException(""); } else { super.minPlane = var1.readUnsignedByte(); @@ -47,26 +33,26 @@ public class WorldMapData_0 extends AbstractWorldMapData { super.regionYLow = var1.readUnsignedShort() * 4096; super.regionX = var1.readUnsignedShort(); super.regionY = var1.readUnsignedShort(); - super.groupId = var1.method5453(); - super.fileId = var1.method5453(); + super.groupId = var1.method5638(); + super.fileId = var1.method5638(); } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1549979331" + signature = "(Lkc;I)V", + garbageValue = "1045041620" ) @Export("readGeography") void readGeography(Buffer var1) { super.planes = Math.min(super.planes, 4); super.floorUnderlayIds = new short[1][64][64]; super.floorOverlayIds = new short[super.planes][64][64]; - super.field164 = new byte[super.planes][64][64]; - super.field152 = new byte[super.planes][64][64]; + super.field161 = new byte[super.planes][64][64]; + super.field157 = new byte[super.planes][64][64]; super.decorations = new WorldMapDecoration[super.planes][64][64][]; int var2 = var1.readUnsignedByte(); - if (var2 != class30.field253.value) { + if (var2 != class30.field251.value) { throw new IllegalStateException(""); } else { int var3 = var1.readUnsignedByte(); @@ -99,368 +85,67 @@ public class WorldMapData_0 extends AbstractWorldMapData { @ObfuscatedName("v") @ObfuscatedSignature( - signature = "([Lbo;II[I[IB)V", - garbageValue = "59" + signature = "(IZI)Ljava/lang/String;", + garbageValue = "1507052882" ) - @Export("sortWorlds") - static void sortWorlds(World[] var0, int var1, int var2, int[] var3, int[] var4) { - if (var1 < var2) { - int var5 = var1 - 1; - int var6 = var2 + 1; - int var7 = (var2 + var1) / 2; - World var8 = var0[var7]; - var0[var7] = var0[var1]; - var0[var1] = var8; + @Export("intToString") + public static String intToString(int var0, boolean var1) { + if (var1 && var0 >= 0) { + int var3 = var0; + String var2; + if (var1 && var0 >= 0) { + int var4 = 2; - while (var5 < var6) { - boolean var9 = true; - - int var10; - int var11; - int var12; - do { - --var6; - - for (var10 = 0; var10 < 4; ++var10) { - if (var3[var10] == 2) { - var11 = var0[var6].index; - var12 = var8.index; - } else if (var3[var10] == 1) { - var11 = var0[var6].population; - var12 = var8.population; - if (var11 == -1 && var4[var10] == 1) { - var11 = 2001; - } - - if (var12 == -1 && var4[var10] == 1) { - var12 = 2001; - } - } else if (var3[var10] == 3) { - var11 = var0[var6].isMembersOnly() ? 1 : 0; - var12 = var8.isMembersOnly() ? 1 : 0; - } else { - var11 = var0[var6].id; - var12 = var8.id; - } - - if (var11 != var12) { - if ((var4[var10] != 1 || var11 <= var12) && (var4[var10] != 0 || var11 >= var12)) { - var9 = false; - } - break; - } - - if (var10 == 3) { - var9 = false; - } - } - } while(var9); - - var9 = true; - - do { - ++var5; - - for (var10 = 0; var10 < 4; ++var10) { - if (var3[var10] == 2) { - var11 = var0[var5].index; - var12 = var8.index; - } else if (var3[var10] == 1) { - var11 = var0[var5].population; - var12 = var8.population; - if (var11 == -1 && var4[var10] == 1) { - var11 = 2001; - } - - if (var12 == -1 && var4[var10] == 1) { - var12 = 2001; - } - } else if (var3[var10] == 3) { - var11 = var0[var5].isMembersOnly() ? 1 : 0; - var12 = var8.isMembersOnly() ? 1 : 0; - } else { - var11 = var0[var5].id; - var12 = var8.id; - } - - if (var12 != var11) { - if ((var4[var10] != 1 || var11 >= var12) && (var4[var10] != 0 || var11 <= var12)) { - var9 = false; - } - break; - } - - if (var10 == 3) { - var9 = false; - } - } - } while(var9); - - if (var5 < var6) { - World var13 = var0[var5]; - var0[var5] = var0[var6]; - var0[var6] = var13; - } - } - - sortWorlds(var0, var1, var6, var3, var4); - sortWorlds(var0, var6 + 1, var2, var3, var4); - } - - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "387088123" - ) - @Export("loadInterface") - public static boolean loadInterface(int var0) { - if (ViewportMouse.Widget_loadedInterfaces[var0]) { - return true; - } else if (!Widget.Widget_archive.tryLoadGroup(var0)) { - return false; - } else { - int var1 = Widget.Widget_archive.getGroupFileCount(var0); - if (var1 == 0) { - ViewportMouse.Widget_loadedInterfaces[var0] = true; - return true; - } else { - if (UserComparator5.Widget_interfaceComponents[var0] == null) { - UserComparator5.Widget_interfaceComponents[var0] = new Widget[var1]; + for (int var5 = var0 / 10; var5 != 0; ++var4) { + var5 /= 10; } - for (int var2 = 0; var2 < var1; ++var2) { - if (UserComparator5.Widget_interfaceComponents[var0][var2] == null) { - byte[] var3 = Widget.Widget_archive.takeFile(var0, var2); - if (var3 != null) { - UserComparator5.Widget_interfaceComponents[var0][var2] = new Widget(); - UserComparator5.Widget_interfaceComponents[var0][var2].id = var2 + (var0 << 16); - if (var3[0] == -1) { - UserComparator5.Widget_interfaceComponents[var0][var2].decode(new Buffer(var3)); - } else { - UserComparator5.Widget_interfaceComponents[var0][var2].decodeLegacy(new Buffer(var3)); - } - } - } - } + char[] var6 = new char[var4]; + var6[0] = '+'; - ViewportMouse.Widget_loadedInterfaces[var0] = true; - return true; - } - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(ILhp;Ljava/lang/String;Ljava/lang/String;IZS)V", - garbageValue = "6590" - ) - public static void method194(int var0, AbstractArchive var1, String var2, String var3, int var4, boolean var5) { - int var6 = var1.getGroupId(var2); - int var7 = var1.getFileId(var6, var3); - class197.field2386 = 1; - class197.musicTrackArchive = var1; - class188.musicTrackGroupId = var6; - class49.musicTrackFileId = var7; - TileItem.field1223 = var4; - WorldMapSectionType.musicTrackBoolean = var5; - MusicPatchNode2.field2382 = var0; - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;B)I", - garbageValue = "71" - ) - @Export("hashString") - public static int hashString(CharSequence var0) { - int var1 = var0.length(); - int var2 = 0; - - for (int var3 = 0; var3 < var1; ++var3) { - var2 = (var2 << 5) - var2 + Entity.charToByteCp1252(var0.charAt(var3)); - } - - return var2; - } - - @ObfuscatedName("ax") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1153827827" - ) - static int method177(int var0, Script var1, boolean var2) { - String var3; - int var4; - if (var0 == ScriptOpcodes.APPEND_NUM) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + var4; - return 1; - } else { - String var9; - if (var0 == ScriptOpcodes.APPEND) { - Interpreter.Interpreter_stringStackSize -= 2; - var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; - var9 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + var9; - return 1; - } else if (var0 == ScriptOpcodes.APPEND_SIGNNUM) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + HealthBar.intToString(var4, true); - return 1; - } else if (var0 == ScriptOpcodes.LOWERCASE) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.toLowerCase(); - return 1; - } else { - int var6; - int var10; - if (var0 == ScriptOpcodes.FROMDATE) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - long var11 = 86400000L * (11745L + (long)var10); - Interpreter.Interpreter_calendar.setTime(new Date(var11)); - var6 = Interpreter.Interpreter_calendar.get(5); - int var16 = Interpreter.Interpreter_calendar.get(2); - int var8 = Interpreter.Interpreter_calendar.get(1); - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var6 + "-" + Interpreter.Interpreter_MONTHS[var16] + "-" + var8; - return 1; - } else if (var0 != ScriptOpcodes.TEXT_GENDER) { - if (var0 == ScriptOpcodes.TOSTRING) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Integer.toString(var10); - return 1; - } else if (var0 == ScriptOpcodes.COMPARE) { - Interpreter.Interpreter_stringStackSize -= 2; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class189.method3615(Interpreter.compareStrings(Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize], Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1], WorldMapLabelSize.clientLanguage)); - return 1; + for (int var7 = var4 - 1; var7 > 0; --var7) { + int var8 = var3; + var3 /= 10; + int var9 = var8 - var3 * 10; + if (var9 >= 10) { + var6[var7] = (char)(var9 + 87); } else { - int var5; - byte[] var13; - Font var14; - if (var0 == ScriptOpcodes.PARAHEIGHT) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var13 = Tile.archive13.takeFile(var5, 0); - var14 = new Font(var13); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14.lineCount(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.PARAWIDTH) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var13 = Tile.archive13.takeFile(var5, 0); - var14 = new Font(var13); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14.lineWidth(var3, var4); - return 1; - } else if (var0 == ScriptOpcodes.TEXT_SWITCH) { - Interpreter.Interpreter_stringStackSize -= 2; - var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; - var9 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var9; - } - - return 1; - } else if (var0 == ScriptOpcodes.ESCAPE) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = AbstractFont.escapeBrackets(var3); - return 1; - } else if (var0 == ScriptOpcodes.APPEND_CHAR) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3 + (char)var4; - return 1; - } else if (var0 == ScriptOpcodes.CHAR_ISPRINTABLE) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = TileItem.isCharPrintable((char)var10) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CHAR_ISALPHANUMERIC) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AbstractArchive.isAlphaNumeric((char)var10) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CHAR_ISALPHA) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator7.isCharAlphabetic((char)var10) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CHAR_ISNUMERIC) { - var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AbstractWorldMapIcon.isDigit((char)var10) ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.STRING_LENGTH) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - if (var3 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.length(); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } else if (var0 == ScriptOpcodes.SUBSTRING) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_intStackSize -= 2; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.substring(var4, var5); - return 1; - } else if (var0 == ScriptOpcodes.REMOVETAGS) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - StringBuilder var17 = new StringBuilder(var3.length()); - boolean var15 = false; - - for (var6 = 0; var6 < var3.length(); ++var6) { - char var7 = var3.charAt(var6); - if (var7 == '<') { - var15 = true; - } else if (var7 == '>') { - var15 = false; - } else if (!var15) { - var17.append(var7); - } - } - - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var17.toString(); - return 1; - } else if (var0 == ScriptOpcodes.STRING_INDEXOF_CHAR) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.indexOf(var4); - return 1; - } else if (var0 == ScriptOpcodes.STRING_INDEXOF_STRING) { - Interpreter.Interpreter_stringStackSize -= 2; - var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; - var9 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.indexOf(var9, var5); - return 1; - } else if (var0 == ScriptOpcodes.UPPERCASE) { - var3 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.toUpperCase(); - return 1; - } else { - return 2; - } + var6[var7] = (char)(var9 + 48); } - } else { - Interpreter.Interpreter_stringStackSize -= 2; - var3 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize]; - var9 = Interpreter.Interpreter_stringStack[Interpreter.Interpreter_stringStackSize + 1]; - if (class223.localPlayer.appearance != null && class223.localPlayer.appearance.isFemale) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var9; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3; - } - - return 1; } + + var2 = new String(var6); + } else { + var2 = Integer.toString(var0, 10); } + + return var2; + } else { + return Integer.toString(var0); + } + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(B)Lbk;", + garbageValue = "106" + ) + @Export("worldListStart") + static World worldListStart() { + World.World_listCount = 0; + return class1.getNextWorldListWorld(); + } + + @ObfuscatedName("li") + @ObfuscatedSignature( + signature = "(Lhi;II)Ljava/lang/String;", + garbageValue = "-1155704748" + ) + static String method210(Widget var0, int var1) { + if (!ModelData0.method3379(class195.getWidgetClickMask(var0), var1) && var0.onOp == null) { + return null; + } else { + return var0.actions != null && var0.actions.length > var1 && var0.actions[var1] != null && var0.actions[var1].trim().length() != 0 ? var0.actions[var1] : null; } } } diff --git a/runescape-client/src/main/java/WorldMapData_1.java b/runescape-client/src/main/java/WorldMapData_1.java index f614b0fe15..40fe83d4bb 100644 --- a/runescape-client/src/main/java/WorldMapData_1.java +++ b/runescape-client/src/main/java/WorldMapData_1.java @@ -3,38 +3,49 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ai") +@ObfuscatedName("aj") @Implements("WorldMapData_1") public class WorldMapData_1 extends AbstractWorldMapData { - @ObfuscatedName("dl") + @ObfuscatedName("sf") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lc;" ) - @Export("archive14") - static Archive archive14; - @ObfuscatedName("w") + @Export("grandExchangeEvents") + static GrandExchangeEvents grandExchangeEvents; + @ObfuscatedName("hv") @ObfuscatedGetter( - intValue = -537501083 + intValue = 1575560349 + ) + @Export("cameraYaw") + static int cameraYaw; + @ObfuscatedName("kb") + @ObfuscatedGetter( + intValue = 1504630099 + ) + @Export("menuHeight") + static int menuHeight; + @ObfuscatedName("j") + @ObfuscatedGetter( + intValue = 1445881523 ) @Export("chunkXLow") int chunkXLow; - @ObfuscatedName("t") + @ObfuscatedName("r") @ObfuscatedGetter( - intValue = 948345097 + intValue = 687230799 ) @Export("chunkYLow") int chunkYLow; - @ObfuscatedName("g") + @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 2091889323 + intValue = -218420461 ) @Export("chunkX") int chunkX; - @ObfuscatedName("x") + @ObfuscatedName("s") @ObfuscatedGetter( - intValue = 494582433 + intValue = 875111377 ) @Export("chunkY") int chunkY; @@ -42,10 +53,10 @@ public class WorldMapData_1 extends AbstractWorldMapData { WorldMapData_1() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-1114535893" + signature = "(Lkc;B)V", + garbageValue = "0" ) @Export("init") void init(Buffer var1) { @@ -63,26 +74,26 @@ public class WorldMapData_1 extends AbstractWorldMapData { super.regionY = var1.readUnsignedShort(); this.chunkX = var1.readUnsignedByte(); this.chunkY = var1.readUnsignedByte(); - super.groupId = var1.method5453(); - super.fileId = var1.method5453(); + super.groupId = var1.method5638(); + super.fileId = var1.method5638(); } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "1549979331" + signature = "(Lkc;I)V", + garbageValue = "1045041620" ) @Export("readGeography") void readGeography(Buffer var1) { super.planes = Math.min(super.planes, 4); super.floorUnderlayIds = new short[1][64][64]; super.floorOverlayIds = new short[super.planes][64][64]; - super.field164 = new byte[super.planes][64][64]; - super.field152 = new byte[super.planes][64][64]; + super.field161 = new byte[super.planes][64][64]; + super.field157 = new byte[super.planes][64][64]; super.decorations = new WorldMapDecoration[super.planes][64][64][]; int var2 = var1.readUnsignedByte(); - if (var2 != class30.field250.value) { + if (var2 != class30.field249.value) { throw new IllegalStateException(""); } else { int var3 = var1.readUnsignedByte(); @@ -102,52 +113,56 @@ public class WorldMapData_1 extends AbstractWorldMapData { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "-57" + signature = "(I)I", + garbageValue = "2139324279" ) @Export("getChunkXLow") int getChunkXLow() { return this.chunkXLow; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-1398345797" + garbageValue = "-1481651643" ) @Export("getChunkYLow") int getChunkYLow() { return this.chunkYLow; } - @ObfuscatedName("an") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-273717009" + garbageValue = "-1549655791" ) @Export("getChunkX") int getChunkX() { return this.chunkX; } - @ObfuscatedName("ai") + @ObfuscatedName("aj") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "2022346742" + signature = "(B)I", + garbageValue = "104" ) @Export("getChunkY") int getChunkY() { return this.chunkY; } + public int hashCode() { + return super.regionX | super.regionY << 8 | this.chunkX << 16 | this.chunkY << 24; + } + public boolean equals(Object var1) { if (!(var1 instanceof WorldMapData_1)) { return false; } else { WorldMapData_1 var2 = (WorldMapData_1)var1; - if (var2.regionX == super.regionX && super.regionY == var2.regionY) { + if (super.regionX == var2.regionX && super.regionY == var2.regionY) { return var2.chunkX == this.chunkX && this.chunkY == var2.chunkY; } else { return false; @@ -155,75 +170,116 @@ public class WorldMapData_1 extends AbstractWorldMapData { } } - public int hashCode() { - return super.regionX | super.regionY << 8 | this.chunkX << 16 | this.chunkY << 24; - } - - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V", - garbageValue = "-1530516741" + signature = "(CB)B", + garbageValue = "-60" ) - @Export("addChatMessage") - static void addChatMessage(int var0, String var1, String var2, String var3) { - ChatChannel var4 = (ChatChannel)Messages.Messages_channels.get(var0); - if (var4 == null) { - var4 = new ChatChannel(); - Messages.Messages_channels.put(var0, var4); - } - - Message var5 = var4.addMessage(var0, var1, var2, var3); - Messages.Messages_hashTable.put(var5, (long)var5.count); - Messages.Messages_queue.add(var5); - Client.chatCycle = Client.cycleCntr; - } - - @ObfuscatedName("ad") - @ObfuscatedSignature( - signature = "(ILcu;ZB)I", - garbageValue = "43" - ) - static int method749(int var0, Script var1, boolean var2) { - int var3; - if (var0 == ScriptOpcodes.CAM_FORCEANGLE) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - int var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - if (!Client.isCameraLocked) { - Client.camAngleX = var3; - Client.camAngleY = var4; - } - - return 1; - } else if (var0 == ScriptOpcodes.CAM_GETANGLE_XA) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.camAngleX; - return 1; - } else if (var0 == ScriptOpcodes.CAM_GETANGLE_YA) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.camAngleY; - return 1; - } else if (var0 == ScriptOpcodes.CAM_SETFOLLOWHEIGHT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var3 < 0) { - var3 = 0; - } - - Client.camFollowHeight = var3; - return 1; - } else if (var0 == ScriptOpcodes.CAM_GETFOLLOWHEIGHT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.camFollowHeight; - return 1; + @Export("charToByteCp1252") + public static byte charToByteCp1252(char var0) { + byte var1; + if (var0 > 0 && var0 < 128 || var0 >= 160 && var0 <= 255) { + var1 = (byte)var0; + } else if (var0 == 8364) { + var1 = -128; + } else if (var0 == 8218) { + var1 = -126; + } else if (var0 == 402) { + var1 = -125; + } else if (var0 == 8222) { + var1 = -124; + } else if (var0 == 8230) { + var1 = -123; + } else if (var0 == 8224) { + var1 = -122; + } else if (var0 == 8225) { + var1 = -121; + } else if (var0 == 710) { + var1 = -120; + } else if (var0 == 8240) { + var1 = -119; + } else if (var0 == 352) { + var1 = -118; + } else if (var0 == 8249) { + var1 = -117; + } else if (var0 == 338) { + var1 = -116; + } else if (var0 == 381) { + var1 = -114; + } else if (var0 == 8216) { + var1 = -111; + } else if (var0 == 8217) { + var1 = -110; + } else if (var0 == 8220) { + var1 = -109; + } else if (var0 == 8221) { + var1 = -108; + } else if (var0 == 8226) { + var1 = -107; + } else if (var0 == 8211) { + var1 = -106; + } else if (var0 == 8212) { + var1 = -105; + } else if (var0 == 732) { + var1 = -104; + } else if (var0 == 8482) { + var1 = -103; + } else if (var0 == 353) { + var1 = -102; + } else if (var0 == 8250) { + var1 = -101; + } else if (var0 == 339) { + var1 = -100; + } else if (var0 == 382) { + var1 = -98; + } else if (var0 == 376) { + var1 = -97; } else { - return 2; + var1 = 63; } + + return var1; } - @ObfuscatedName("hw") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;IIIII)V", - garbageValue = "108879926" + signature = "(I)V", + garbageValue = "-1236464487" ) - @Export("insertMenuItemNoShift") - public static final void insertMenuItemNoShift(String var0, String var1, int var2, int var3, int var4, int var5) { - AttackOption.insertMenuItem(var0, var1, var2, var3, var4, var5, false); + public static void method787() { + SecureRandomFuture.SpriteBuffer_xOffsets = null; + HealthBar.SpriteBuffer_yOffsets = null; + SecureRandomCallable.SpriteBuffer_spriteWidths = null; + AttackOption.SpriteBuffer_spriteHeights = null; + class325.SpriteBuffer_spritePalette = null; + class325.SpriteBuffer_pixels = null; + } + + @ObfuscatedName("gf") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "104" + ) + static final void method767() { + int var0 = Players.Players_count; + int[] var1 = Players.Players_indices; + + for (int var2 = 0; var2 < var0; ++var2) { + Player var3 = Client.players[var1[var2]]; + if (var3 != null) { + HitSplatDefinition.calculateActorPosition(var3, 1); + } + } + + } + + @ObfuscatedName("js") + @ObfuscatedSignature( + signature = "(I)Z", + garbageValue = "-175974338" + ) + @Export("getTapToDrop") + static boolean getTapToDrop() { + return Client.tapToDrop; } } diff --git a/runescape-client/src/main/java/WorldMapDecoration.java b/runescape-client/src/main/java/WorldMapDecoration.java index 4a36426872..cb2d574d51 100644 --- a/runescape-client/src/main/java/WorldMapDecoration.java +++ b/runescape-client/src/main/java/WorldMapDecoration.java @@ -4,30 +4,36 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("k") +@ObfuscatedName("y") @Implements("WorldMapDecoration") public class WorldMapDecoration { - @ObfuscatedName("kw") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -1785453027 + intValue = 1903758255 ) - @Export("menuHeight") - static int menuHeight; - @ObfuscatedName("z") + @Export("Interpreter_stringStackSize") + static int Interpreter_stringStackSize; + @ObfuscatedName("de") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive18") + static Archive archive18; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -865323619 + intValue = -1209347133 ) @Export("objectDefinitionId") final int objectDefinitionId; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 1850610867 + intValue = 255177035 ) @Export("decoration") final int decoration; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1741054453 + intValue = 1587770673 ) @Export("rotation") final int rotation; @@ -38,136 +44,309 @@ public class WorldMapDecoration { this.rotation = var3; } - @ObfuscatedName("z") - static boolean method346(long var0) { - return Client.method1708(var0) == 2; - } - - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)[Lgw;", - garbageValue = "1443955115" + signature = "(Lln;I)I", + garbageValue = "793189835" ) - public static class185[] method348() { - return new class185[]{class185.field2299, class185.field2300, class185.field2298, class185.field2297, class185.field2295, class185.field2296, class185.field2301, class185.field2302, class185.field2303, class185.field2304}; - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "-9791286" - ) - static int method344(int var0, int var1) { - ItemContainer var2 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); - if (var2 == null) { - return -1; + public static final int method388(LoginType var0) { + if (var0 == null) { + return 12; } else { - return var1 >= 0 && var1 < var2.ids.length ? var2.ids[var1] : -1; - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(Lie;IIIBZI)V", - garbageValue = "199205492" - ) - @Export("requestNetFile") - static void requestNetFile(Archive var0, int var1, int var2, int var3, byte var4, boolean var5) { - long var6 = (long)((var1 << 16) + var2); - NetFileRequest var8 = (NetFileRequest)NetCache.NetCache_pendingPriorityWrites.get(var6); - if (var8 == null) { - var8 = (NetFileRequest)NetCache.NetCache_pendingPriorityResponses.get(var6); - if (var8 == null) { - var8 = (NetFileRequest)NetCache.NetCache_pendingWrites.get(var6); - if (var8 != null) { - if (var5) { - var8.removeDual(); - NetCache.NetCache_pendingPriorityWrites.put(var8, var6); - --NetCache.NetCache_pendingWritesCount; - ++NetCache.NetCache_pendingPriorityWritesCount; - } - - } else { - if (!var5) { - var8 = (NetFileRequest)NetCache.NetCache_pendingResponses.get(var6); - if (var8 != null) { - return; - } - } - - var8 = new NetFileRequest(); - var8.archive = var0; - var8.crc = var3; - var8.padding = var4; - if (var5) { - NetCache.NetCache_pendingPriorityWrites.put(var8, var6); - ++NetCache.NetCache_pendingPriorityWritesCount; - } else { - NetCache.NetCache_pendingWritesQueue.addFirst(var8); - NetCache.NetCache_pendingWrites.put(var8, var6); - ++NetCache.NetCache_pendingWritesCount; - } - - } + switch(var0.field4033) { + case 8: + return 20; + default: + return 12; } } } - @ObfuscatedName("p") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-917346374" + signature = "(II)Lis;", + garbageValue = "-1932549468" ) - static void method349() { - Messages.Messages_channels.clear(); - Messages.Messages_hashTable.clear(); - Messages.Messages_queue.clear(); - Messages.Messages_count = 0; + @Export("FloorUnderlayDefinition_get") + public static FloorOverlayDefinition FloorUnderlayDefinition_get(int var0) { + FloorOverlayDefinition var1 = (FloorOverlayDefinition)FloorOverlayDefinition.FloorOverlayDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = FloorOverlayDefinition.FloorOverlayDefinition_archive.takeFile(4, var0); + var1 = new FloorOverlayDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2), var0); + } + + var1.postDecode(); + FloorOverlayDefinition.FloorOverlayDefinition_cached.put(var1, (long)var0); + return var1; + } } - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "2081647418" - ) - static final int method347(int var0, int var1) { - int var2 = WorldMapLabelSize.method202(45365 + var0, var1 + 91923, 4) - 128 + (WorldMapLabelSize.method202(10294 + var0, 37821 + var1, 2) - 128 >> 1) + (WorldMapLabelSize.method202(var0, var1, 1) - 128 >> 2); - var2 = (int)((double)var2 * 0.3D) + 35; - if (var2 < 10) { - var2 = 10; - } else if (var2 > 60) { - var2 = 60; - } + @ObfuscatedName("t") + @Export("base37DecodeLong") + public static String base37DecodeLong(long var0) { + if (var0 > 0L && var0 < 6582952005840035281L) { + if (var0 % 37L == 0L) { + return null; + } else { + int var2 = 0; - return var2; + for (long var3 = var0; var3 != 0L; var3 /= 37L) { + ++var2; + } + + StringBuilder var5; + char var8; + for (var5 = new StringBuilder(var2); var0 != 0L; var5.append(var8)) { + long var6 = var0; + var0 /= 37L; + var8 = class288.base37Table[(int)(var6 - var0 * 37L)]; + if (var8 == '_') { + int var9 = var5.length() - 1; + var5.setCharAt(var9, Character.toUpperCase(var5.charAt(var9))); + var8 = 160; + } + } + + var5.reverse(); + var5.setCharAt(0, Character.toUpperCase(var5.charAt(0))); + return var5.toString(); + } + } else { + return null; + } } - @ObfuscatedName("l") + @ObfuscatedName("gt") @ObfuscatedSignature( - signature = "(Lcf;B)V", - garbageValue = "0" + signature = "(Lbz;I)V", + garbageValue = "1724378098" ) - public static final void method345(PcmPlayerProvider var0) { - PcmPlayer.pcmPlayerProvider = var0; + static final void method386(Actor var0) { + int var1 = var0.field925 - Client.cycle; + int var2 = var0.field966 * 128 + var0.field927 * 64; + int var3 = var0.field979 * 128 + var0.field927 * 64; + var0.x += (var2 - var0.x) / var1; + var0.y += (var3 - var0.y) / var1; + var0.field982 = 0; + var0.orientation = var0.field972; } - @ObfuscatedName("ap") + @ObfuscatedName("kj") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "71" + signature = "(IB)V", + garbageValue = "-115" ) - protected static final void method343() { - GameShell.clock.mark(); + static final void method389(int var0) { + BoundaryObject.method3393(); - int var0; - for (var0 = 0; var0 < 32; ++var0) { - GameShell.graphicsTickTimes[var0] = 0L; + for (ObjectSound var1 = (ObjectSound)ObjectSound.objectSounds.last(); var1 != null; var1 = (ObjectSound)ObjectSound.objectSounds.previous()) { + if (var1.obj != null) { + var1.set(); + } } - for (var0 = 0; var0 < 32; ++var0) { - GameShell.clientTickTimes[var0] = 0L; + int var4 = Varcs.method2352(var0).type; + if (var4 != 0) { + int var2 = Varps.Varps_main[var0]; + if (var4 == 1) { + if (var2 == 1) { + Rasterizer3D.Rasterizer3D_setBrightness(0.9D); + ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.9D); + } + + if (var2 == 2) { + Rasterizer3D.Rasterizer3D_setBrightness(0.8D); + ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.8D); + } + + if (var2 == 3) { + Rasterizer3D.Rasterizer3D_setBrightness(0.7D); + ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.7D); + } + + if (var2 == 4) { + Rasterizer3D.Rasterizer3D_setBrightness(0.6D); + ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(0.6D); + } + + ItemDefinition.ItemDefinition_cachedSprites.clear(); + } + + if (var4 == 3) { + short var3 = 0; + if (var2 == 0) { + var3 = 255; + } + + if (var2 == 1) { + var3 = 192; + } + + if (var2 == 2) { + var3 = 128; + } + + if (var2 == 3) { + var3 = 64; + } + + if (var2 == 4) { + var3 = 0; + } + + if (var3 != Client.field864) { + if (Client.field864 == 0 && Client.field865 != -1) { + MusicPatchNode2.method3830(class216.archive6, Client.field865, 0, var3, false); + Client.field855 = false; + } else if (var3 == 0) { + ReflectionCheck.method2438(); + Client.field855 = false; + } else if (class197.field2377 != 0) { + class197.field2379 = var3; + } else { + class197.midiPcmStream.method3942(var3); + } + + Client.field864 = var3; + } + } + + if (var4 == 4) { + if (var2 == 0) { + Client.soundEffectVolume = 127; + } + + if (var2 == 1) { + Client.soundEffectVolume = 96; + } + + if (var2 == 2) { + Client.soundEffectVolume = 64; + } + + if (var2 == 3) { + Client.soundEffectVolume = 32; + } + + if (var2 == 4) { + Client.soundEffectVolume = 0; + } + } + + if (var4 == 5) { + Client.leftClickOpensMenu = var2; + } + + if (var4 == 6) { + Client.chatEffects = var2; + } + + if (var4 == 9) { + Client.field907 = var2; + } + + if (var4 == 10) { + if (var2 == 0) { + Client.field868 = 127; + } + + if (var2 == 1) { + Client.field868 = 96; + } + + if (var2 == 2) { + Client.field868 = 64; + } + + if (var2 == 3) { + Client.field868 = 32; + } + + if (var2 == 4) { + Client.field868 = 0; + } + } + + if (var4 == 17) { + Client.followerIndex = var2 & 65535; + } + + AttackOption[] var5; + if (var4 == 18) { + var5 = new AttackOption[]{AttackOption.AttackOption_alwaysRightClick, AttackOption.AttackOption_leftClickWhereAvailable, AttackOption.AttackOption_dependsOnCombatLevels, AttackOption.AttackOption_hidden}; + Client.playerAttackOption = (AttackOption)WorldMapIcon_1.findEnumerated(var5, var2); + if (Client.playerAttackOption == null) { + Client.playerAttackOption = AttackOption.AttackOption_dependsOnCombatLevels; + } + } + + if (var4 == 19) { + if (var2 == -1) { + Client.combatTargetPlayerIndex = -1; + } else { + Client.combatTargetPlayerIndex = var2 & 2047; + } + } + + if (var4 == 22) { + var5 = new AttackOption[]{AttackOption.AttackOption_alwaysRightClick, AttackOption.AttackOption_leftClickWhereAvailable, AttackOption.AttackOption_dependsOnCombatLevels, AttackOption.AttackOption_hidden}; + Client.npcAttackOption = (AttackOption)WorldMapIcon_1.findEnumerated(var5, var2); + if (Client.npcAttackOption == null) { + Client.npcAttackOption = AttackOption.AttackOption_dependsOnCombatLevels; + } + } + + } + } + + @ObfuscatedName("ki") + @ObfuscatedSignature( + signature = "(IIII)Lbq;", + garbageValue = "386978501" + ) + static final InterfaceParent method385(int var0, int var1, int var2) { + InterfaceParent var3 = new InterfaceParent(); + var3.group = var1; + var3.type = var2; + Client.interfaceParents.put(var3, (long)var0); + WorldMapLabel.Widget_resetModelFrames(var1); + Widget var4 = PacketBufferNode.getWidget(var0); + GrandExchangeOfferAgeComparator.invalidateWidget(var4); + if (Client.meslayerContinueWidget != null) { + GrandExchangeOfferAgeComparator.invalidateWidget(Client.meslayerContinueWidget); + Client.meslayerContinueWidget = null; } - GameShell.gameCyclesToDo = 0; + for (int var5 = 0; var5 < Client.menuOptionsCount; ++var5) { + if (WorldMapIcon_1.method351(Client.menuOpcodes[var5])) { + if (var5 < Client.menuOptionsCount - 1) { + for (int var6 = var5; var6 < Client.menuOptionsCount - 1; ++var6) { + Client.menuActions[var6] = Client.menuActions[var6 + 1]; + Client.menuTargets[var6] = Client.menuTargets[var6 + 1]; + Client.menuOpcodes[var6] = Client.menuOpcodes[var6 + 1]; + Client.menuIdentifiers[var6] = Client.menuIdentifiers[var6 + 1]; + Client.menuArguments1[var6] = Client.menuArguments1[var6 + 1]; + Client.menuArguments2[var6] = Client.menuArguments2[var6 + 1]; + Client.menuShiftClick[var6] = Client.menuShiftClick[var6 + 1]; + } + } + + --var5; + --Client.menuOptionsCount; + } + } + + class30.method603(); + class43.revalidateWidgetScroll(Widget.Widget_interfaceComponents[var0 >> 16], var4, false); + FaceNormal.runWidgetOnLoadListener(var1); + if (Client.rootInterface != -1) { + AttackOption.runIntfCloseListeners(Client.rootInterface, 1); + } + + return var3; } } diff --git a/runescape-client/src/main/java/WorldMapDecorationType.java b/runescape-client/src/main/java/WorldMapDecorationType.java index 35e281875a..c59183ea0b 100644 --- a/runescape-client/src/main/java/WorldMapDecorationType.java +++ b/runescape-client/src/main/java/WorldMapDecorationType.java @@ -4,128 +4,128 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hn") +@ObfuscatedName("hv") @Implements("WorldMapDecorationType") public enum WorldMapDecorationType implements Enumerated { - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2710(0, 0), - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2700(1, 0), - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2701(2, 0), - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2702(3, 0), - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2708(9, 2), - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2712(4, 1), - @ObfuscatedName("q") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2705(5, 1), - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2713(6, 1), - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2703(7, 1), - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2706(8, 1), - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2709(12, 2), - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2719(13, 2), - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2711(14, 2), @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2707(15, 2), - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2699(16, 2), - @ObfuscatedName("w") - @ObfuscatedSignature( - signature = "Lhn;" - ) - field2714(17, 2), + field2703(0, 0), @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2715(18, 2), - @ObfuscatedName("g") + field2719(1, 0), + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2716(19, 2), - @ObfuscatedName("x") + field2717(2, 0), + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2717(20, 2), + field2704(3, 0), + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2705(9, 2), + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2706(4, 1), + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2712(5, 1), + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2708(6, 1), + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2709(7, 1), + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2707(8, 1), + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2711(12, 2), + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2701(13, 2), @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2718(21, 2), - @ObfuscatedName("s") + field2713(14, 2), + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2704(10, 2), - @ObfuscatedName("f") + field2714(15, 2), + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2720(11, 2), + field2715(16, 2), @ObfuscatedName("j") @ObfuscatedSignature( - signature = "Lhn;" + signature = "Lhv;" ) - field2721(22, 3); + field2716(17, 2), + @ObfuscatedName("r") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2720(18, 2), + @ObfuscatedName("e") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2718(19, 2), + @ObfuscatedName("s") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2702(20, 2), + @ObfuscatedName("b") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2710(21, 2), + @ObfuscatedName("z") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2721(10, 2), + @ObfuscatedName("f") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2722(11, 2), + @ObfuscatedName("g") + @ObfuscatedSignature( + signature = "Lhv;" + ) + field2723(22, 3); - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedGetter( - intValue = -240297385 + intValue = -649990391 ) @Export("id") public final int id; @@ -138,13 +138,81 @@ public enum WorldMapDecorationType implements Enumerated { this.id = var3; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(IB)Lix;", + garbageValue = "0" + ) + @Export("getObjectDefinition") + public static ObjectDefinition getObjectDefinition(int var0) { + ObjectDefinition var1 = (ObjectDefinition)ObjectDefinition.ObjectDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = ObjectDefinition.ObjectDefinition_archive.takeFile(6, var0); + var1 = new ObjectDefinition(); + var1.id = var0; + if (var2 != null) { + var1.decode(new Buffer(var2)); + } + + var1.postDecode(); + if (var1.isSolid) { + var1.interactType = 0; + var1.boolean1 = false; + } + + ObjectDefinition.ObjectDefinition_cached.put(var1, (long)var0); + return var1; + } + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "([Ljava/lang/CharSequence;IIB)Ljava/lang/String;", + garbageValue = "-18" + ) + public static String method4270(CharSequence[] var0, int var1, int var2) { + if (var2 == 0) { + return ""; + } else if (var2 == 1) { + CharSequence var3 = var0[var1]; + return var3 == null ? "null" : var3.toString(); + } else { + int var8 = var2 + var1; + int var4 = 0; + + for (int var5 = var1; var5 < var8; ++var5) { + CharSequence var6 = var0[var5]; + if (var6 == null) { + var4 += 4; + } else { + var4 += var6.length(); + } + } + + StringBuilder var9 = new StringBuilder(var4); + + for (int var10 = var1; var10 < var8; ++var10) { + CharSequence var7 = var0[var10]; + if (var7 == null) { + var9.append("null"); + } else { + var9.append(var7); + } + } + + return var9.toString(); + } + } } diff --git a/runescape-client/src/main/java/WorldMapElement.java b/runescape-client/src/main/java/WorldMapElement.java index 9ac00ac457..5bc15edd15 100644 --- a/runescape-client/src/main/java/WorldMapElement.java +++ b/runescape-client/src/main/java/WorldMapElement.java @@ -4,112 +4,100 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ij") +@ObfuscatedName("ie") @Implements("WorldMapElement") public class WorldMapElement extends DualNode { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("WorldMapElement_archive") public static AbstractArchive WorldMapElement_archive; - @ObfuscatedName("n") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "[Lij;" - ) - @Export("WorldMapElement_cached") - public static WorldMapElement[] WorldMapElement_cached; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = -1558298053 - ) - @Export("WorldMapElement_count") - public static int WorldMapElement_count; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lem;" + signature = "Leb;" ) @Export("WorldMapElement_cachedSprites") - public static EvictingDualNodeHashTable WorldMapElement_cachedSprites; - @ObfuscatedName("r") + static EvictingDualNodeHashTable WorldMapElement_cachedSprites; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1924770341 + intValue = -1113181625 ) @Export("objectId") public final int objectId; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1840035745 + intValue = -1234847171 ) @Export("sprite1") public int sprite1; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1186818379 + intValue = 373180553 ) @Export("sprite2") int sprite2; - @ObfuscatedName("m") + @ObfuscatedName("o") @Export("name") public String name; - @ObfuscatedName("y") - @ObfuscatedGetter( - intValue = 1029556521 - ) - public int field3195; @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 1307651093 + intValue = -1365135053 + ) + public int field3202; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = -587387743 ) @Export("textSize") public int textSize; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("menuActions") public String[] menuActions; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("menuTargetName") public String menuTargetName; - @ObfuscatedName("a") - int[] field3189; + @ObfuscatedName("k") + int[] field3206; + @ObfuscatedName("x") + @ObfuscatedGetter( + intValue = -1273880721 + ) + int field3207; + @ObfuscatedName("j") + @ObfuscatedGetter( + intValue = -1661547227 + ) + int field3208; + @ObfuscatedName("r") + @ObfuscatedGetter( + intValue = 805541175 + ) + int field3210; @ObfuscatedName("e") @ObfuscatedGetter( - intValue = 404495527 + intValue = 1594590229 ) - int field3200; - @ObfuscatedName("w") - @ObfuscatedGetter( - intValue = -1206163627 - ) - int field3198; - @ObfuscatedName("t") - @ObfuscatedGetter( - intValue = -1982173019 - ) - int field3202; - @ObfuscatedName("g") - @ObfuscatedGetter( - intValue = 1981308333 - ) - int field3203; - @ObfuscatedName("x") + int field3209; + @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lin;" ) @Export("horizontalAlignment") public HorizontalAlignment horizontalAlignment; - @ObfuscatedName("h") + @ObfuscatedName("b") @ObfuscatedSignature( - signature = "Lim;" + signature = "Lik;" ) @Export("verticalAlignment") public VerticalAlignment verticalAlignment; - @ObfuscatedName("s") - int[] field3194; + @ObfuscatedName("z") + int[] field3213; @ObfuscatedName("f") - byte[] field3207; - @ObfuscatedName("j") + byte[] field3214; + @ObfuscatedName("g") @ObfuscatedGetter( - intValue = 1937119401 + intValue = -1671485553 ) @Export("category") public int category; @@ -123,20 +111,20 @@ public class WorldMapElement extends DualNode { this.sprite2 = -1; this.textSize = 0; this.menuActions = new String[5]; - this.field3200 = Integer.MAX_VALUE; - this.field3198 = Integer.MAX_VALUE; - this.field3202 = Integer.MIN_VALUE; - this.field3203 = Integer.MIN_VALUE; + this.field3207 = Integer.MAX_VALUE; + this.field3208 = Integer.MAX_VALUE; + this.field3210 = Integer.MIN_VALUE; + this.field3209 = Integer.MIN_VALUE; this.horizontalAlignment = HorizontalAlignment.HorizontalAlignment_centered; this.verticalAlignment = VerticalAlignment.VerticalAlignment_centered; this.category = -1; this.objectId = var1; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;I)V", - garbageValue = "-1143859499" + signature = "(Lkc;B)V", + garbageValue = "-120" ) @Export("decode") public void decode(Buffer var1) { @@ -150,21 +138,21 @@ public class WorldMapElement extends DualNode { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "-195345385" + signature = "(Lkc;II)V", + garbageValue = "-1243496491" ) @Export("decodeNext") void decodeNext(Buffer var1, int var2) { if (var2 == 1) { - this.sprite1 = var1.method5453(); + this.sprite1 = var1.method5638(); } else if (var2 == 2) { - this.sprite2 = var1.method5453(); + this.sprite2 = var1.method5638(); } else if (var2 == 3) { this.name = var1.readStringCp1252NullTerminated(); } else if (var2 == 4) { - this.field3195 = var1.readMedium(); + this.field3202 = var1.readMedium(); } else if (var2 == 5) { var1.readMedium(); } else if (var2 == 6) { @@ -184,32 +172,32 @@ public class WorldMapElement extends DualNode { this.menuActions[var2 - 10] = var1.readStringCp1252NullTerminated(); } else if (var2 == 15) { var3 = var1.readUnsignedByte(); - this.field3189 = new int[var3 * 2]; + this.field3206 = new int[var3 * 2]; int var4; for (var4 = 0; var4 < var3 * 2; ++var4) { - this.field3189[var4] = var1.readShort(); + this.field3206[var4] = var1.readShort(); } var1.readInt(); var4 = var1.readUnsignedByte(); - this.field3194 = new int[var4]; + this.field3213 = new int[var4]; int var5; - for (var5 = 0; var5 < this.field3194.length; ++var5) { - this.field3194[var5] = var1.readInt(); + for (var5 = 0; var5 < this.field3213.length; ++var5) { + this.field3213[var5] = var1.readInt(); } - this.field3207 = new byte[var3]; + this.field3214 = new byte[var3]; for (var5 = 0; var5 < var3; ++var5) { - this.field3207[var5] = var1.readByte(); + this.field3214[var5] = var1.readByte(); } } else if (var2 != 16) { if (var2 == 17) { this.menuTargetName = var1.readStringCp1252NullTerminated(); } else if (var2 == 18) { - var1.method5453(); + var1.method5638(); } else if (var2 == 19) { this.category = var1.readUnsignedShort(); } else if (var2 == 21) { @@ -224,48 +212,49 @@ public class WorldMapElement extends DualNode { var1.readShort(); var1.readShort(); } else if (var2 == 25) { - var1.method5453(); + var1.method5638(); } else if (var2 == 28) { var1.readUnsignedByte(); } else if (var2 == 29) { - this.horizontalAlignment = (HorizontalAlignment)NetSocket.findEnumerated(PlayerAppearance.method4012(), var1.readUnsignedByte()); + HorizontalAlignment[] var6 = new HorizontalAlignment[]{HorizontalAlignment.field3449, HorizontalAlignment.HorizontalAlignment_centered, HorizontalAlignment.field3447}; + this.horizontalAlignment = (HorizontalAlignment)WorldMapIcon_1.findEnumerated(var6, var1.readUnsignedByte()); } else if (var2 == 30) { - VerticalAlignment[] var6 = new VerticalAlignment[]{VerticalAlignment.field3172, VerticalAlignment.field3170, VerticalAlignment.VerticalAlignment_centered}; - this.verticalAlignment = (VerticalAlignment)NetSocket.findEnumerated(var6, var1.readUnsignedByte()); + VerticalAlignment[] var7 = new VerticalAlignment[]{VerticalAlignment.field3182, VerticalAlignment.VerticalAlignment_centered, VerticalAlignment.field3183}; + this.verticalAlignment = (VerticalAlignment)WorldMapIcon_1.findEnumerated(var7, var1.readUnsignedByte()); } } } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "9" + garbageValue = "-92" ) - public void method4350() { - if (this.field3189 != null) { - for (int var1 = 0; var1 < this.field3189.length; var1 += 2) { - if (this.field3189[var1] < this.field3200) { - this.field3200 = this.field3189[var1]; - } else if (this.field3189[var1] > this.field3202) { - this.field3202 = this.field3189[var1]; + public void method4533() { + if (this.field3206 != null) { + for (int var1 = 0; var1 < this.field3206.length; var1 += 2) { + if (this.field3206[var1] < this.field3207) { + this.field3207 = this.field3206[var1]; + } else if (this.field3206[var1] > this.field3210) { + this.field3210 = this.field3206[var1]; } - if (this.field3189[var1 + 1] < this.field3198) { - this.field3198 = this.field3189[var1 + 1]; - } else if (this.field3189[var1 + 1] > this.field3203) { - this.field3203 = this.field3189[var1 + 1]; + if (this.field3206[var1 + 1] < this.field3208) { + this.field3208 = this.field3206[var1 + 1]; + } else if (this.field3206[var1 + 1] > this.field3209) { + this.field3209 = this.field3206[var1 + 1]; } } } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(ZB)Llf;", - garbageValue = "-63" + signature = "(ZI)Llx;", + garbageValue = "-1029203839" ) @Export("getSpriteBool") public Sprite getSpriteBool(boolean var1) { @@ -273,10 +262,10 @@ public class WorldMapElement extends DualNode { return this.getSprite(var2); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(II)Llf;", - garbageValue = "-444494070" + signature = "(II)Llx;", + garbageValue = "-2136514636" ) @Export("getSprite") Sprite getSprite(int var1) { @@ -287,7 +276,7 @@ public class WorldMapElement extends DualNode { if (var2 != null) { return var2; } else { - var2 = NPCDefinition.SpriteBuffer_getSprite(WorldMapElement_archive, var1, 0); + var2 = MenuAction.SpriteBuffer_getSprite(WorldMapElement_archive, var1, 0); if (var2 != null) { WorldMapElement_cachedSprites.put(var2, (long)var1); } @@ -297,46 +286,57 @@ public class WorldMapElement extends DualNode { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "1309666771" + garbageValue = "-2112265635" ) @Export("getObjectId") public int getObjectId() { return this.objectId; } - @ObfuscatedName("n") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "-1979971580" + signature = "(CI)Z", + garbageValue = "1603440113" ) - public static void method4360(int var0, int var1) { - VarbitDefinition var3 = (VarbitDefinition)VarbitDefinition.VarbitDefinition_cached.get((long)var0); - VarbitDefinition var2; - if (var3 != null) { - var2 = var3; + @Export("isCharPrintable") + public static boolean isCharPrintable(char var0) { + if (var0 >= ' ' && var0 <= '~') { + return true; + } else if (var0 >= 160 && var0 <= 255) { + return true; } else { - byte[] var8 = VarbitDefinition.VarbitDefinition_archive.takeFile(14, var0); - var3 = new VarbitDefinition(); - if (var8 != null) { - var3.decode(new Buffer(var8)); - } + return var0 == 8364 || var0 == 338 || var0 == 8212 || var0 == 339 || var0 == 376; + } + } - VarbitDefinition.VarbitDefinition_cached.put(var3, (long)var0); - var2 = var3; + @ObfuscatedName("lu") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;ZB)Ljava/lang/String;", + garbageValue = "46" + ) + static String method4547(String var0, boolean var1) { + String var2 = var1 ? "https://" : "http://"; + if (Client.gameBuild == 1) { + var0 = var0 + "-wtrc"; + } else if (Client.gameBuild == 2) { + var0 = var0 + "-wtqa"; + } else if (Client.gameBuild == 3) { + var0 = var0 + "-wtwip"; + } else if (Client.gameBuild == 5) { + var0 = var0 + "-wti"; + } else if (Client.gameBuild == 4) { + var0 = "local"; } - int var4 = var2.baseVar; - int var5 = var2.startBit; - int var6 = var2.endBit; - int var7 = Varps.Varps_masks[var6 - var5]; - if (var1 < 0 || var1 > var7) { - var1 = 0; + String var3 = ""; + if (MilliClock.field1994 != null) { + var3 = "/p=" + MilliClock.field1994; } - var7 <<= var5; - Varps.Varps_main[var4] = Varps.Varps_main[var4] & ~var7 | var1 << var5 & var7; + String var4 = "runescape.com"; + return var2 + var0 + "." + var4 + "/l=" + WorldMapSection1.clientLanguage + "/a=" + class339.field4041 + var3 + "/"; } } diff --git a/runescape-client/src/main/java/WorldMapEvent.java b/runescape-client/src/main/java/WorldMapEvent.java index 0426e8d582..37f1d4ce7b 100644 --- a/runescape-client/src/main/java/WorldMapEvent.java +++ b/runescape-client/src/main/java/WorldMapEvent.java @@ -4,42 +4,30 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("aq") +@ObfuscatedName("au") @Implements("WorldMapEvent") public class WorldMapEvent { @ObfuscatedName("a") - @ObfuscatedSignature( - signature = "Lhc;" - ) - @Export("NetCache_currentResponse") - static NetFileRequest NetCache_currentResponse; - @ObfuscatedName("ek") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive20") - static Archive archive20; - @ObfuscatedName("z") @ObfuscatedGetter( - intValue = -133473401 + intValue = 945320021 ) @Export("mapElement") public int mapElement; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhb;" + signature = "Lhf;" ) @Export("coord1") public Coord coord1; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lhb;" + signature = "Lhf;" ) @Export("coord2") public Coord coord2; @ObfuscatedSignature( - signature = "(ILhb;Lhb;)V" + signature = "(ILhf;Lhf;)V" ) public WorldMapEvent(int var1, Coord var2, Coord var3) { this.mapElement = var1; @@ -47,78 +35,17 @@ public class WorldMapEvent { this.coord2 = var3; } - @ObfuscatedName("v") + @ObfuscatedName("ga") @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "1393398598" + signature = "(IIB)V", + garbageValue = "87" ) - static int method801(int var0, int var1) { - ItemContainer var2 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); - if (var2 == null) { - return 0; - } else if (var1 == -1) { - return 0; - } else { - int var3 = 0; - - for (int var4 = 0; var4 < var2.quantities.length; ++var4) { - if (var2.ids[var4] == var1) { - var3 += var2.quantities[var4]; - } - } - - return var3; + @Export("playSoundJingle") + static void playSoundJingle(int var0, int var1) { + if (Client.field864 != 0 && var0 != -1) { + MusicPatchNode2.method3830(Decimator.archive11, var0, 0, Client.field864, false); + Client.field855 = true; } - } - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(BI)C", - garbageValue = "1512501229" - ) - public static char method802(byte var0) { - int var1 = var0 & 255; - if (var1 == 0) { - throw new IllegalArgumentException("" + Integer.toString(var1, 16)); - } else { - if (var1 >= 128 && var1 < 160) { - char var2 = class287.cp1252AsciiExtension[var1 - 128]; - if (var2 == 0) { - var2 = '?'; - } - - var1 = var2; - } - - return (char)var1; - } - } - - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "782060885" - ) - static final int method800(int var0, int var1) { - if (var0 == -2) { - return 12345678; - } else if (var0 == -1) { - if (var1 < 2) { - var1 = 2; - } else if (var1 > 126) { - var1 = 126; - } - - return var1; - } else { - var1 = (var0 & 127) * var1 / 128; - if (var1 < 2) { - var1 = 2; - } else if (var1 > 126) { - var1 = 126; - } - - return (var0 & 65408) + var1; - } } } diff --git a/runescape-client/src/main/java/WorldMapID.java b/runescape-client/src/main/java/WorldMapID.java index 7e07fde89b..62bf996c36 100644 --- a/runescape-client/src/main/java/WorldMapID.java +++ b/runescape-client/src/main/java/WorldMapID.java @@ -1,49 +1,48 @@ -import java.applet.Applet; -import java.awt.Desktop; -import java.awt.Desktop.Action; -import java.net.URI; -import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import netscape.javascript.JSObject; -@ObfuscatedName("ar") +@ObfuscatedName("ag") @Implements("WorldMapID") public class WorldMapID { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lar;" + signature = "Lag;" ) - static final WorldMapID field256; - @ObfuscatedName("n") + static final WorldMapID field259; + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lar;" + signature = "Lag;" ) static final WorldMapID field257; - @ObfuscatedName("q") + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = 1391599195 + ) + static int field260; + @ObfuscatedName("at") + @Export("client") @ObfuscatedSignature( - signature = "Llf;" + signature = "Lclient;" ) - @Export("leftTitleSprite") - static Sprite leftTitleSprite; - @ObfuscatedName("g") - @ObfuscatedGetter( - intValue = -81572617 + static Client client; + @ObfuscatedName("dk") + @ObfuscatedSignature( + signature = "Lij;" ) - @Export("clientTickTimeIdx") - static int clientTickTimeIdx; - @ObfuscatedName("v") + @Export("archive10") + static Archive archive10; + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1325901065 + intValue = -679981673 ) @Export("value") final int value; static { - field256 = new WorldMapID(0); + field259 = new WorldMapID(0); field257 = new WorldMapID(1); } @@ -51,147 +50,14 @@ public class WorldMapID { this.value = var1; } - @ObfuscatedName("n") + @ObfuscatedName("fg") @ObfuscatedSignature( - signature = "(Ljava/lang/String;ZLjava/lang/String;ZI)V", - garbageValue = "-1035717036" + signature = "(Lij;Ljava/lang/String;I)V", + garbageValue = "1051917503" ) - static void method568(String var0, boolean var1, String var2, boolean var3) { - if (var1) { - if (!var3 && Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Action.BROWSE)) { - try { - Desktop.getDesktop().browse(new URI(var0)); - return; - } catch (Exception var5) { - } - } - - if (class51.field406.startsWith("win") && !var3) { - Interpreter.method2025(var0, 0); - return; - } - - if (class51.field406.startsWith("mac")) { - method567(var0, 1, var2); - return; - } - - Interpreter.method2025(var0, 2); - } else { - Interpreter.method2025(var0, 3); - } - - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;ILjava/lang/String;I)Z", - garbageValue = "-1037909601" - ) - static boolean method567(String var0, int var1, String var2) { - if (var1 == 0) { - try { - if (!class51.field406.startsWith("win")) { - throw new Exception(); - } else if (!var0.startsWith("http://") && !var0.startsWith("https://")) { - throw new Exception(); - } else { - String var13 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789?&=,.%+-_#:/*"; - - for (int var4 = 0; var4 < var0.length(); ++var4) { - if (var13.indexOf(var0.charAt(var4)) == -1) { - throw new Exception(); - } - } - - Runtime.getRuntime().exec("cmd /c start \"j\" \"" + var0 + "\""); - return true; - } - } catch (Throwable var8) { - return false; - } - } else if (var1 == 1) { - try { - Applet var7 = class51.applet; - Object[] var5 = new Object[]{(new URL(class51.applet.getCodeBase(), var0)).toString()}; - Object var3 = JSObject.getWindow(var7).call(var2, var5); - return var3 != null; - } catch (Throwable var9) { - return false; - } - } else if (var1 == 2) { - try { - class51.applet.getAppletContext().showDocument(new URL(class51.applet.getCodeBase(), var0), "_blank"); - return true; - } catch (Exception var10) { - return false; - } - } else if (var1 == 3) { - try { - class47.method881(class51.applet, "loggedout"); - } catch (Throwable var12) { - } - - try { - class51.applet.getAppletContext().showDocument(new URL(class51.applet.getCodeBase(), var0), "_top"); - return true; - } catch (Exception var11) { - return false; - } - } else { - throw new IllegalArgumentException(); - } - } - - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(IIII)V", - garbageValue = "-2144797919" - ) - static final void method569(int var0, int var1, int var2) { - int var3; - for (var3 = 0; var3 < 8; ++var3) { - for (int var4 = 0; var4 < 8; ++var4) { - Tiles.Tiles_heights[var0][var3 + var1][var4 + var2] = 0; - } - } - - if (var1 > 0) { - for (var3 = 1; var3 < 8; ++var3) { - Tiles.Tiles_heights[var0][var1][var3 + var2] = Tiles.Tiles_heights[var0][var1 - 1][var3 + var2]; - } - } - - if (var2 > 0) { - for (var3 = 1; var3 < 8; ++var3) { - Tiles.Tiles_heights[var0][var3 + var1][var2] = Tiles.Tiles_heights[var0][var3 + var1][var2 - 1]; - } - } - - if (var1 > 0 && Tiles.Tiles_heights[var0][var1 - 1][var2] != 0) { - Tiles.Tiles_heights[var0][var1][var2] = Tiles.Tiles_heights[var0][var1 - 1][var2]; - } else if (var2 > 0 && Tiles.Tiles_heights[var0][var1][var2 - 1] != 0) { - Tiles.Tiles_heights[var0][var1][var2] = Tiles.Tiles_heights[var0][var1][var2 - 1]; - } else if (var1 > 0 && var2 > 0 && Tiles.Tiles_heights[var0][var1 - 1][var2 - 1] != 0) { - Tiles.Tiles_heights[var0][var1][var2] = Tiles.Tiles_heights[var0][var1 - 1][var2 - 1]; - } - - } - - @ObfuscatedName("fy") - @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "95" - ) - @Export("playPcmPlayers") - static final void playPcmPlayers() { - if (GrandExchangeOfferWorldComparator.pcmPlayer1 != null) { - GrandExchangeOfferWorldComparator.pcmPlayer1.run(); - } - - if (class219.pcmPlayer0 != null) { - class219.pcmPlayer0.run(); - } - + static void method610(Archive var0, String var1) { + ArchiveLoader var2 = new ArchiveLoader(var0, var1); + Client.archiveLoaders.add(var2); + Client.field903 += var2.groupCount; } } diff --git a/runescape-client/src/main/java/WorldMapIcon_0.java b/runescape-client/src/main/java/WorldMapIcon_0.java index 6d1225f14d..26f14bfda8 100644 --- a/runescape-client/src/main/java/WorldMapIcon_0.java +++ b/runescape-client/src/main/java/WorldMapIcon_0.java @@ -4,51 +4,42 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("x") +@ObfuscatedName("s") @Implements("WorldMapIcon_0") public class WorldMapIcon_0 extends AbstractWorldMapIcon { - @ObfuscatedName("sm") - @Export("foundItemIds") - static short[] foundItemIds; - @ObfuscatedName("be") - @ObfuscatedSignature( - signature = "Llp;" - ) - @Export("worldSelectLeftSprite") - static IndexedSprite worldSelectLeftSprite; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -189436837 + intValue = 445280929 ) @Export("element") final int element; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Law;" + signature = "Lar;" ) @Export("label") final WorldMapLabel label; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 704139389 + intValue = 106254271 ) @Export("subWidth") final int subWidth; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 155630147 + intValue = -1418810221 ) @Export("subHeight") final int subHeight; @ObfuscatedSignature( - signature = "(Lhb;Lhb;ILaw;)V" + signature = "(Lhf;Lhf;ILar;)V" ) WorldMapIcon_0(Coord var1, Coord var2, int var3, WorldMapLabel var4) { super(var1, var2); this.element = var3; this.label = var4; - WorldMapElement var5 = Decimator.WorldMapElement_get(this.getElement()); + WorldMapElement var5 = class65.WorldMapElement_get(this.getElement()); Sprite var6 = var5.getSpriteBool(false); if (var6 != null) { this.subWidth = var6.subWidth; @@ -60,98 +51,203 @@ public class WorldMapIcon_0 extends AbstractWorldMapIcon { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "16" + signature = "(I)I", + garbageValue = "-1878632225" ) @Export("getElement") public int getElement() { return this.element; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Law;", - garbageValue = "13348956" + signature = "(I)Lar;", + garbageValue = "-77909992" ) @Export("getLabel") WorldMapLabel getLabel() { return this.label; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-175699296" + garbageValue = "60677286" ) @Export("getSubWidth") int getSubWidth() { return this.subWidth; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "806304417" + signature = "(B)I", + garbageValue = "-92" ) @Export("getSubHeight") int getSubHeight() { return this.subHeight; } - @ObfuscatedName("r") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lhp;Ljava/lang/String;Ljava/lang/String;I)[Llp;", - garbageValue = "-29773382" + signature = "([BB)Lcj;", + garbageValue = "47" ) - public static IndexedSprite[] method222(AbstractArchive var0, String var1, String var2) { - int var3 = var0.getGroupId(var1); - int var4 = var0.getFileId(var3, var2); - return class297.method5389(var0, var3, var4); + @Export("newScript") + static Script newScript(byte[] var0) { + Script var1 = new Script(); + Buffer var2 = new Buffer(var0); + var2.offset = var2.array.length - 2; + int var3 = var2.readUnsignedShort(); + int var4 = var2.array.length - 2 - var3 - 12; + var2.offset = var4; + int var5 = var2.readInt(); + var1.localIntCount = var2.readUnsignedShort(); + var1.localStringCount = var2.readUnsignedShort(); + var1.intArgumentCount = var2.readUnsignedShort(); + var1.stringArgumentCount = var2.readUnsignedShort(); + int var6 = var2.readUnsignedByte(); + int var7; + int var8; + if (var6 > 0) { + var1.switches = var1.newIterableNodeHashTable(var6); + + for (var7 = 0; var7 < var6; ++var7) { + var8 = var2.readUnsignedShort(); + int var9; + int var11; + if (var8 > 0) { + var11 = var8 - 1; + var11 |= var11 >>> 1; + var11 |= var11 >>> 2; + var11 |= var11 >>> 4; + var11 |= var11 >>> 8; + var11 |= var11 >>> 16; + int var10 = var11 + 1; + var9 = var10; + } else { + var9 = 1; + } + + IterableNodeHashTable var13 = new IterableNodeHashTable(var9); + var1.switches[var7] = var13; + + while (var8-- > 0) { + var11 = var2.readInt(); + int var12 = var2.readInt(); + var13.put(new IntegerNode(var12), (long)var11); + } + } + } + + var2.offset = 0; + var2.readStringCp1252NullTerminatedOrNull(); + var1.opcodes = new int[var5]; + var1.intOperands = new int[var5]; + var1.stringOperands = new String[var5]; + + for (var7 = 0; var2.offset < var4; var1.opcodes[var7++] = var8) { + var8 = var2.readUnsignedShort(); + if (var8 == 3) { + var1.stringOperands[var7] = var2.readStringCp1252NullTerminated(); + } else if (var8 < 100 && var8 != 21 && var8 != 38 && var8 != 39) { + var1.intOperands[var7] = var2.readInt(); + } else { + var1.intOperands[var7] = var2.readUnsignedByte(); + } + } + + return var1; } - @ObfuscatedName("jd") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Lho;I)V", - garbageValue = "-1181739841" + signature = "(ILhq;IIIZB)V", + garbageValue = "-27" ) - static final void method221(Widget var0) { + public static void method253(int var0, AbstractArchive var1, int var2, int var3, int var4, boolean var5) { + class197.field2377 = 1; + class247.musicTrackArchive = var1; + class189.musicTrackGroupId = var2; + class197.musicTrackFileId = var3; + class197.field2379 = var4; + ScriptFrame.musicTrackBoolean = var5; + class197.field2384 = var0; + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(Ljava/lang/CharSequence;I)I", + garbageValue = "-50588493" + ) + @Export("hashString") + public static int hashString(CharSequence var0) { + int var1 = var0.length(); + int var2 = 0; + + for (int var3 = 0; var3 < var1; ++var3) { + var2 = (var2 << 5) - var2 + WorldMapData_1.charToByteCp1252(var0.charAt(var3)); + } + + return var2; + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "427121780" + ) + static void method252(int var0) { + ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var1 != null) { + var1.remove(); + } + } + + @ObfuscatedName("ky") + @ObfuscatedSignature( + signature = "(Lhi;I)Z", + garbageValue = "-1282406799" + ) + static final boolean method237(Widget var0) { int var1 = var0.contentType; - if (var1 == 324) { - if (Client.field900 == -1) { - Client.field900 = var0.spriteId2; - Client.field901 = var0.spriteId; + if (var1 == 205) { + Client.logoutTimer = 250; + return true; + } else { + int var2; + int var3; + if (var1 >= 300 && var1 <= 313) { + var2 = (var1 - 300) / 2; + var3 = var1 & 1; + Client.playerAppearance.changeAppearance(var2, var3 == 1); } - if (Client.playerAppearance.isFemale) { - var0.spriteId2 = Client.field900; + if (var1 >= 314 && var1 <= 323) { + var2 = (var1 - 314) / 2; + var3 = var1 & 1; + Client.playerAppearance.method4156(var2, var3 == 1); + } + + if (var1 == 324) { + Client.playerAppearance.changeSex(false); + } + + if (var1 == 325) { + Client.playerAppearance.changeSex(true); + } + + if (var1 == 326) { + PacketBufferNode var4 = SoundSystem.getPacketBufferNode(ClientPacket.field2264, Client.packetWriter.isaacCipher); + Client.playerAppearance.write(var4.packetBuffer); + Client.packetWriter.addNode(var4); + return true; } else { - var0.spriteId2 = Client.field901; + return false; } - - } else if (var1 == 325) { - if (Client.field900 == -1) { - Client.field900 = var0.spriteId2; - Client.field901 = var0.spriteId; - } - - if (Client.playerAppearance.isFemale) { - var0.spriteId2 = Client.field901; - } else { - var0.spriteId2 = Client.field900; - } - - } else if (var1 == 327) { - var0.modelAngleX = 150; - var0.modelAngleY = (int)(Math.sin((double)Client.cycle / 40.0D) * 256.0D) & 2047; - var0.modelType = 5; - var0.modelId = 0; - } else if (var1 == 328) { - var0.modelAngleX = 150; - var0.modelAngleY = (int)(Math.sin((double)Client.cycle / 40.0D) * 256.0D) & 2047; - var0.modelType = 5; - var0.modelId = 1; } } } diff --git a/runescape-client/src/main/java/WorldMapIcon_1.java b/runescape-client/src/main/java/WorldMapIcon_1.java index e9222cc72b..ac534085c4 100644 --- a/runescape-client/src/main/java/WorldMapIcon_1.java +++ b/runescape-client/src/main/java/WorldMapIcon_1.java @@ -4,60 +4,48 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("d") +@ObfuscatedName("w") @Implements("WorldMapIcon_1") public class WorldMapIcon_1 extends AbstractWorldMapIcon { - @ObfuscatedName("cp") - @Export("mouseCam") - static boolean mouseCam; - @ObfuscatedName("gd") - @Export("regionLandArchives") - static byte[][] regionLandArchives; - @ObfuscatedName("hv") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -767824539 - ) - @Export("cameraZ") - static int cameraZ; - @ObfuscatedName("z") - @ObfuscatedGetter( - intValue = -90223087 + intValue = 129403551 ) @Export("objectDefId") final int objectDefId; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Laa;" + signature = "Laq;" ) @Export("region") final WorldMapRegion region; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1981898425 + intValue = -774334227 ) @Export("element") int element; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Law;" + signature = "Lar;" ) @Export("label") WorldMapLabel label; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1086525415 + intValue = -246439835 ) @Export("subWidth") int subWidth; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 73044895 + intValue = -1431818505 ) @Export("subHeight") int subHeight; @ObfuscatedSignature( - signature = "(Lhb;Lhb;ILaa;)V" + signature = "(Lhf;Lhf;ILaq;)V" ) WorldMapIcon_1(Coord var1, Coord var2, int var3, WorldMapRegion var4) { super(var1, var2); @@ -66,56 +54,56 @@ public class WorldMapIcon_1 extends AbstractWorldMapIcon { this.init(); } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "16" + signature = "(I)I", + garbageValue = "-1878632225" ) @Export("getElement") public int getElement() { return this.element; } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(I)Law;", - garbageValue = "13348956" + signature = "(I)Lar;", + garbageValue = "-77909992" ) @Export("getLabel") WorldMapLabel getLabel() { return this.label; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(I)I", - garbageValue = "-175699296" + garbageValue = "60677286" ) @Export("getSubWidth") int getSubWidth() { return this.subWidth; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "806304417" + signature = "(B)I", + garbageValue = "-92" ) @Export("getSubHeight") int getSubHeight() { return this.subHeight; } - @ObfuscatedName("f") + @ObfuscatedName("k") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "-93" + garbageValue = "55" ) @Export("init") void init() { - this.element = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(this.objectDefId).transform().mapIconId; - this.label = this.region.createMapLabel(Decimator.WorldMapElement_get(this.element)); - WorldMapElement var1 = Decimator.WorldMapElement_get(this.getElement()); + this.element = WorldMapDecorationType.getObjectDefinition(this.objectDefId).transform().mapIconId; + this.label = this.region.createMapLabel(class65.WorldMapElement_get(this.element)); + WorldMapElement var1 = class65.WorldMapElement_get(this.getElement()); Sprite var2 = var1.getSpriteBool(false); if (var2 != null) { this.subWidth = var2.subWidth; @@ -127,51 +115,196 @@ public class WorldMapIcon_1 extends AbstractWorldMapIcon { } - @ObfuscatedName("eb") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-806150701" + signature = "([Lgy;IS)Lgy;", + garbageValue = "9030" ) - static final void method314() { - FloorOverlayDefinition.FloorOverlayDefinition_cached.clear(); - FloorUnderlayDefinition.FloorUnderlayDefinition_cached.clear(); - KitDefinition.KitDefinition_cached.clear(); - ObjectDefinition.ObjectDefinition_cached.clear(); - ObjectDefinition.ObjectDefinition_cachedModelData.clear(); - ObjectDefinition.ObjectDefinition_cachedEntities.clear(); - ObjectDefinition.ObjectDefinition_cachedModels.clear(); - NPCDefinition.NpcDefinition_cached.clear(); - NPCDefinition.NpcDefinition_cachedModels.clear(); - InterfaceParent.method1193(); - SequenceDefinition.SequenceDefinition_cached.clear(); - SequenceDefinition.SequenceDefinition_cachedFrames.clear(); - class219.method4079(); - VarbitDefinition.VarbitDefinition_cached.clear(); - MusicPatch.method3868(); - GrandExchangeEvent.method83(); - HealthBarDefinition.HealthBarDefinition_cached.clear(); - HealthBarDefinition.HealthBarDefinition_cachedSprites.clear(); - StructDefinition.StructDefinition_cached.clear(); - TextureProvider.method2746(); - WorldMapElement.WorldMapElement_cachedSprites.clear(); - UserComparator1.method5847(); - Widget.Widget_cachedSprites.clear(); - Widget.Widget_cachedModels.clear(); - Widget.Widget_cachedFonts.clear(); - Widget.Widget_cachedSpriteMasks.clear(); - ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).clear(); - Script.Script_cached.clear(); - class1.archive0.clearFiles(); - WorldMapLabelSize.archive1.clearFiles(); - BoundaryObject.archive3.clearFiles(); - GrandExchangeOfferAgeComparator.archive4.clearFiles(); - class3.archive5.clearFiles(); - class225.archive6.clearFiles(); - Language.archive7.clearFiles(); - GrandExchangeOfferAgeComparator.archive8.clearFiles(); - AttackOption.archive9.clearFiles(); - Client.archive10.clearFiles(); - ClanMate.archive11.clearFiles(); - GrandExchangeOfferOwnWorldComparator.archive12.clearFiles(); + @Export("findEnumerated") + public static Enumerated findEnumerated(Enumerated[] var0, int var1) { + Enumerated[] var2 = var0; + + for (int var3 = 0; var3 < var2.length; ++var3) { + Enumerated var4 = var2[var3]; + if (var1 == var4.rsOrdinal()) { + return var4; + } + } + + return null; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(IIII)Lcj;", + garbageValue = "-1901279289" + ) + @Export("getWorldMapScript") + static Script getWorldMapScript(int var0, int var1, int var2) { + int var3 = (var1 << 8) + var0; + Script var6 = (Script)Script.Script_cached.get((long)(var3 << 16)); + Script var5; + if (var6 != null) { + var5 = var6; + } else { + String var7 = String.valueOf(var3); + int var8 = Occluder.archive12.getGroupId(var7); + if (var8 == -1) { + var5 = null; + } else { + label56: { + byte[] var9 = Occluder.archive12.takeFileFlat(var8); + if (var9 != null) { + if (var9.length <= 1) { + var5 = null; + break label56; + } + + var6 = WorldMapIcon_0.newScript(var9); + if (var6 != null) { + Script.Script_cached.put(var6, (long)(var3 << 16)); + var5 = var6; + break label56; + } + } + + var5 = null; + } + } + } + + if (var5 != null) { + return var5; + } else { + int var13 = (var2 + 40000 << 8) + var0; + Script var15 = (Script)Script.Script_cached.get((long)(var13 << 16)); + Script var14; + if (var15 != null) { + var14 = var15; + } else { + String var10 = String.valueOf(var13); + int var11 = Occluder.archive12.getGroupId(var10); + if (var11 == -1) { + var14 = null; + } else { + byte[] var12 = Occluder.archive12.takeFileFlat(var11); + if (var12 != null) { + if (var12.length <= 1) { + var14 = null; + return var14 != null ? var14 : null; + } + + var15 = WorldMapIcon_0.newScript(var12); + if (var15 != null) { + Script.Script_cached.put(var15, (long)(var13 << 16)); + var14 = var15; + return var14 != null ? var14 : null; + } + } + + var14 = null; + } + } + + return var14 != null ? var14 : null; + } + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(II)Lbt;", + garbageValue = "1340255179" + ) + @Export("Messages_getMessage") + static Message Messages_getMessage(int var0) { + return (Message)Messages.Messages_hashTable.get((long)var0); + } + + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "(Lkc;J)V" + ) + static void method354(Buffer var0, long var1) { + var1 /= 10L; + if (var1 < 0L) { + var1 = 0L; + } else if (var1 > 65535L) { + var1 = 65535L; + } + + var0.writeShort((int)var1); + } + + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;I)V", + garbageValue = "-318673135" + ) + static final void method355(String var0) { + StringBuilder var10000 = new StringBuilder(); + Object var10001 = null; + var10000 = var10000.append("Please remove ").append(var0); + var10001 = null; + String var1 = var10000.append(" from your friend list first").toString(); + class30.addGameMessage(30, "", var1); + } + + @ObfuscatedName("ge") + @ObfuscatedSignature( + signature = "(Lhi;III)V", + garbageValue = "-894965575" + ) + @Export("checkIfMinimapClicked") + static final void checkIfMinimapClicked(Widget var0, int var1, int var2) { + if (Client.minimapState == 0 || Client.minimapState == 3) { + if (!Client.isMenuOpen && (MouseHandler.MouseHandler_lastButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_lastButton == 4)) { + SpriteMask var3 = var0.getSpriteMask(true); + if (var3 == null) { + return; + } + + int var4 = MouseHandler.MouseHandler_lastPressedX - var1; + int var5 = MouseHandler.MouseHandler_lastPressedY - var2; + if (var3.contains(var4, var5)) { + var4 -= var3.width / 2; + var5 -= var3.height / 2; + int var6 = Client.camAngleY & 2047; + int var7 = Rasterizer3D.Rasterizer3D_sine[var6]; + int var8 = Rasterizer3D.Rasterizer3D_cosine[var6]; + int var9 = var5 * var7 + var4 * var8 >> 11; + int var10 = var8 * var5 - var7 * var4 >> 11; + int var11 = var9 + class215.localPlayer.x >> 7; + int var12 = class215.localPlayer.y - var10 >> 7; + PacketBufferNode var13 = SoundSystem.getPacketBufferNode(ClientPacket.field2266, Client.packetWriter.isaacCipher); + var13.packetBuffer.writeByte(18); + var13.packetBuffer.writeShort(UserComparator8.baseX * 64 + var11); + var13.packetBuffer.method5634(KeyHandler.KeyHandler_pressedKeys[82] ? (KeyHandler.KeyHandler_pressedKeys[81] ? 2 : 1) : 0); + var13.packetBuffer.writeShort(HealthBar.baseY * 64 + var12); + var13.packetBuffer.writeByte(var4); + var13.packetBuffer.writeByte(var5); + var13.packetBuffer.writeShort(Client.camAngleY); + var13.packetBuffer.writeByte(57); + var13.packetBuffer.writeByte(0); + var13.packetBuffer.writeByte(0); + var13.packetBuffer.writeByte(89); + var13.packetBuffer.writeShort(class215.localPlayer.x); + var13.packetBuffer.writeShort(class215.localPlayer.y); + var13.packetBuffer.writeByte(63); + Client.packetWriter.addNode(var13); + Client.destinationX = var11; + Client.destinationY = var12; + } + } + + } + } + + @ObfuscatedName("in") + @ObfuscatedSignature( + signature = "(II)Z", + garbageValue = "-1825518437" + ) + static boolean method351(int var0) { + return var0 == 57 || var0 == 58 || var0 == 1007 || var0 == 25 || var0 == 30; } } diff --git a/runescape-client/src/main/java/WorldMapLabel.java b/runescape-client/src/main/java/WorldMapLabel.java index 5a5a3318c3..bd266f7e61 100644 --- a/runescape-client/src/main/java/WorldMapLabel.java +++ b/runescape-client/src/main/java/WorldMapLabel.java @@ -4,45 +4,48 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("aw") +@ObfuscatedName("ar") @Implements("WorldMapLabel") public class WorldMapLabel { - @ObfuscatedName("cj") - @ObfuscatedSignature( - signature = "Lbn;" + @ObfuscatedName("qz") + @ObfuscatedGetter( + intValue = 1433449733 ) - @Export("mouseRecorder") - static MouseRecorder mouseRecorder; - @ObfuscatedName("db") + static int field231; + @ObfuscatedName("am") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lls;" ) - @Export("archive19") - static Archive archive19; - @ObfuscatedName("z") + static Bounds field225; + @ObfuscatedName("cu") + @ObfuscatedGetter( + intValue = -678092669 + ) + public static int field229; + @ObfuscatedName("a") @Export("text") String text; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -38349507 + intValue = -1265907977 ) @Export("width") int width; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -212014043 + intValue = -860920669 ) @Export("height") int height; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lg;" + signature = "Le;" ) @Export("size") WorldMapLabelSize size; @ObfuscatedSignature( - signature = "(Ljava/lang/String;IILg;)V" + signature = "(Ljava/lang/String;IILe;)V" ) WorldMapLabel(String var1, int var2, int var3, WorldMapLabelSize var4) { this.text = var1; @@ -51,29 +54,228 @@ public class WorldMapLabel { this.size = var4; } - @ObfuscatedName("ah") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ILhb;ZI)V", - garbageValue = "203573450" + signature = "(I)I", + garbageValue = "1730606936" ) - static void method439(int var0, Coord var1, boolean var2) { - WorldMapArea var3 = Decimator.getWorldMap().getMapArea(var0); - int var4 = class223.localPlayer.plane; - int var5 = class223.baseX * 64 + (class223.localPlayer.x >> 7); - int var6 = class286.baseY * 64 + (class223.localPlayer.y >> 7); - Coord var7 = new Coord(var4, var5, var6); - Decimator.getWorldMap().method6449(var3, var7, var1, var2); + public static int method479() { + return ViewportMouse.ViewportMouse_entityCount; } - @ObfuscatedName("kq") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "125" + signature = "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V", + garbageValue = "880731151" ) - @Export("Clan_leaveChat") - static final void Clan_leaveChat() { - PacketBufferNode var0 = InterfaceParent.getPacketBufferNode(ClientPacket.field2237, Client.packetWriter.isaacCipher); - var0.packetBuffer.writeByte(0); - Client.packetWriter.addNode(var0); + @Export("addChatMessage") + static void addChatMessage(int var0, String var1, String var2, String var3) { + ChatChannel var4 = (ChatChannel)Messages.Messages_channels.get(var0); + if (var4 == null) { + var4 = new ChatChannel(); + Messages.Messages_channels.put(var0, var4); + } + + Message var5 = var4.addMessage(var0, var1, var2, var3); + Messages.Messages_hashTable.put(var5, (long)var5.count); + Messages.Messages_queue.add(var5); + Client.chatCycle = Client.cycleCntr; + } + + @ObfuscatedName("hn") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "1804340309" + ) + static final void method475(int var0, int var1) { + if (Client.hintArrowType == 2) { + WorldMapCacheName.worldToScreen(Client.hintArrowSubX * 64 + (Client.hintArrowX - UserComparator8.baseX * 64 << 7), Client.hintArrowSubY * 64 + (Client.hintArrowY - HealthBar.baseY * 64 << 7), Client.hintArrowHeight * 2); + if (Client.viewportTempX > -1 && Client.cycle % 20 < 10) { + class14.headIconHintSprites[0].drawTransBgAt(var0 + Client.viewportTempX - 12, Client.viewportTempY + var1 - 28); + } + + } + } + + @ObfuscatedName("hu") + @ObfuscatedSignature( + signature = "(IIIIII)V", + garbageValue = "668780509" + ) + @Export("drawObject") + static final void drawObject(int var0, int var1, int var2, int var3, int var4) { + long var5 = WorldMapArea.scene.getBoundaryObjectTag(var0, var1, var2); + int var7; + int var8; + int var9; + int var10; + int var14; + int var26; + if (0L != var5) { + var7 = WorldMapArea.scene.getObjectFlags(var0, var1, var2, var5); + var8 = var7 >> 6 & 3; + var9 = var7 & 31; + var10 = var3; + boolean var12 = var5 != 0L; + if (var12) { + boolean var13 = (int)(var5 >>> 16 & 1L) == 1; + var12 = !var13; + } + + if (var12) { + var10 = var4; + } + + int[] var19 = FloorDecoration.sceneMinimapSprite.pixels; + var26 = var1 * 4 + (103 - var2) * 2048 + 24624; + var14 = UserComparator8.Entity_unpackID(var5); + ObjectDefinition var15 = WorldMapDecorationType.getObjectDefinition(var14); + if (var15.mapSceneId != -1) { + IndexedSprite var16 = GrandExchangeOfferWorldComparator.mapSceneSprites[var15.mapSceneId]; + if (var16 != null) { + int var17 = (var15.sizeX * 4 - var16.subWidth) / 2; + int var18 = (var15.sizeY * 4 - var16.subHeight) / 2; + var16.drawAt(var1 * 4 + var17 + 48, var18 + (104 - var2 - var15.sizeY) * 4 + 48); + } + } else { + if (var9 == 0 || var9 == 2) { + if (var8 == 0) { + var19[var26] = var10; + var19[var26 + 512] = var10; + var19[var26 + 1024] = var10; + var19[var26 + 1536] = var10; + } else if (var8 == 1) { + var19[var26] = var10; + var19[var26 + 1] = var10; + var19[var26 + 2] = var10; + var19[var26 + 3] = var10; + } else if (var8 == 2) { + var19[var26 + 3] = var10; + var19[var26 + 512 + 3] = var10; + var19[var26 + 1024 + 3] = var10; + var19[var26 + 1536 + 3] = var10; + } else if (var8 == 3) { + var19[var26 + 1536] = var10; + var19[var26 + 1536 + 1] = var10; + var19[var26 + 1536 + 2] = var10; + var19[var26 + 1536 + 3] = var10; + } + } + + if (var9 == 3) { + if (var8 == 0) { + var19[var26] = var10; + } else if (var8 == 1) { + var19[var26 + 3] = var10; + } else if (var8 == 2) { + var19[var26 + 1536 + 3] = var10; + } else if (var8 == 3) { + var19[var26 + 1536] = var10; + } + } + + if (var9 == 2) { + if (var8 == 3) { + var19[var26] = var10; + var19[var26 + 512] = var10; + var19[var26 + 1024] = var10; + var19[var26 + 1536] = var10; + } else if (var8 == 0) { + var19[var26] = var10; + var19[var26 + 1] = var10; + var19[var26 + 2] = var10; + var19[var26 + 3] = var10; + } else if (var8 == 1) { + var19[var26 + 3] = var10; + var19[var26 + 512 + 3] = var10; + var19[var26 + 1024 + 3] = var10; + var19[var26 + 1536 + 3] = var10; + } else if (var8 == 2) { + var19[var26 + 1536] = var10; + var19[var26 + 1536 + 1] = var10; + var19[var26 + 1536 + 2] = var10; + var19[var26 + 1536 + 3] = var10; + } + } + } + } + + var5 = WorldMapArea.scene.getGameObjectTag(var0, var1, var2); + if (var5 != 0L) { + var7 = WorldMapArea.scene.getObjectFlags(var0, var1, var2, var5); + var8 = var7 >> 6 & 3; + var9 = var7 & 31; + var10 = UserComparator8.Entity_unpackID(var5); + ObjectDefinition var20 = WorldMapDecorationType.getObjectDefinition(var10); + if (var20.mapSceneId != -1) { + IndexedSprite var28 = GrandExchangeOfferWorldComparator.mapSceneSprites[var20.mapSceneId]; + if (var28 != null) { + var26 = (var20.sizeX * 4 - var28.subWidth) / 2; + var14 = (var20.sizeY * 4 - var28.subHeight) / 2; + var28.drawAt(var26 + var1 * 4 + 48, (104 - var2 - var20.sizeY) * 4 + var14 + 48); + } + } else if (var9 == 9) { + int var25 = 15658734; + boolean var27 = var5 != 0L; + if (var27) { + boolean var23 = (int)(var5 >>> 16 & 1L) == 1; + var27 = !var23; + } + + if (var27) { + var25 = 15597568; + } + + int[] var24 = FloorDecoration.sceneMinimapSprite.pixels; + int var29 = var1 * 4 + (103 - var2) * 2048 + 24624; + if (var8 != 0 && var8 != 2) { + var24[var29] = var25; + var24[var29 + 1 + 512] = var25; + var24[var29 + 1024 + 2] = var25; + var24[var29 + 1536 + 3] = var25; + } else { + var24[var29 + 1536] = var25; + var24[var29 + 1 + 1024] = var25; + var24[var29 + 512 + 2] = var25; + var24[var29 + 3] = var25; + } + } + } + + var5 = WorldMapArea.scene.getFloorDecorationTag(var0, var1, var2); + if (var5 != 0L) { + var7 = UserComparator8.Entity_unpackID(var5); + ObjectDefinition var21 = WorldMapDecorationType.getObjectDefinition(var7); + if (var21.mapSceneId != -1) { + IndexedSprite var22 = GrandExchangeOfferWorldComparator.mapSceneSprites[var21.mapSceneId]; + if (var22 != null) { + var10 = (var21.sizeX * 4 - var22.subWidth) / 2; + int var11 = (var21.sizeY * 4 - var22.subHeight) / 2; + var22.drawAt(var1 * 4 + var10 + 48, (104 - var2 - var21.sizeY) * 4 + var11 + 48); + } + } + } + + } + + @ObfuscatedName("ks") + @ObfuscatedSignature( + signature = "(IB)V", + garbageValue = "13" + ) + @Export("Widget_resetModelFrames") + static final void Widget_resetModelFrames(int var0) { + if (TextureProvider.loadInterface(var0)) { + Widget[] var1 = Widget.Widget_interfaceComponents[var0]; + + for (int var2 = 0; var2 < var1.length; ++var2) { + Widget var3 = var1[var2]; + if (var3 != null) { + var3.modelFrame = 0; + var3.modelFrameCycle = 0; + } + } + + } } } diff --git a/runescape-client/src/main/java/WorldMapLabelSize.java b/runescape-client/src/main/java/WorldMapLabelSize.java index 6856e6ccb8..c9fdd6e650 100644 --- a/runescape-client/src/main/java/WorldMapLabelSize.java +++ b/runescape-client/src/main/java/WorldMapLabelSize.java @@ -4,167 +4,310 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("g") +@ObfuscatedName("e") @Implements("WorldMapLabelSize") public class WorldMapLabelSize { - @ObfuscatedName("qv") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lca;" - ) - @Export("pcmStreamMixer") - static PcmStreamMixer pcmStreamMixer; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Lg;" + signature = "Le;" ) @Export("WorldMapLabelSize_small") public static final WorldMapLabelSize WorldMapLabelSize_small; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lg;" + signature = "Le;" ) @Export("WorldMapLabelSize_medium") public static final WorldMapLabelSize WorldMapLabelSize_medium; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lg;" + signature = "Le;" ) @Export("WorldMapLabelSize_large") public static final WorldMapLabelSize WorldMapLabelSize_large; - @ObfuscatedName("bc") - @ObfuscatedSignature( - signature = "Lgt;" - ) - @Export("clientLanguage") - static Language clientLanguage; - @ObfuscatedName("du") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive1") - static Archive archive1; - @ObfuscatedName("u") + @ObfuscatedName("cf") + @Export("mouseCam") + static boolean mouseCam; + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1343624191 + intValue = -1635893433 ) final int field107; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1129278847 + intValue = -2014833765 ) - final int field108; - @ObfuscatedName("p") + final int field104; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1652176271 + intValue = -1256789949 ) - final int field109; + final int field105; static { - WorldMapLabelSize_small = new WorldMapLabelSize(1, 0, 4); + WorldMapLabelSize_small = new WorldMapLabelSize(2, 0, 4); WorldMapLabelSize_medium = new WorldMapLabelSize(0, 1, 2); - WorldMapLabelSize_large = new WorldMapLabelSize(2, 2, 0); + WorldMapLabelSize_large = new WorldMapLabelSize(1, 2, 0); } WorldMapLabelSize(int var1, int var2, int var3) { this.field107 = var1; - this.field108 = var2; - this.field109 = var3; + this.field104 = var2; + this.field105 = var3; + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(FB)Z", + garbageValue = "16" + ) + boolean method234(float var1) { + return var1 >= (float)this.field105; + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(II)Le;", + garbageValue = "-2025781549" + ) + static WorldMapLabelSize method228(int var0) { + WorldMapLabelSize[] var1 = new WorldMapLabelSize[]{WorldMapLabelSize_small, WorldMapLabelSize_medium, WorldMapLabelSize_large}; + WorldMapLabelSize[] var2 = var1; + + for (int var3 = 0; var3 < var2.length; ++var3) { + WorldMapLabelSize var4 = var2[var3]; + if (var0 == var4.field104) { + return var4; + } + } + + return null; } @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(FI)Z", - garbageValue = "-1695259698" + signature = "(IIILfc;Lfm;I)Z", + garbageValue = "-1328272640" ) - boolean method198(float var1) { - return var1 >= (float)this.field109; - } + static final boolean method236(int var0, int var1, int var2, RouteStrategy var3, CollisionMap var4) { + int var5 = var0; + int var6 = var1; + byte var7 = 64; + byte var8 = 64; + int var9 = var0 - var7; + int var10 = var1 - var8; + class173.directions[var7][var8] = 99; + class173.distances[var7][var8] = 0; + byte var11 = 0; + int var12 = 0; + class173.bufferX[var11] = var0; + int var20 = var11 + 1; + class173.bufferY[var11] = var1; + int[][] var13 = var4.flags; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(I)[Lg;", - garbageValue = "1124237372" - ) - static WorldMapLabelSize[] method196() { - return new WorldMapLabelSize[]{WorldMapLabelSize_large, WorldMapLabelSize_small, WorldMapLabelSize_medium}; - } + while (true) { + label313: + while (true) { + int var14; + int var15; + int var16; + int var17; + int var18; + int var19; + do { + do { + do { + label290: + do { + if (var12 == var20) { + class173.field2070 = var5; + LoginScreenAnimation.field1029 = var6; + return false; + } - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "255" - ) - public static int method197() { - return ++MouseHandler.MouseHandler_idleCycles - 1; - } + var5 = class173.bufferX[var12]; + var6 = class173.bufferY[var12]; + var12 = var12 + 1 & 4095; + var18 = var5 - var9; + var19 = var6 - var10; + var14 = var5 - var4.xInset; + var15 = var6 - var4.yInset; + if (var3.hasArrived(var2, var5, var6, var4)) { + class173.field2070 = var5; + LoginScreenAnimation.field1029 = var6; + return true; + } - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "(IIII)I", - garbageValue = "-962048478" - ) - static final int method202(int var0, int var1, int var2) { - int var3 = var0 / var2; - int var4 = var0 & var2 - 1; - int var5 = var1 / var2; - int var6 = var1 & var2 - 1; - int var7 = Login.method2100(var3, var5); - int var8 = Login.method2100(var3 + 1, var5); - int var9 = Login.method2100(var3, var5 + 1); - int var10 = Login.method2100(var3 + 1, var5 + 1); - int var12 = 65536 - Rasterizer3D.Rasterizer3D_cosine[var4 * 1024 / var2] >> 1; - int var11 = ((65536 - var12) * var7 >> 16) + (var12 * var8 >> 16); - int var14 = 65536 - Rasterizer3D.Rasterizer3D_cosine[var4 * 1024 / var2] >> 1; - int var13 = ((65536 - var14) * var9 >> 16) + (var10 * var14 >> 16); - int var16 = 65536 - Rasterizer3D.Rasterizer3D_cosine[var6 * 1024 / var2] >> 1; - int var15 = ((65536 - var16) * var11 >> 16) + (var13 * var16 >> 16); - return var15; - } + var16 = class173.distances[var18][var19] + 1; + if (var18 > 0 && class173.directions[var18 - 1][var19] == 0 && (var13[var14 - 1][var15] & 19136782) == 0 && (var13[var14 - 1][var15 + var2 - 1] & 19136824) == 0) { + var17 = 1; - @ObfuscatedName("hu") - @ObfuscatedSignature( - signature = "(ILjava/lang/String;I)V", - garbageValue = "-1330882873" - ) - static void method201(int var0, String var1) { - int var2 = Players.Players_count; - int[] var3 = Players.Players_indices; - boolean var4 = false; - Username var5 = new Username(var1, WorldMapSection1.loginType); + while (true) { + if (var17 >= var2 - 1) { + class173.bufferX[var20] = var5 - 1; + class173.bufferY[var20] = var6; + var20 = var20 + 1 & 4095; + class173.directions[var18 - 1][var19] = 2; + class173.distances[var18 - 1][var19] = var16; + break; + } - for (int var6 = 0; var6 < var2; ++var6) { - Player var7 = Client.players[var3[var6]]; - if (var7 != null && var7 != class223.localPlayer && var7.username != null && var7.username.equals(var5)) { - PacketBufferNode var8; - if (var0 == 1) { - var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2231, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntME(var3[var6]); - var8.packetBuffer.method5467(0); - Client.packetWriter.addNode(var8); - } else if (var0 == 4) { - var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2271, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(var3[var6]); - var8.packetBuffer.method5468(0); - Client.packetWriter.addNode(var8); - } else if (var0 == 6) { - var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2214, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(var3[var6]); - var8.packetBuffer.method5467(0); - Client.packetWriter.addNode(var8); - } else if (var0 == 7) { - var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2274, Client.packetWriter.isaacCipher); - var8.packetBuffer.method5476(var3[var6]); - var8.packetBuffer.method5467(0); - Client.packetWriter.addNode(var8); + if ((var13[var14 - 1][var17 + var15] & 19136830) != 0) { + break; + } + + ++var17; + } + } + + if (var18 < 128 - var2 && class173.directions[var18 + 1][var19] == 0 && (var13[var14 + var2][var15] & 19136899) == 0 && (var13[var14 + var2][var15 + var2 - 1] & 19136992) == 0) { + var17 = 1; + + while (true) { + if (var17 >= var2 - 1) { + class173.bufferX[var20] = var5 + 1; + class173.bufferY[var20] = var6; + var20 = var20 + 1 & 4095; + class173.directions[var18 + 1][var19] = 8; + class173.distances[var18 + 1][var19] = var16; + break; + } + + if ((var13[var14 + var2][var17 + var15] & 19136995) != 0) { + break; + } + + ++var17; + } + } + + if (var19 > 0 && class173.directions[var18][var19 - 1] == 0 && (var13[var14][var15 - 1] & 19136782) == 0 && (var13[var14 + var2 - 1][var15 - 1] & 19136899) == 0) { + var17 = 1; + + while (true) { + if (var17 >= var2 - 1) { + class173.bufferX[var20] = var5; + class173.bufferY[var20] = var6 - 1; + var20 = var20 + 1 & 4095; + class173.directions[var18][var19 - 1] = 1; + class173.distances[var18][var19 - 1] = var16; + break; + } + + if ((var13[var14 + var17][var15 - 1] & 19136911) != 0) { + break; + } + + ++var17; + } + } + + if (var19 < 128 - var2 && class173.directions[var18][var19 + 1] == 0 && (var13[var14][var15 + var2] & 19136824) == 0 && (var13[var14 + var2 - 1][var15 + var2] & 19136992) == 0) { + var17 = 1; + + while (true) { + if (var17 >= var2 - 1) { + class173.bufferX[var20] = var5; + class173.bufferY[var20] = var6 + 1; + var20 = var20 + 1 & 4095; + class173.directions[var18][var19 + 1] = 4; + class173.distances[var18][var19 + 1] = var16; + break; + } + + if ((var13[var17 + var14][var15 + var2] & 19137016) != 0) { + break; + } + + ++var17; + } + } + + if (var18 > 0 && var19 > 0 && class173.directions[var18 - 1][var19 - 1] == 0 && (var13[var14 - 1][var15 - 1] & 19136782) == 0) { + var17 = 1; + + while (true) { + if (var17 >= var2) { + class173.bufferX[var20] = var5 - 1; + class173.bufferY[var20] = var6 - 1; + var20 = var20 + 1 & 4095; + class173.directions[var18 - 1][var19 - 1] = 3; + class173.distances[var18 - 1][var19 - 1] = var16; + break; + } + + if ((var13[var14 - 1][var17 + (var15 - 1)] & 19136830) != 0 || (var13[var17 + (var14 - 1)][var15 - 1] & 19136911) != 0) { + break; + } + + ++var17; + } + } + + if (var18 < 128 - var2 && var19 > 0 && class173.directions[var18 + 1][var19 - 1] == 0 && (var13[var14 + var2][var15 - 1] & 19136899) == 0) { + var17 = 1; + + while (true) { + if (var17 >= var2) { + class173.bufferX[var20] = var5 + 1; + class173.bufferY[var20] = var6 - 1; + var20 = var20 + 1 & 4095; + class173.directions[var18 + 1][var19 - 1] = 9; + class173.distances[var18 + 1][var19 - 1] = var16; + break; + } + + if ((var13[var14 + var2][var17 + (var15 - 1)] & 19136995) != 0 || (var13[var14 + var17][var15 - 1] & 19136911) != 0) { + break; + } + + ++var17; + } + } + + if (var18 > 0 && var19 < 128 - var2 && class173.directions[var18 - 1][var19 + 1] == 0 && (var13[var14 - 1][var15 + var2] & 19136824) == 0) { + for (var17 = 1; var17 < var2; ++var17) { + if ((var13[var14 - 1][var17 + var15] & 19136830) != 0 || (var13[var17 + (var14 - 1)][var15 + var2] & 19137016) != 0) { + continue label290; + } + } + + class173.bufferX[var20] = var5 - 1; + class173.bufferY[var20] = var6 + 1; + var20 = var20 + 1 & 4095; + class173.directions[var18 - 1][var19 + 1] = 6; + class173.distances[var18 - 1][var19 + 1] = var16; + } + } while(var18 >= 128 - var2); + } while(var19 >= 128 - var2); + } while(class173.directions[var18 + 1][var19 + 1] != 0); + } while((var13[var14 + var2][var15 + var2] & 19136992) != 0); + + for (var17 = 1; var17 < var2; ++var17) { + if ((var13[var17 + var14][var15 + var2] & 19137016) != 0 || (var13[var14 + var2][var17 + var15] & 19136995) != 0) { + continue label313; + } } - var4 = true; - break; + class173.bufferX[var20] = var5 + 1; + class173.bufferY[var20] = var6 + 1; + var20 = var20 + 1 & 4095; + class173.directions[var18 + 1][var19 + 1] = 12; + class173.distances[var18 + 1][var19 + 1] = var16; } } + } - if (!var4) { - class210.addGameMessage(4, "", "Unable to find " + var1); + @ObfuscatedName("fj") + @ObfuscatedSignature( + signature = "(ZB)V", + garbageValue = "-93" + ) + static final void method235(boolean var0) { + if (var0) { + Client.field850 = Login.field1177 ? class160.field1987 : class160.field1985; + } else { + Client.field850 = ScriptEvent.clientPreferences.parameters.containsKey(GrandExchangeEvents.method108(Login.Login_username)) ? class160.field1986 : class160.field1982; } } diff --git a/runescape-client/src/main/java/WorldMapManager.java b/runescape-client/src/main/java/WorldMapManager.java index 3c6fe8cc09..088f3c2395 100644 --- a/runescape-client/src/main/java/WorldMapManager.java +++ b/runescape-client/src/main/java/WorldMapManager.java @@ -1,8 +1,3 @@ -import java.io.BufferedReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringReader; -import java.io.StringWriter; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -14,100 +9,108 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("al") +@ObfuscatedName("ax") @Implements("WorldMapManager") public final class WorldMapManager { - @ObfuscatedName("ai") - @Export("null_string") - protected static String null_string; - @ObfuscatedName("z") + @ObfuscatedName("sp") + @ObfuscatedGetter( + intValue = 889599309 + ) + @Export("foundItemIndex") + static int foundItemIndex; + @ObfuscatedName("ab") + @ObfuscatedSignature( + signature = "Lls;" + ) + static Bounds field319; + @ObfuscatedName("a") @Export("loaded") boolean loaded; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("loadStarted") boolean loadStarted; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lan;" + signature = "Lap;" ) @Export("mapAreaData") WorldMapAreaData mapAreaData; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Llf;" + signature = "Llx;" ) @Export("compositeTextureSprite") Sprite compositeTextureSprite; - @ObfuscatedName("r") + @ObfuscatedName("v") @Export("icons") HashMap icons; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "[[Laa;" + signature = "[[Laq;" ) @Export("regions") WorldMapRegion[][] regions; - @ObfuscatedName("q") - HashMap field301; - @ObfuscatedName("m") + @ObfuscatedName("c") + HashMap field305; + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "[Llp;" + signature = "[Llw;" ) @Export("mapSceneSprites") IndexedSprite[] mapSceneSprites; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("geographyArchive") final AbstractArchive geographyArchive; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("groundArchive") final AbstractArchive groundArchive; - @ObfuscatedName("c") + @ObfuscatedName("m") @Export("fonts") final HashMap fonts; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = -753174201 + intValue = 1993674285 ) @Export("tileX") int tileX; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = 16562041 + intValue = 1616288973 ) @Export("tileY") int tileY; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = -2004318801 + intValue = 1425172909 ) @Export("tileWidth") int tileWidth; - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedGetter( - intValue = -933992128 + intValue = 1098250673 ) @Export("tileHeight") int tileHeight; - @ObfuscatedName("w") + @ObfuscatedName("j") @ObfuscatedGetter( - intValue = 1390818345 + intValue = -1842385169 ) @Export("pixelsPerTile") public int pixelsPerTile; @ObfuscatedSignature( - signature = "([Llp;Ljava/util/HashMap;Lhp;Lhp;)V" + signature = "([Llw;Ljava/util/HashMap;Lhq;Lhq;)V" ) public WorldMapManager(IndexedSprite[] var1, HashMap var2, AbstractArchive var3, AbstractArchive var4) { this.loaded = false; this.loadStarted = false; - this.field301 = new HashMap(); + this.field305 = new HashMap(); this.pixelsPerTile = 0; this.mapSceneSprites = var1; this.fonts = var2; @@ -115,10 +118,10 @@ public final class WorldMapManager { this.groundArchive = var4; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lhp;Ljava/lang/String;ZS)V", - garbageValue = "8475" + signature = "(Lhq;Ljava/lang/String;ZI)V", + garbageValue = "1202484367" ) @Export("load") public void load(AbstractArchive var1, String var2, boolean var3) { @@ -126,9 +129,9 @@ public final class WorldMapManager { this.loaded = false; this.loadStarted = true; System.nanoTime(); - int var4 = var1.getGroupId(WorldMapCacheName.field284.name); + int var4 = var1.getGroupId(WorldMapCacheName.field288.name); int var5 = var1.getFileId(var4, var2); - Buffer var6 = new Buffer(var1.takeFileByNames(WorldMapCacheName.field284.name, var2)); + Buffer var6 = new Buffer(var1.takeFileByNames(WorldMapCacheName.field288.name, var2)); Buffer var7 = new Buffer(var1.takeFileByNames(WorldMapCacheName.field289.name, var2)); System.nanoTime(); System.nanoTime(); @@ -144,14 +147,14 @@ public final class WorldMapManager { this.mapAreaData.getOriginPlane(); this.mapAreaData.getOriginY(); this.tileX = this.mapAreaData.getRegionLowX() * 64; - this.tileY = this.mapAreaData.getRegionLowY() * 4096; - this.tileWidth = (this.mapAreaData.getRegionHighX() - this.mapAreaData.getRegionLowX() + 1) * 4096; - this.tileHeight = (this.mapAreaData.getRegionHighY() - this.mapAreaData.getRegionLowY() + 1) * 4096; + this.tileY = this.mapAreaData.getRegionLowY() * 64; + this.tileWidth = (this.mapAreaData.getRegionHighX() - this.mapAreaData.getRegionLowX() + 1) * 64; + this.tileHeight = (this.mapAreaData.getRegionHighY() - this.mapAreaData.getRegionLowY() + 1) * 64; int var16 = this.mapAreaData.getRegionHighX() - this.mapAreaData.getRegionLowX() + 1; int var9 = this.mapAreaData.getRegionHighY() - this.mapAreaData.getRegionLowY() + 1; System.nanoTime(); System.nanoTime(); - class3.WorldMapRegion_clearCachedSprites(); + ViewportMouse.WorldMapRegion_clearCachedSprites(); this.regions = new WorldMapRegion[var16][var9]; Iterator var10 = this.mapAreaData.worldMapData0Set.iterator(); @@ -176,9 +179,9 @@ public final class WorldMapManager { System.nanoTime(); System.nanoTime(); - if (var1.isValidFileName(WorldMapCacheName.field283.name, var2)) { - byte[] var20 = var1.takeFileByNames(WorldMapCacheName.field283.name, var2); - this.compositeTextureSprite = class40.convertJpgToSprite(var20); + if (var1.isValidFileName(WorldMapCacheName.field290.name, var2)) { + byte[] var20 = var1.takeFileByNames(WorldMapCacheName.field290.name, var2); + this.compositeTextureSprite = WorldMapSection1.convertJpgToSprite(var20); } System.nanoTime(); @@ -188,20 +191,20 @@ public final class WorldMapManager { } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1715469054" + garbageValue = "483780735" ) @Export("clearIcons") public final void clearIcons() { this.icons = null; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(IIIIIIIII)V", - garbageValue = "-99829048" + garbageValue = "1443794964" ) @Export("drawTiles") public final void drawTiles(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { @@ -214,10 +217,10 @@ public final class WorldMapManager { float var14 = this.getPixelsPerTile(var7 - var5, var3 - var1); int var15 = (int)Math.ceil((double)var14); this.pixelsPerTile = var15; - if (!this.field301.containsKey(var15)) { + if (!this.field305.containsKey(var15)) { class40 var16 = new class40(var15); var16.init(); - this.field301.put(var15, var16); + this.field305.put(var15, var16); } int var23 = var13.width + var13.x - 1; @@ -227,7 +230,7 @@ public final class WorldMapManager { int var19; for (var18 = var13.x; var18 <= var23; ++var18) { for (var19 = var13.y; var19 <= var17; ++var19) { - this.regions[var18][var19].drawTile(var15, (class40)this.field301.get(var15), this.mapSceneSprites, this.geographyArchive, this.groundArchive); + this.regions[var18][var19].drawTile(var15, (class40)this.field305.get(var15), this.mapSceneSprites, this.geographyArchive, this.groundArchive); } } @@ -235,20 +238,20 @@ public final class WorldMapManager { Rasterizer2D.Rasterizer2D_setClipArray(var12); var18 = (int)(var14 * 64.0F); var19 = this.tileX * 4096 + var1; - int var20 = this.tileY * 64 + var2; + int var20 = this.tileY * 4096 + var2; - for (int var21 = var13.x; var21 < var13.width + var13.x; ++var21) { - for (int var22 = var13.y; var22 < var13.y + var13.height; ++var22) { - this.regions[var21][var22].method441(var5 + var18 * (this.regions[var21][var22].regionX * 64 - var19) / 64, var8 - var18 * (this.regions[var21][var22].regionY * 64 - var20 + 64) / 64, var18); + for (int var21 = var13.x; var21 < var13.x + var13.width; ++var21) { + for (int var22 = var13.y; var22 < var13.height + var13.y; ++var22) { + this.regions[var21][var22].method481(var5 + var18 * (this.regions[var21][var22].regionX * 64 - var19) / 64, var8 - var18 * (this.regions[var21][var22].regionY * 64 - var20 + 64) / 64, var18); } } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(IIIIIIIILjava/util/HashSet;Ljava/util/HashSet;IIZI)V", - garbageValue = "-1410717760" + signature = "(IIIIIIIILjava/util/HashSet;Ljava/util/HashSet;IIZB)V", + garbageValue = "40" ) @Export("drawElements") public final void drawElements(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) { @@ -256,23 +259,23 @@ public final class WorldMapManager { float var15 = this.getPixelsPerTile(var7 - var5, var3 - var1); int var16 = (int)(64.0F * var15); int var17 = this.tileX * 4096 + var1; - int var18 = this.tileY * 64 + var2; + int var18 = this.tileY * 4096 + var2; int var19; int var20; - for (var19 = var14.x; var19 < var14.x + var14.width; ++var19) { + for (var19 = var14.x; var19 < var14.width + var14.x; ++var19) { for (var20 = var14.y; var20 < var14.y + var14.height; ++var20) { if (var13) { this.regions[var19][var20].initWorldMapIcon1s(); } - this.regions[var19][var20].method451(var5 + var16 * (this.regions[var19][var20].regionX * 64 - var17) / 64, var8 - var16 * (this.regions[var19][var20].regionY * 64 - var18 + 64) / 64, var16, var9); + this.regions[var19][var20].method491(var5 + var16 * (this.regions[var19][var20].regionX * 64 - var17) / 64, var8 - var16 * (this.regions[var19][var20].regionY * 64 - var18 + 64) / 64, var16, var9); } } if (var10 != null && var11 > 0) { - for (var19 = var14.x; var19 < var14.x + var14.width; ++var19) { - for (var20 = var14.y; var20 < var14.height + var14.y; ++var20) { + for (var19 = var14.x; var19 < var14.width + var14.x; ++var19) { + for (var20 = var14.y; var20 < var14.y + var14.height; ++var20) { this.regions[var19][var20].flashElements(var10, var11, var12); } } @@ -280,10 +283,10 @@ public final class WorldMapManager { } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(IIIILjava/util/HashSet;IIB)V", - garbageValue = "-113" + signature = "(IIIILjava/util/HashSet;III)V", + garbageValue = "-359946727" ) @Export("drawOverview") public void drawOverview(int var1, int var2, int var3, int var4, HashSet var5, int var6, int var7) { @@ -311,8 +314,8 @@ public final class WorldMapManager { while (var11.hasNext()) { AbstractWorldMapIcon var12 = (AbstractWorldMapIcon)var11.next(); - int var13 = var3 * (var12.coord2.x - this.tileX * 4096) / (this.tileWidth * 64); - int var14 = var4 - var4 * (var12.coord2.y - this.tileY * 64) / (this.tileHeight * 64); + int var13 = var3 * (var12.coord2.x - this.tileX * 4096) / (this.tileWidth * 4096); + int var14 = var4 - (var12.coord2.y - this.tileY * 4096) * var4 / (this.tileHeight * 4096); Rasterizer2D.Rasterizer2D_drawCircleAlpha(var13 + var1, var14 + var2, 2, 16776960, 256); } } @@ -320,12 +323,12 @@ public final class WorldMapManager { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IIIIIIIIIII)Ljava/util/List;", - garbageValue = "642627718" + signature = "(IIIIIIIIIIB)Ljava/util/List;", + garbageValue = "0" ) - public List method664(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { + public List method694(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.loaded) { return var11; @@ -334,11 +337,11 @@ public final class WorldMapManager { float var13 = this.getPixelsPerTile(var7, var3 - var1); int var14 = (int)(var13 * 64.0F); int var15 = this.tileX * 4096 + var1; - int var16 = this.tileY * 64 + var2; + int var16 = this.tileY * 4096 + var2; - for (int var17 = var12.x; var17 < var12.x + var12.width; ++var17) { + for (int var17 = var12.x; var17 < var12.width + var12.x; ++var17) { for (int var18 = var12.y; var18 < var12.y + var12.height; ++var18) { - List var19 = this.regions[var17][var18].method472(var5 + var14 * (this.regions[var17][var18].regionX * 64 - var15) / 64, var8 + var6 - var14 * (this.regions[var17][var18].regionY * 64 - var16 + 64) / 64, var14, var9, var10); + List var19 = this.regions[var17][var18].method512(var5 + var14 * (this.regions[var17][var18].regionX * 64 - var15) / 64, var8 + var6 - var14 * (this.regions[var17][var18].regionY * 64 - var16 + 64) / 64, var14, var9, var10); if (!var19.isEmpty()) { var11.addAll(var19); } @@ -349,18 +352,18 @@ public final class WorldMapManager { } } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(IIIII)Lj;", - garbageValue = "1969728750" + signature = "(IIIII)Lg;", + garbageValue = "551027092" ) @Export("createWorldMapRectangle") WorldMapRectangle createWorldMapRectangle(int var1, int var2, int var3, int var4) { WorldMapRectangle var5 = new WorldMapRectangle(this); int var6 = this.tileX * 4096 + var1; - int var7 = this.tileY * 64 + var2; + int var7 = this.tileY * 4096 + var2; int var8 = var3 + this.tileX * 4096; - int var9 = this.tileY * 64 + var4; + int var9 = this.tileY * 4096 + var4; int var10 = var6 / 64; int var11 = var7 / 64; int var12 = var8 / 64; @@ -392,20 +395,20 @@ public final class WorldMapManager { return var5; } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( signature = "(I)Z", - garbageValue = "-1274702917" + garbageValue = "674721772" ) @Export("isLoaded") public boolean isLoaded() { return this.loaded; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( signature = "(I)Ljava/util/HashMap;", - garbageValue = "1690655537" + garbageValue = "97354475" ) @Export("buildIcons") public HashMap buildIcons() { @@ -413,10 +416,10 @@ public final class WorldMapManager { return this.icons; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-273211151" + garbageValue = "1057404045" ) @Export("buildIcons0") void buildIcons0() { @@ -450,10 +453,10 @@ public final class WorldMapManager { } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(III)F", - garbageValue = "-1120188290" + signature = "(IIS)F", + garbageValue = "-15998" ) @Export("getPixelsPerTile") float getPixelsPerTile(int var1, int var2) { @@ -468,511 +471,119 @@ public final class WorldMapManager { } } - @ObfuscatedName("n") + @ObfuscatedName("ho") @ObfuscatedSignature( - signature = "(Lkf;IB)V", - garbageValue = "74" + signature = "(ZLkf;S)V", + garbageValue = "25602" ) - @Export("updatePlayers") - static final void updatePlayers(PacketBuffer var0, int var1) { - int var2 = var0.offset; - Players.Players_pendingUpdateCount = 0; - int var3 = 0; - var0.importIndex(); - - int var4; - int var5; - int var6; - int var8; - int var9; - byte[] var10000; - for (var4 = 0; var4 < Players.Players_count; ++var4) { - var5 = Players.Players_indices[var4]; - if ((Players.field1244[var5] & 1) == 0) { - if (var3 > 0) { - --var3; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else { - var6 = var0.readBits(1); - if (var6 == 0) { - var8 = var0.readBits(2); - if (var8 == 0) { - var9 = 0; - } else if (var8 == 1) { - var9 = var0.readBits(5); - } else if (var8 == 2) { - var9 = var0.readBits(8); - } else { - var9 = var0.readBits(11); - } - - var3 = var9; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else { - UrlRequest.readPlayerUpdate(var0, var5); - } - } - } - } - - var0.exportIndex(); - if (var3 != 0) { - throw new RuntimeException(); - } else { - var0.importIndex(); - - for (var4 = 0; var4 < Players.Players_count; ++var4) { - var5 = Players.Players_indices[var4]; - if ((Players.field1244[var5] & 1) != 0) { - if (var3 > 0) { - --var3; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else { - var6 = var0.readBits(1); - if (var6 == 0) { - var8 = var0.readBits(2); - if (var8 == 0) { - var9 = 0; - } else if (var8 == 1) { - var9 = var0.readBits(5); - } else if (var8 == 2) { - var9 = var0.readBits(8); - } else { - var9 = var0.readBits(11); - } - - var3 = var9; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else { - UrlRequest.readPlayerUpdate(var0, var5); - } - } - } - } - - var0.exportIndex(); - if (var3 != 0) { - throw new RuntimeException(); - } else { - var0.importIndex(); - - for (var4 = 0; var4 < Players.Players_emptyIdxCount; ++var4) { - var5 = Players.Players_emptyIndices[var4]; - if ((Players.field1244[var5] & 1) != 0) { - if (var3 > 0) { - --var3; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else { - var6 = var0.readBits(1); - if (var6 == 0) { - var8 = var0.readBits(2); - if (var8 == 0) { - var9 = 0; - } else if (var8 == 1) { - var9 = var0.readBits(5); - } else if (var8 == 2) { - var9 = var0.readBits(8); - } else { - var9 = var0.readBits(11); - } - - var3 = var9; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else if (class290.updateExternalPlayer(var0, var5)) { - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } - } - } - } - - var0.exportIndex(); - if (var3 != 0) { - throw new RuntimeException(); - } else { - var0.importIndex(); - - for (var4 = 0; var4 < Players.Players_emptyIdxCount; ++var4) { - var5 = Players.Players_emptyIndices[var4]; - if ((Players.field1244[var5] & 1) == 0) { - if (var3 > 0) { - --var3; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else { - var6 = var0.readBits(1); - if (var6 == 0) { - var8 = var0.readBits(2); - if (var8 == 0) { - var9 = 0; - } else if (var8 == 1) { - var9 = var0.readBits(5); - } else if (var8 == 2) { - var9 = var0.readBits(8); - } else { - var9 = var0.readBits(11); - } - - var3 = var9; - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } else if (class290.updateExternalPlayer(var0, var5)) { - var10000 = Players.field1244; - var10000[var5] = (byte)(var10000[var5] | 2); - } - } - } - } - - var0.exportIndex(); - if (var3 != 0) { - throw new RuntimeException(); - } else { - Players.Players_count = 0; - Players.Players_emptyIdxCount = 0; - - Player var16; - for (var4 = 1; var4 < 2048; ++var4) { - var10000 = Players.field1244; - var10000[var4] = (byte)(var10000[var4] >> 1); - var16 = Client.players[var4]; - if (var16 != null) { - Players.Players_indices[++Players.Players_count - 1] = var4; - } else { - Players.Players_emptyIndices[++Players.Players_emptyIdxCount - 1] = var4; - } - } - - for (var3 = 0; var3 < Players.Players_pendingUpdateCount; ++var3) { - var4 = Players.Players_pendingUpdateIndices[var3]; - var16 = Client.players[var4]; - var6 = var0.readUnsignedByte(); - if ((var6 & 1) != 0) { - var6 += var0.readUnsignedByte() << 8; - } - - byte var7 = -1; - if ((var6 & 256) != 0) { - for (var8 = 0; var8 < 3; ++var8) { - var16.actions[var8] = var0.readStringCp1252NullTerminated(); - } - } - - if ((var6 & 2048) != 0) { - var16.spotAnimation = var0.readUnsignedShort(); - var8 = var0.readInt(); - var16.heightOffset = var8 >> 16; - var16.field969 = (var8 & 65535) + Client.cycle; - var16.spotAnimationFrame = 0; - var16.spotAnimationFrameCycle = 0; - if (var16.field969 > Client.cycle) { - var16.spotAnimationFrame = -1; - } - - if (var16.spotAnimation == 65535) { - var16.spotAnimation = -1; - } - } - - if ((var6 & 2) != 0) { - var16.overheadText = var0.readStringCp1252NullTerminated(); - if (var16.overheadText.charAt(0) == '~') { - var16.overheadText = var16.overheadText.substring(1); - class210.addGameMessage(2, var16.username.getName(), var16.overheadText); - } else if (var16 == class223.localPlayer) { - class210.addGameMessage(2, var16.username.getName(), var16.overheadText); - } - - var16.isAutoChatting = false; - var16.overheadTextColor = 0; - var16.overheadTextEffect = 0; - var16.overheadTextCyclesRemaining = 150; - } - - if ((var6 & 8) != 0) { - var8 = var0.method5471(); - byte[] var17 = new byte[var8]; - Buffer var10 = new Buffer(var17); - var0.method5494(var17, 0, var8); - Players.field1236[var4] = var10; - var16.read(var10); - } - - int var11; - int var12; - int var15; - if ((var6 & 128) != 0) { - var8 = var0.readUnsignedShort(); - PlayerType var22 = (PlayerType)NetSocket.findEnumerated(class226.PlayerType_values(), var0.readUnsignedByte()); - boolean var18 = var0.method5471() == 1; - var11 = var0.method5471(); - var12 = var0.offset; - if (var16.username != null && var16.appearance != null) { - boolean var13 = false; - if (var22.isUser && Tiles.friendSystem.isIgnored(var16.username)) { - var13 = true; - } - - if (!var13 && Client.field634 == 0 && !var16.isHidden) { - Players.field1246.offset = 0; - var0.method5493(Players.field1246.array, 0, var11); - Players.field1246.offset = 0; - String var14 = AbstractFont.escapeBrackets(NetSocket.method3471(class65.method1250(Players.field1246))); - var16.overheadText = var14.trim(); - var16.overheadTextColor = var8 >> 8; - var16.overheadTextEffect = var8 & 255; - var16.overheadTextCyclesRemaining = 150; - var16.isAutoChatting = var18; - var16.field944 = var16 != class223.localPlayer && var22.isUser && "" != Client.field907 && var14.toLowerCase().indexOf(Client.field907) == -1; - if (var22.isPrivileged) { - var15 = var18 ? 91 : 1; - } else { - var15 = var18 ? 90 : 2; - } - - if (var22.modIcon != -1) { - class210.addGameMessage(var15, class247.method4455(var22.modIcon) + var16.username.getName(), var14); - } else { - class210.addGameMessage(var15, var16.username.getName(), var14); - } - } - } - - var0.offset = var11 + var12; - } - - if ((var6 & 4096) != 0) { - Players.field1235[var4] = var0.readByte(); - } - - if ((var6 & 16) != 0) { - var8 = var0.method5647(); - if (var8 == 65535) { - var8 = -1; - } - - var9 = var0.readUnsignedByte(); - LoginPacket.performPlayerAnimation(var16, var8, var9); - } - - if ((var6 & 512) != 0) { - var7 = var0.readByte(); - } - - if ((var6 & 1024) != 0) { - var16.field971 = var0.method5473(); - var16.field973 = var0.method5475(); - var16.field972 = var0.method5473(); - var16.field974 = var0.method5473(); - var16.field948 = var0.readUnsignedShort() + Client.cycle; - var16.field976 = var0.method5647() + Client.cycle; - var16.field977 = var0.method5480(); - if (var16.field621) { - var16.field971 += var16.tileX; - var16.field973 += var16.tileY; - var16.field972 += var16.tileX; - var16.field974 += var16.tileY; - var16.pathLength = 0; - } else { - var16.field971 += var16.pathX[0]; - var16.field973 += var16.pathY[0]; - var16.field972 += var16.pathX[0]; - var16.field974 += var16.pathY[0]; - var16.pathLength = 1; - } - - var16.field988 = 0; - } - - if ((var6 & 4) != 0) { - var8 = var0.method5470(); - int var19; - int var21; - int var23; - if (var8 > 0) { - for (var9 = 0; var9 < var8; ++var9) { - var11 = -1; - var12 = -1; - var21 = -1; - var23 = var0.readUShortSmart(); - if (var23 == 32767) { - var23 = var0.readUShortSmart(); - var12 = var0.readUShortSmart(); - var11 = var0.readUShortSmart(); - var21 = var0.readUShortSmart(); - } else if (var23 != 32766) { - var12 = var0.readUShortSmart(); - } else { - var23 = -1; - } - - var19 = var0.readUShortSmart(); - var16.addHitSplat(var23, var12, var11, var21, Client.cycle, var19); - } - } - - var9 = var0.method5511(); - if (var9 > 0) { - for (var23 = 0; var23 < var9; ++var23) { - var11 = var0.readUShortSmart(); - var12 = var0.readUShortSmart(); - if (var12 != 32767) { - var21 = var0.readUShortSmart(); - var19 = var0.method5470(); - var15 = var12 > 0 ? var0.method5470() : var19; - var16.addHealthBar(var11, Client.cycle, var12, var21, var19, var15); - } else { - var16.removeHealthBar(var11); - } - } - } - } - - if ((var6 & 64) != 0) { - var16.targetIndex = var0.method5647(); - if (var16.targetIndex == 65535) { - var16.targetIndex = -1; - } - } - - if ((var6 & 32) != 0) { - var16.field957 = var0.readUnsignedShort(); - if (var16.pathLength == 0) { - var16.orientation = var16.field957; - var16.field957 = -1; - } - } - - if (var16.field621) { - if (var7 == 127) { - var16.resetPath(var16.tileX, var16.tileY); - } else { - byte var20; - if (var7 != -1) { - var20 = var7; - } else { - var20 = Players.field1235[var4]; - } - - var16.method1274(var16.tileX, var16.tileY, var20); - } - } - } - - if (var0.offset - var2 != var1) { - throw new RuntimeException(var0.offset - var2 + " " + var1); - } - } - } - } - } - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Ljava/lang/Throwable;B)Ljava/lang/String;", - garbageValue = "4" - ) - static String method685(Throwable var0) throws IOException { - String var1; - if (var0 instanceof RunException) { - RunException var2 = (RunException)var0; - var1 = var2.message + " | "; - var0 = var2.throwable; - } else { - var1 = ""; - } - - StringWriter var12 = new StringWriter(); - PrintWriter var3 = new PrintWriter(var12); - var0.printStackTrace(var3); - var3.close(); - String var4 = var12.toString(); - BufferedReader var5 = new BufferedReader(new StringReader(var4)); - String var6 = var5.readLine(); - + static final void method710(boolean var0, PacketBuffer var1) { while (true) { - while (true) { - String var7 = var5.readLine(); - if (var7 == null) { - var1 = var1 + "| " + var6; - return var1; - } - - int var8 = var7.indexOf(40); - int var9 = var7.indexOf(41, var8 + 1); - if (var8 >= 0 && var9 >= 0) { - String var10 = var7.substring(var8 + 1, var9); - int var11 = var10.indexOf(".java:"); - if (var11 >= 0) { - var10 = var10.substring(0, var11) + var10.substring(var11 + 5); - var1 = var1 + var10 + ' '; - continue; + if (var1.bitsRemaining(Client.packetWriter.serverPacketLength) >= 27) { + int var2 = var1.readBits(15); + if (var2 != 32767) { + boolean var3 = false; + if (Client.npcs[var2] == null) { + Client.npcs[var2] = new NPC(); + var3 = true; } - var7 = var7.substring(0, var8); - } + NPC var4 = Client.npcs[var2]; + Client.npcIndices[++Client.npcCount - 1] = var2; + var4.npcCycle = Client.cycle; + int var5 = Client.defaultRotations[var1.readBits(3)]; + if (var3) { + var4.orientation = var4.rotation = var5; + } - var7 = var7.trim(); - var7 = var7.substring(var7.lastIndexOf(32) + 1); - var7 = var7.substring(var7.lastIndexOf(9) + 1); - var1 = var1 + var7 + ' '; - } - } - } + int var6; + if (var0) { + var6 = var1.readBits(8); + if (var6 > 127) { + var6 -= 256; + } + } else { + var6 = var1.readBits(5); + if (var6 > 15) { + var6 -= 32; + } + } - @ObfuscatedName("jg") - @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "938839327" - ) - @Export("Widget_resetModelFrames") - static final void Widget_resetModelFrames(int var0) { - if (WorldMapData_0.loadInterface(var0)) { - Widget[] var1 = UserComparator5.Widget_interfaceComponents[var0]; + int var7; + if (var0) { + var7 = var1.readBits(8); + if (var7 > 127) { + var7 -= 256; + } + } else { + var7 = var1.readBits(5); + if (var7 > 15) { + var7 -= 32; + } + } - for (int var2 = 0; var2 < var1.length; ++var2) { - Widget var3 = var1[var2]; - if (var3 != null) { - var3.modelFrame = 0; - var3.modelFrameCycle = 0; + int var8 = var1.readBits(1); + if (var8 == 1) { + Client.field677[++Client.field676 - 1] = var2; + } + + var4.definition = SecureRandomCallable.getNpcDefinition(var1.readBits(14)); + int var9 = var1.readBits(1); + var4.field927 = var4.definition.size; + var4.field977 = var4.definition.rotation; + if (var4.field977 == 0) { + var4.rotation = 0; + } + + var4.walkSequence = var4.definition.walkSequence; + var4.walkBackSequence = var4.definition.walkBackSequence; + var4.walkLeftSequence = var4.definition.walkLeftSequence; + var4.walkRightSequence = var4.definition.walkRightSequence; + var4.readySequence = var4.definition.readySequence; + var4.turnLeftSequence = var4.definition.turnLeftSequence; + var4.turnRightSequence = var4.definition.turnRightSequence; + var4.method2178(class215.localPlayer.pathX[0] + var6, class215.localPlayer.pathY[0] + var7, var9 == 1); + continue; } } + var1.exportIndex(); + return; } } - @ObfuscatedName("jh") + @ObfuscatedName("kg") @ObfuscatedSignature( - signature = "(IIII)Lbk;", - garbageValue = "1688623868" + signature = "(IIIILlx;Lhn;B)V", + garbageValue = "14" ) - static final InterfaceParent method679(int var0, int var1, int var2) { - InterfaceParent var3 = new InterfaceParent(); - var3.group = var1; - var3.type = var2; - Client.interfaceParents.put(var3, (long)var0); - Widget_resetModelFrames(var1); - Widget var4 = Canvas.getWidget(var0); - WorldMapSectionType.invalidateWidget(var4); - if (Client.meslayerContinueWidget != null) { - WorldMapSectionType.invalidateWidget(Client.meslayerContinueWidget); - Client.meslayerContinueWidget = null; + @Export("worldToMinimap") + static final void worldToMinimap(int var0, int var1, int var2, int var3, Sprite var4, SpriteMask var5) { + int var6 = var3 * var3 + var2 * var2; + if (var6 > 4225 && var6 < 90000) { + int var7 = Client.camAngleY & 2047; + int var8 = Rasterizer3D.Rasterizer3D_sine[var7]; + int var9 = Rasterizer3D.Rasterizer3D_cosine[var7]; + int var10 = var3 * var8 + var9 * var2 >> 16; + int var11 = var3 * var9 - var8 * var2 >> 16; + double var12 = Math.atan2((double)var10, (double)var11); + int var14 = var5.width / 2 - 25; + int var15 = (int)(Math.sin(var12) * (double)var14); + int var16 = (int)(Math.cos(var12) * (double)var14); + byte var17 = 20; + class4.redHintArrowSprite.method6331(var15 + (var0 + var5.width / 2 - var17 / 2), var5.height / 2 + var1 - var17 / 2 - var16 - 10, var17, var17, 15, 15, var12, 256); + } else { + Message.drawSpriteOnMinimap(var0, var1, var2, var3, var4, var5); } - SecureRandomFuture.method2138(); - GameShell.revalidateWidgetScroll(UserComparator5.Widget_interfaceComponents[var0 >> 16], var4, false); - class186.runWidgetOnLoadListener(var1); - if (Client.rootInterface != -1) { - class40.runIntfCloseListeners(Client.rootInterface, 1); - } + } - return var3; + @ObfuscatedName("ls") + @ObfuscatedSignature( + signature = "(Lhi;I)Z", + garbageValue = "1830687917" + ) + @Export("isComponentHidden") + static boolean isComponentHidden(Widget var0) { + return var0.isHidden; } } diff --git a/runescape-client/src/main/java/WorldMapRectangle.java b/runescape-client/src/main/java/WorldMapRectangle.java index cc012a06ab..376bb0f1eb 100644 --- a/runescape-client/src/main/java/WorldMapRectangle.java +++ b/runescape-client/src/main/java/WorldMapRectangle.java @@ -1,86 +1,85 @@ +import java.lang.management.GarbageCollectorMXBean; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("j") +@ObfuscatedName("g") @Implements("WorldMapRectangle") public final class WorldMapRectangle { - @ObfuscatedName("jz") - @ObfuscatedGetter( - intValue = 1984702959 + @ObfuscatedName("az") + @Export("garbageCollector") + static GarbageCollectorMXBean garbageCollector; + @ObfuscatedName("da") + @ObfuscatedSignature( + signature = "Lij;" ) - @Export("plane") - static int plane; - @ObfuscatedName("z") + @Export("archive5") + static Archive archive5; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1437732891 + intValue = 1532996023 ) @Export("width") int width; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 2120102399 + intValue = 1074261311 ) @Export("height") int height; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -1194762567 + intValue = 829209927 ) @Export("x") int x; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1496265891 + intValue = 2070361413 ) @Export("y") int y; // $FF: synthetic field @ObfuscatedSignature( - signature = "Lal;" + signature = "Lax;" ) final WorldMapManager this$0; @ObfuscatedSignature( - signature = "(Lal;)V" + signature = "(Lax;)V" ) WorldMapRectangle(WorldMapManager var1) { this.this$0 = var1; } - @ObfuscatedName("p") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lhp;Ljava/lang/String;Ljava/lang/String;I)Llp;", - garbageValue = "669461373" + signature = "(Lhq;Ljava/lang/String;Ljava/lang/String;IZI)V", + garbageValue = "1156517965" ) - @Export("SpriteBuffer_getIndexedSpriteByName") - public static IndexedSprite SpriteBuffer_getIndexedSpriteByName(AbstractArchive var0, String var1, String var2) { - int var3 = var0.getGroupId(var1); - int var4 = var0.getFileId(var3, var2); - IndexedSprite var5; - if (!VertexNormal.method2962(var0, var3, var4)) { - var5 = null; - } else { - IndexedSprite var7 = new IndexedSprite(); - var7.width = class325.SpriteBuffer_spriteWidth; - var7.height = Frames.SpriteBuffer_spriteHeight; - var7.xOffset = class325.SpriteBuffer_xOffsets[0]; - var7.yOffset = MusicPatchPcmStream.SpriteBuffer_yOffsets[0]; - var7.subWidth = class325.SpriteBuffer_spriteWidths[0]; - var7.subHeight = RunException.SpriteBuffer_spriteHeights[0]; - var7.palette = class325.SpriteBuffer_spritePalette; - var7.pixels = PacketBufferNode.SpriteBuffer_pixels[0]; - class325.SpriteBuffer_xOffsets = null; - MusicPatchPcmStream.SpriteBuffer_yOffsets = null; - class325.SpriteBuffer_spriteWidths = null; - RunException.SpriteBuffer_spriteHeights = null; - class325.SpriteBuffer_spritePalette = null; - PacketBufferNode.SpriteBuffer_pixels = null; - var5 = var7; - } + public static void method330(AbstractArchive var0, String var1, String var2, int var3, boolean var4) { + int var5 = var0.getGroupId(var1); + int var6 = var0.getFileId(var5, var2); + MusicPatchNode2.method3830(var0, var5, var6, var3, var4); + } - return var5; + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-1565854351" + ) + public static void method331() { + VarpDefinition.VarpDefinition_cached.clear(); + } + + @ObfuscatedName("lf") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "1573335888" + ) + static void method329(int var0) { + Client.oculusOrbState = var0; } } diff --git a/runescape-client/src/main/java/WorldMapRegion.java b/runescape-client/src/main/java/WorldMapRegion.java index af93692baf..7028f0b5cc 100644 --- a/runescape-client/src/main/java/WorldMapRegion.java +++ b/runescape-client/src/main/java/WorldMapRegion.java @@ -1,6 +1,3 @@ -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -14,61 +11,55 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("aa") +@ObfuscatedName("aq") @Implements("WorldMapRegion") public class WorldMapRegion { - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Leu;" + signature = "Led;" ) @Export("WorldMapRegion_cachedSprites") public static DemotingHashTable WorldMapRegion_cachedSprites; - @ObfuscatedName("gk") - @ObfuscatedSignature( - signature = "[Llf;" - ) - @Export("headIconPrayerSprites") - static Sprite[] headIconPrayerSprites; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -1498517863 + intValue = -400219943 ) @Export("regionX") int regionX; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1147165053 + intValue = 1626366429 ) @Export("regionY") int regionY; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Lw;" + signature = "Lj;" ) @Export("worldMapData_0") WorldMapData_0 worldMapData_0; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("worldMapData1List") LinkedList worldMapData1List; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = -1662535699 + intValue = -1580506373 ) @Export("backgroundColor") int backgroundColor; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1749313949 + intValue = 799046691 ) @Export("pixelsPerTile") int pixelsPerTile; - @ObfuscatedName("b") + @ObfuscatedName("p") @Export("icon0List") List icon0List; - @ObfuscatedName("o") + @ObfuscatedName("h") @Export("iconMap") HashMap iconMap; - @ObfuscatedName("a") + @ObfuscatedName("k") @Export("fonts") final HashMap fonts; @@ -86,16 +77,18 @@ public class WorldMapRegion { this.fonts = var4; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(IIIB)V", - garbageValue = "-65" + garbageValue = "65" ) - void method441(int var1, int var2, int var3) { + void method481(int var1, int var2, int var3) { int var5 = this.regionX; int var6 = this.regionY; int var7 = this.pixelsPerTile; - Sprite var4 = (Sprite)WorldMapRegion_cachedSprites.get(SecureRandomCallable.method1165(var5, var6, var7)); + DemotingHashTable var8 = WorldMapRegion_cachedSprites; + long var9 = (long)(var7 << 16 | var5 << 8 | var6); + Sprite var4 = (Sprite)var8.get(var9); if (var4 != null) { if (var3 == this.pixelsPerTile * 64) { var4.drawAt(var1, var2); @@ -106,10 +99,10 @@ public class WorldMapRegion { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lw;Ljava/util/List;I)V", - garbageValue = "934044689" + signature = "(Lj;Ljava/util/List;I)V", + garbageValue = "-1282627601" ) @Export("initWorldMapData0") void initWorldMapData0(WorldMapData_0 var1, List var2) { @@ -118,10 +111,10 @@ public class WorldMapRegion { this.addAllToIconList(var2); } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(Ljava/util/HashSet;Ljava/util/List;S)V", - garbageValue = "-12839" + signature = "(Ljava/util/HashSet;Ljava/util/List;B)V", + garbageValue = "-46" ) @Export("initWorldMapData1") void initWorldMapData1(HashSet var1, List var2) { @@ -138,10 +131,10 @@ public class WorldMapRegion { this.addAllToIconList(var2); } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IIIILf;B)V", - garbageValue = "16" + signature = "(IIIILf;I)V", + garbageValue = "-1254135456" ) @Export("getIconsForTiles") void getIconsForTiles(int var1, int var2, int var3, int var4, AbstractWorldMapData var5) { @@ -158,13 +151,13 @@ public class WorldMapRegion { boolean var14; label64: { WorldMapDecoration var12 = var10[var11]; - var13 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var12.objectDefinitionId); + var13 = WorldMapDecorationType.getObjectDefinition(var12.objectDefinitionId); if (var13.transforms != null) { int[] var15 = var13.transforms; for (int var16 = 0; var16 < var15.length; ++var16) { int var17 = var15[var16]; - ObjectDefinition var18 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var17); + ObjectDefinition var18 = WorldMapDecorationType.getObjectDefinition(var17); if (var18.mapIconId != -1) { var14 = true; break label64; @@ -190,10 +183,10 @@ public class WorldMapRegion { } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Liz;IIILf;I)V", - garbageValue = "-1603765403" + signature = "(Lix;IIILf;I)V", + garbageValue = "-2054310192" ) @Export("getIcon") void getIcon(ObjectDefinition var1, int var2, int var3, int var4, AbstractWorldMapData var5) { @@ -203,24 +196,24 @@ public class WorldMapRegion { var7 = new Coord(this.worldMapData_0.minPlane + var2, var3 + this.worldMapData_0.regionXLow * 64, var4 + this.worldMapData_0.regionYLow * 64); } else { WorldMapData_1 var8 = (WorldMapData_1)var5; - var7 = new Coord(var2 + var8.minPlane, var8.regionXLow * 64 + var3 + var8.getChunkXLow() * 8, var8.regionYLow * 64 + var4 + var8.getChunkYLow() * 8); + var7 = new Coord(var2 + var8.minPlane, var8.regionXLow * 64 + var3 + var8.getChunkXLow() * 8, var4 + var8.regionYLow * 64 + var8.getChunkYLow() * 8); } Object var10; if (var1.transforms != null) { var10 = new WorldMapIcon_1(var7, var6, var1.id, this); } else { - WorldMapElement var9 = Decimator.WorldMapElement_get(var1.mapIconId); + WorldMapElement var9 = class65.WorldMapElement_get(var1.mapIconId); var10 = new WorldMapIcon_0(var7, var6, var9.objectId, this.createMapLabel(var9)); } this.iconMap.put(new Coord(0, var3, var4), var10); } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2006660895" + signature = "(S)V", + garbageValue = "16198" ) @Export("initWorldMapIcon1s") void initWorldMapIcon1s() { @@ -235,10 +228,10 @@ public class WorldMapRegion { } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(Ljava/util/List;I)V", - garbageValue = "-831141503" + signature = "(Ljava/util/List;B)V", + garbageValue = "100" ) @Export("addAllToIconList") void addAllToIconList(List var1) { @@ -247,19 +240,19 @@ public class WorldMapRegion { while (var2.hasNext()) { WorldMapIcon_0 var3 = (WorldMapIcon_0)var2.next(); if (var3.coord2.x >> 6 == this.regionX && var3.coord2.y >> 6 == this.regionY) { - WorldMapIcon_0 var4 = new WorldMapIcon_0(var3.coord2, var3.coord2, var3.element, this.method470(var3.element)); + WorldMapIcon_0 var4 = new WorldMapIcon_0(var3.coord2, var3.coord2, var3.element, this.method510(var3.element)); this.icon0List.add(var4); } } } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "2077260689" + garbageValue = "-2122151557" ) - void method448() { + void method488() { if (this.worldMapData_0 != null) { this.worldMapData_0.reset(); } else { @@ -273,10 +266,10 @@ public class WorldMapRegion { } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(Lhp;I)Z", - garbageValue = "1582385284" + signature = "(Lhq;I)Z", + garbageValue = "685287436" ) @Export("loadGeography") boolean loadGeography(AbstractArchive var1) { @@ -312,10 +305,10 @@ public class WorldMapRegion { } } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(ILak;[Llp;Lhp;Lhp;I)V", - garbageValue = "1768425388" + signature = "(ILae;[Llw;Lhq;Lhq;I)V", + garbageValue = "258503146" ) @Export("drawTile") void drawTile(int var1, class40 var2, IndexedSprite[] var3, AbstractArchive var4, AbstractArchive var5) { @@ -323,10 +316,12 @@ public class WorldMapRegion { if (this.worldMapData_0 != null || !this.worldMapData1List.isEmpty()) { int var7 = this.regionX; int var8 = this.regionY; - Sprite var6 = (Sprite)WorldMapRegion_cachedSprites.get(SecureRandomCallable.method1165(var7, var8, var1)); + DemotingHashTable var9 = WorldMapRegion_cachedSprites; + long var10 = (long)(var1 << 16 | var7 << 8 | var8); + Sprite var6 = (Sprite)var9.get(var10); if (var6 == null) { - boolean var9 = true; - var9 &= this.loadGeography(var4); + boolean var15 = true; + var15 &= this.loadGeography(var4); int var11; if (this.worldMapData_0 != null) { var11 = this.worldMapData_0.groupId; @@ -334,40 +329,37 @@ public class WorldMapRegion { var11 = ((AbstractWorldMapData)this.worldMapData1List.getFirst()).groupId; } - var9 &= var5.tryLoadGroup(var11); - if (var9) { - byte[] var10 = var5.takeFileFlat(var11); + var15 &= var5.tryLoadGroup(var11); + if (var15) { + byte[] var16 = var5.takeFileFlat(var11); WorldMapSprite var12; - if (var10 == null) { + if (var16 == null) { var12 = new WorldMapSprite(); } else { - var12 = new WorldMapSprite(class40.convertJpgToSprite(var10).pixels); + var12 = new WorldMapSprite(WorldMapSection1.convertJpgToSprite(var16).pixels); } Sprite var14 = new Sprite(this.pixelsPerTile * 64, this.pixelsPerTile * 64); var14.setRaster(); if (this.worldMapData_0 != null) { - this.method543(var2, var3, var12); + this.method546(var2, var3, var12); } else { - this.method454(var2, var3, var12); + this.method494(var2, var3, var12); } - int var15 = this.regionX; - int var16 = this.regionY; - int var17 = this.pixelsPerTile; - WorldMapRegion_cachedSprites.put(var14, SecureRandomCallable.method1165(var15, var16, var17), var14.pixels.length * 4); - this.method448(); + PlayerType.method4285(var14, this.regionX, this.regionY, this.pixelsPerTile); + this.method488(); } } } } - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(IIILjava/util/HashSet;B)V", - garbageValue = "62" + signature = "(IIILjava/util/HashSet;I)V", + garbageValue = "2023865774" ) - void method451(int var1, int var2, int var3, HashSet var4) { + void method491(int var1, int var2, int var3, HashSet var4) { if (var4 == null) { var4 = new HashSet(); } @@ -376,10 +368,10 @@ public class WorldMapRegion { this.drawMapLinks(var1, var2, var4, var3); } - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedSignature( - signature = "(Ljava/util/HashSet;III)V", - garbageValue = "-1219088991" + signature = "(Ljava/util/HashSet;IIB)V", + garbageValue = "69" ) @Export("flashElements") void flashElements(HashSet var1, int var2, int var3) { @@ -390,44 +382,44 @@ public class WorldMapRegion { if (var5.hasValidElement()) { int var6 = var5.getElement(); if (var1.contains(var6)) { - WorldMapElement var7 = Decimator.WorldMapElement_get(var6); + WorldMapElement var7 = class65.WorldMapElement_get(var6); this.drawBackgroundCircle(var7, var5.screenX, var5.screenY, var2, var3); } } } - this.method462(var1, var2, var3); + this.method502(var1, var2, var3); } - @ObfuscatedName("e") + @ObfuscatedName("x") @ObfuscatedSignature( - signature = "(Lak;[Llp;Laz;I)V", - garbageValue = "-2022635387" + signature = "(Lae;[Llw;Law;I)V", + garbageValue = "-2069208196" ) - void method543(class40 var1, IndexedSprite[] var2, WorldMapSprite var3) { + void method546(class40 var1, IndexedSprite[] var2, WorldMapSprite var3) { int var4; int var5; for (var4 = 0; var4 < 64; ++var4) { for (var5 = 0; var5 < 64; ++var5) { this.drawTileGround(var4, var5, this.worldMapData_0, var1, var3); - this.method457(var4, var5, this.worldMapData_0, var1); + this.method497(var4, var5, this.worldMapData_0, var1); } } for (var4 = 0; var4 < 64; ++var4) { for (var5 = 0; var5 < 64; ++var5) { - this.method455(var4, var5, this.worldMapData_0, var1, var2); + this.method536(var4, var5, this.worldMapData_0, var1, var2); } } } - @ObfuscatedName("x") + @ObfuscatedName("j") @ObfuscatedSignature( - signature = "(Lak;[Llp;Laz;B)V", - garbageValue = "70" + signature = "(Lae;[Llw;Law;I)V", + garbageValue = "-797610812" ) - void method454(class40 var1, IndexedSprite[] var2, WorldMapSprite var3) { + void method494(class40 var1, IndexedSprite[] var2, WorldMapSprite var3) { Iterator var4 = this.worldMapData1List.iterator(); WorldMapData_1 var5; @@ -439,7 +431,7 @@ public class WorldMapRegion { for (var6 = var5.getChunkX() * 8; var6 < var5.getChunkX() * 8 + 8; ++var6) { for (var7 = var5.getChunkY() * 8; var7 < var5.getChunkY() * 8 + 8; ++var7) { this.drawTileGround(var6, var7, var5, var1, var3); - this.method457(var6, var7, var5, var1); + this.method497(var6, var7, var5, var1); } } } @@ -451,27 +443,27 @@ public class WorldMapRegion { for (var6 = var5.getChunkX() * 8; var6 < var5.getChunkX() * 8 + 8; ++var6) { for (var7 = var5.getChunkY() * 8; var7 < var5.getChunkY() * 8 + 8; ++var7) { - this.method455(var6, var7, var5, var1, var2); + this.method536(var6, var7, var5, var1, var2); } } } } - @ObfuscatedName("h") + @ObfuscatedName("r") @ObfuscatedSignature( - signature = "(IILf;Lak;[Llp;I)V", - garbageValue = "-1519610368" + signature = "(IILf;Lae;[Llw;I)V", + garbageValue = "410912714" ) - void method455(int var1, int var2, AbstractWorldMapData var3, class40 var4, IndexedSprite[] var5) { - this.method460(var1, var2, var3); - this.method521(var1, var2, var3, var5); + void method536(int var1, int var2, AbstractWorldMapData var3, class40 var4, IndexedSprite[] var5) { + this.method500(var1, var2, var3); + this.method499(var1, var2, var3, var5); } - @ObfuscatedName("s") + @ObfuscatedName("e") @ObfuscatedSignature( - signature = "(IILf;Lak;Laz;I)V", - garbageValue = "-1375655341" + signature = "(IILf;Lae;Law;B)V", + garbageValue = "-118" ) @Export("drawTileGround") void drawTileGround(int var1, int var2, AbstractWorldMapData var3, class40 var4, WorldMapSprite var5) { @@ -485,221 +477,147 @@ public class WorldMapRegion { int var9; if (var7 != -1) { int var10 = this.backgroundColor; - FloorOverlayDefinition var12 = (FloorOverlayDefinition)FloorOverlayDefinition.FloorOverlayDefinition_cached.get((long)var7); - FloorOverlayDefinition var11; - if (var12 != null) { - var11 = var12; - } else { - byte[] var13 = FloorOverlayDefinition.FloorOverlayDefinition_archive.takeFile(4, var7); - var12 = new FloorOverlayDefinition(); - if (var13 != null) { - var12.decode(new Buffer(var13), var7); - } - - var12.postDecode(); - FloorOverlayDefinition.FloorOverlayDefinition_cached.put(var12, (long)var7); - var11 = var12; - } - + FloorOverlayDefinition var11 = WorldMapDecoration.FloorUnderlayDefinition_get(var7); if (var11 == null) { var9 = var10; } else if (var11.secondaryRgb >= 0) { var9 = var11.secondaryRgb | -16777216; } else { - int var14; - byte var15; - int var17; - int var18; + int var12; if (var11.texture >= 0) { - var14 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var11.texture); - var15 = 96; - if (var14 == -2) { - var17 = 12345678; - } else if (var14 == -1) { - if (var15 < 0) { - var15 = 0; - } else if (var15 > 127) { - var15 = 127; - } - - var18 = 127 - var15; - var17 = var18; - } else { - var18 = var15 * (var14 & 127) / 128; - if (var18 < 2) { - var18 = 2; - } else if (var18 > 126) { - var18 = 126; - } - - var17 = var18 + (var14 & 65408); - } - - var9 = Rasterizer3D.Rasterizer3D_colorPalette[var17] | -16777216; + var12 = ArchiveLoader.method1237(Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var11.texture), 96); + var9 = Rasterizer3D.Rasterizer3D_colorPalette[var12] | -16777216; } else if (var11.primaryRgb == 16711935) { var9 = var10; } else { - var17 = class65.method1245(var11.hue, var11.saturation, var11.lightness); - var15 = 96; - if (var17 == -2) { - var14 = 12345678; - } else if (var17 == -1) { - if (var15 < 0) { - var15 = 0; - } else if (var15 > 127) { - var15 = 127; - } - - var18 = 127 - var15; - var14 = var18; + var12 = ArchiveLoader.method1230(var11.hue, var11.saturation, var11.lightness); + byte var14 = 96; + int var13; + if (var12 == -2) { + var13 = 12345678; } else { - var18 = var15 * (var17 & 127) / 128; - if (var18 < 2) { - var18 = 2; - } else if (var18 > 126) { - var18 = 126; - } + int var16; + if (var12 == -1) { + if (var14 < 0) { + var14 = 0; + } else if (var14 > 127) { + var14 = 127; + } - var14 = var18 + (var17 & 65408); + var16 = 127 - var14; + var13 = var16; + } else { + var16 = var14 * (var12 & 127) / 128; + if (var16 < 2) { + var16 = 2; + } else if (var16 > 126) { + var16 = 126; + } + + var13 = var16 + (var12 & 65408); + } } - var9 = Rasterizer3D.Rasterizer3D_colorPalette[var14] | -16777216; + var9 = Rasterizer3D.Rasterizer3D_colorPalette[var13] | -16777216; } } var8 = var9; } - if (var7 > -1 && var3.field164[0][var1][var2] == 0) { + if (var7 > -1 && var3.field161[0][var1][var2] == 0) { Rasterizer2D.Rasterizer2D_fillRectangle(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile, this.pixelsPerTile, var8); } else { - var9 = this.method458(var1, var2, var3, var5); + var9 = this.method498(var1, var2, var3, var5); if (var7 == -1) { Rasterizer2D.Rasterizer2D_fillRectangle(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile, this.pixelsPerTile, var9); } else { - var4.method751(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), var9, var8, this.pixelsPerTile, this.pixelsPerTile, var3.field164[0][var1][var2], var3.field152[0][var1][var2]); + var4.method798(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), var9, var8, this.pixelsPerTile, this.pixelsPerTile, var3.field161[0][var1][var2], var3.field157[0][var1][var2]); } } } - @ObfuscatedName("f") + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "(IILf;Lak;B)V", - garbageValue = "1" + signature = "(IILf;Lae;I)V", + garbageValue = "-2089306589" ) - void method457(int var1, int var2, AbstractWorldMapData var3, class40 var4) { + void method497(int var1, int var2, AbstractWorldMapData var3, class40 var4) { for (int var5 = 1; var5 < var3.planes; ++var5) { int var6 = var3.floorOverlayIds[var5][var1][var2] - 1; if (var6 > -1) { int var8 = this.backgroundColor; - FloorOverlayDefinition var10 = (FloorOverlayDefinition)FloorOverlayDefinition.FloorOverlayDefinition_cached.get((long)var6); - FloorOverlayDefinition var9; - if (var10 != null) { - var9 = var10; - } else { - byte[] var11 = FloorOverlayDefinition.FloorOverlayDefinition_archive.takeFile(4, var6); - var10 = new FloorOverlayDefinition(); - if (var11 != null) { - var10.decode(new Buffer(var11), var6); - } - - var10.postDecode(); - FloorOverlayDefinition.FloorOverlayDefinition_cached.put(var10, (long)var6); - var9 = var10; - } - + FloorOverlayDefinition var9 = WorldMapDecoration.FloorUnderlayDefinition_get(var6); int var7; if (var9 == null) { var7 = var8; } else if (var9.secondaryRgb >= 0) { var7 = var9.secondaryRgb | -16777216; } else { - int var12; - byte var13; - int var16; - int var17; + int var10; if (var9.texture >= 0) { - var12 = Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var9.texture); - var13 = 96; - if (var12 == -2) { - var16 = 12345678; - } else if (var12 == -1) { - if (var13 < 0) { - var13 = 0; - } else if (var13 > 127) { - var13 = 127; - } - - var17 = 127 - var13; - var16 = var17; - } else { - var17 = var13 * (var12 & 127) / 128; - if (var17 < 2) { - var17 = 2; - } else if (var17 > 126) { - var17 = 126; - } - - var16 = var17 + (var12 & 65408); - } - - var7 = Rasterizer3D.Rasterizer3D_colorPalette[var16] | -16777216; + var10 = ArchiveLoader.method1237(Rasterizer3D.Rasterizer3D_textureLoader.getAverageTextureRGB(var9.texture), 96); + var7 = Rasterizer3D.Rasterizer3D_colorPalette[var10] | -16777216; } else if (var9.primaryRgb == 16711935) { var7 = var8; } else { - var16 = class65.method1245(var9.hue, var9.saturation, var9.lightness); - var13 = 96; - if (var16 == -2) { - var12 = 12345678; - } else if (var16 == -1) { - if (var13 < 0) { - var13 = 0; - } else if (var13 > 127) { - var13 = 127; - } - - var17 = 127 - var13; - var12 = var17; + var10 = ArchiveLoader.method1230(var9.hue, var9.saturation, var9.lightness); + byte var12 = 96; + int var11; + if (var10 == -2) { + var11 = 12345678; } else { - var17 = var13 * (var16 & 127) / 128; - if (var17 < 2) { - var17 = 2; - } else if (var17 > 126) { - var17 = 126; - } + int var15; + if (var10 == -1) { + if (var12 < 0) { + var12 = 0; + } else if (var12 > 127) { + var12 = 127; + } - var12 = var17 + (var16 & 65408); + var15 = 127 - var12; + var11 = var15; + } else { + var15 = var12 * (var10 & 127) / 128; + if (var15 < 2) { + var15 = 2; + } else if (var15 > 126) { + var15 = 126; + } + + var11 = var15 + (var10 & 65408); + } } - var7 = Rasterizer3D.Rasterizer3D_colorPalette[var12] | -16777216; + var7 = Rasterizer3D.Rasterizer3D_colorPalette[var11] | -16777216; } } - if (var3.field164[var5][var1][var2] == 0) { + if (var3.field161[var5][var1][var2] == 0) { Rasterizer2D.Rasterizer2D_fillRectangle(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile, this.pixelsPerTile, var7); } else { - var4.method751(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), 0, var7, this.pixelsPerTile, this.pixelsPerTile, var3.field164[var5][var1][var2], var3.field152[var5][var1][var2]); + var4.method798(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), 0, var7, this.pixelsPerTile, this.pixelsPerTile, var3.field161[var5][var1][var2], var3.field157[var5][var1][var2]); } } } } - @ObfuscatedName("j") + @ObfuscatedName("b") @ObfuscatedSignature( - signature = "(IILf;Laz;B)I", - garbageValue = "-62" + signature = "(IILf;Law;I)I", + garbageValue = "-1495406529" ) - int method458(int var1, int var2, AbstractWorldMapData var3, WorldMapSprite var4) { + int method498(int var1, int var2, AbstractWorldMapData var3, WorldMapSprite var4) { return var3.floorUnderlayIds[0][var1][var2] == 0 ? this.backgroundColor : var4.getTileColor(var1, var2); } - @ObfuscatedName("d") + @ObfuscatedName("w") @ObfuscatedSignature( - signature = "(IILf;[Llp;I)V", - garbageValue = "-1752440652" + signature = "(IILf;[Llw;S)V", + garbageValue = "21007" ) - void method521(int var1, int var2, AbstractWorldMapData var3, IndexedSprite[] var4) { + void method499(int var1, int var2, AbstractWorldMapData var3, IndexedSprite[] var4) { for (int var5 = 0; var5 < var3.planes; ++var5) { WorldMapDecoration[] var6 = var3.decorations[var5][var1][var2]; if (var6 != null && var6.length != 0) { @@ -707,20 +625,16 @@ public class WorldMapRegion { for (int var8 = 0; var8 < var7.length; ++var8) { WorldMapDecoration var9 = var7[var8]; - if (!Strings.method4091(var9.decoration)) { - int var11 = var9.decoration; - boolean var10 = var11 == WorldMapDecorationType.field2721.id; - if (!var10) { - continue; - } - } - - ObjectDefinition var12 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var9.objectDefinitionId); - if (var12.mapSceneId != -1) { - if (var12.mapSceneId != 46 && var12.mapSceneId != 52) { - var4[var12.mapSceneId].method6042(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile * 2, this.pixelsPerTile * 2); - } else { - var4[var12.mapSceneId].method6042(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile * 2 + 1, this.pixelsPerTile * 2 + 1); + int var11 = var9.decoration; + boolean var10 = var11 >= WorldMapDecorationType.field2721.id && var11 <= WorldMapDecorationType.field2722.id; + if (var10 || ArchiveLoader.method1239(var9.decoration)) { + ObjectDefinition var12 = WorldMapDecorationType.getObjectDefinition(var9.objectDefinitionId); + if (var12.mapSceneId != -1) { + if (var12.mapSceneId != 46 && var12.mapSceneId != 52) { + var4[var12.mapSceneId].method6212(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile * 2, this.pixelsPerTile * 2); + } else { + var4[var12.mapSceneId].method6212(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile * 2 + 1, this.pixelsPerTile * 2 + 1); + } } } } @@ -729,12 +643,12 @@ public class WorldMapRegion { } - @ObfuscatedName("l") + @ObfuscatedName("u") @ObfuscatedSignature( - signature = "(IILf;B)V", - garbageValue = "-71" + signature = "(IILf;I)V", + garbageValue = "1965871050" ) - void method460(int var1, int var2, AbstractWorldMapData var3) { + void method500(int var1, int var2, AbstractWorldMapData var3) { for (int var4 = 0; var4 < var3.planes; ++var4) { WorldMapDecoration[] var5 = var3.decorations[var4][var1][var2]; if (var5 != null && var5.length != 0) { @@ -743,20 +657,20 @@ public class WorldMapRegion { for (int var7 = 0; var7 < var6.length; ++var7) { WorldMapDecoration var8 = var6[var7]; int var10 = var8.decoration; - boolean var9 = var10 >= WorldMapDecorationType.field2710.id && var10 <= WorldMapDecorationType.field2702.id || var10 == WorldMapDecorationType.field2708.id; + boolean var9 = var10 >= WorldMapDecorationType.field2703.id && var10 <= WorldMapDecorationType.field2704.id || var10 == WorldMapDecorationType.field2705.id; if (var9) { - ObjectDefinition var11 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var8.objectDefinitionId); + ObjectDefinition var11 = WorldMapDecorationType.getObjectDefinition(var8.objectDefinitionId); int var12 = var11.int1 != 0 ? -3407872 : -3355444; - if (var8.decoration == WorldMapDecorationType.field2710.id) { - this.method474(var1, var2, var8.rotation, var12); + if (var8.decoration == WorldMapDecorationType.field2703.id) { + this.method514(var1, var2, var8.rotation, var12); } - if (var8.decoration == WorldMapDecorationType.field2701.id) { - this.method474(var1, var2, var8.rotation, -3355444); - this.method474(var1, var2, var8.rotation + 1, var12); + if (var8.decoration == WorldMapDecorationType.field2717.id) { + this.method514(var1, var2, var8.rotation, -3355444); + this.method514(var1, var2, var8.rotation + 1, var12); } - if (var8.decoration == WorldMapDecorationType.field2702.id) { + if (var8.decoration == WorldMapDecorationType.field2704.id) { if (var8.rotation == 0) { Rasterizer2D.Rasterizer2D_drawHorizontalLine(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), 1, var12); } @@ -766,7 +680,7 @@ public class WorldMapRegion { } if (var8.rotation == 2) { - Rasterizer2D.Rasterizer2D_drawHorizontalLine(this.pixelsPerTile + this.pixelsPerTile * var1 - 1, this.pixelsPerTile * (63 - var2) + this.pixelsPerTile - 1, 1, var12); + Rasterizer2D.Rasterizer2D_drawHorizontalLine(this.pixelsPerTile * var1 + this.pixelsPerTile - 1, this.pixelsPerTile * (63 - var2) + this.pixelsPerTile - 1, 1, var12); } if (var8.rotation == 3) { @@ -774,7 +688,7 @@ public class WorldMapRegion { } } - if (var8.decoration == WorldMapDecorationType.field2708.id) { + if (var8.decoration == WorldMapDecorationType.field2705.id) { int var13 = var8.rotation % 2; int var14; if (var13 == 0) { @@ -794,10 +708,10 @@ public class WorldMapRegion { } - @ObfuscatedName("k") + @ObfuscatedName("ad") @ObfuscatedSignature( signature = "(IILjava/util/HashSet;II)V", - garbageValue = "-2102994892" + garbageValue = "1378002295" ) @Export("drawNonLinkMapIcons") void drawNonLinkMapIcons(int var1, int var2, HashSet var3, int var4) { @@ -808,33 +722,33 @@ public class WorldMapRegion { while (var7.hasNext()) { Entry var8 = (Entry)var7.next(); Coord var9 = (Coord)var8.getKey(); - int var10 = (int)((float)var1 + var5 * (float)var9.x - var6); - int var11 = (int)((float)(var2 + var4) - var5 * (float)var9.y - var6); + int var10 = (int)((float)var1 + (float)var9.x * var5 - var6); + int var11 = (int)((float)(var2 + var4) - (float)var9.y * var5 - var6); AbstractWorldMapIcon var12 = (AbstractWorldMapIcon)var8.getValue(); if (var12 != null && var12.hasValidElement()) { var12.screenX = var10; var12.screenY = var11; - WorldMapElement var13 = Decimator.WorldMapElement_get(var12.getElement()); + WorldMapElement var13 = class65.WorldMapElement_get(var12.getElement()); if (!var3.contains(var13.getObjectId())) { - this.method464(var12, var10, var11, var5); + this.method531(var12, var10, var11, var5); } } } } - @ObfuscatedName("ac") + @ObfuscatedName("ag") @ObfuscatedSignature( signature = "(Ljava/util/HashSet;III)V", - garbageValue = "1749313949" + garbageValue = "688144874" ) - void method462(HashSet var1, int var2, int var3) { + void method502(HashSet var1, int var2, int var3) { Iterator var4 = this.icon0List.iterator(); while (var4.hasNext()) { AbstractWorldMapIcon var5 = (AbstractWorldMapIcon)var4.next(); if (var5.hasValidElement()) { - WorldMapElement var6 = Decimator.WorldMapElement_get(var5.getElement()); + WorldMapElement var6 = class65.WorldMapElement_get(var5.getElement()); if (var6 != null && var1.contains(var6.getObjectId())) { this.drawBackgroundCircle(var6, var5.screenX, var5.screenY, var2, var3); } @@ -843,10 +757,10 @@ public class WorldMapRegion { } - @ObfuscatedName("aa") + @ObfuscatedName("ak") @ObfuscatedSignature( - signature = "(Lij;IIIII)V", - garbageValue = "-828139741" + signature = "(Lie;IIIII)V", + garbageValue = "-1713466013" ) @Export("drawBackgroundCircle") void drawBackgroundCircle(WorldMapElement var1, int var2, int var3, int var4, int var5) { @@ -861,27 +775,27 @@ public class WorldMapRegion { } } - @ObfuscatedName("ap") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(Las;IIFI)V", - garbageValue = "-1297733559" + signature = "(Lam;IIFI)V", + garbageValue = "1288981667" ) - void method464(AbstractWorldMapIcon var1, int var2, int var3, float var4) { - WorldMapElement var5 = Decimator.WorldMapElement_get(var1.getElement()); - this.method546(var5, var2, var3); - this.method553(var1, var5, var2, var3, var4); + void method531(AbstractWorldMapIcon var1, int var2, int var3, float var4) { + WorldMapElement var5 = class65.WorldMapElement_get(var1.getElement()); + this.method505(var5, var2, var3); + this.method518(var1, var5, var2, var3, var4); } - @ObfuscatedName("ar") + @ObfuscatedName("am") @ObfuscatedSignature( - signature = "(Lij;III)V", - garbageValue = "972289630" + signature = "(Lie;III)V", + garbageValue = "106414698" ) - void method546(WorldMapElement var1, int var2, int var3) { + void method505(WorldMapElement var1, int var2, int var3) { Sprite var4 = var1.getSpriteBool(false); if (var4 != null) { - int var5 = this.method468(var4, var1.horizontalAlignment); - int var6 = this.method480(var4, var1.verticalAlignment); + int var5 = this.method508(var4, var1.horizontalAlignment); + int var6 = this.method509(var4, var1.verticalAlignment); var4.drawTransBgAt(var5 + var2, var3 + var6); } @@ -889,15 +803,15 @@ public class WorldMapRegion { @ObfuscatedName("ab") @ObfuscatedSignature( - signature = "(Las;Lij;IIFB)V", - garbageValue = "-47" + signature = "(Lam;Lie;IIFI)V", + garbageValue = "1388216927" ) - void method553(AbstractWorldMapIcon var1, WorldMapElement var2, int var3, int var4, float var5) { + void method518(AbstractWorldMapIcon var1, WorldMapElement var2, int var3, int var4, float var5) { WorldMapLabel var6 = var1.getLabel(); if (var6 != null) { - if (var6.size.method198(var5)) { + if (var6.size.method234(var5)) { Font var7 = (Font)this.fonts.get(var6.size); - var7.drawLines(var6.text, var3 - var6.width / 2, var4, var6.width, var6.height, -16777216 | var2.field3195, 0, 1, 0, var7.ascent / 2); + var7.drawLines(var6.text, var3 - var6.width / 2, var4, var6.width, var6.height, -16777216 | var2.field3202, 0, 1, 0, var7.ascent / 2); } } } @@ -905,7 +819,7 @@ public class WorldMapRegion { @ObfuscatedName("ax") @ObfuscatedSignature( signature = "(IILjava/util/HashSet;II)V", - garbageValue = "786229933" + garbageValue = "-928170224" ) @Export("drawMapLinks") void drawMapLinks(int var1, int var2, HashSet var3, int var4) { @@ -917,109 +831,90 @@ public class WorldMapRegion { if (var7.hasValidElement()) { int var8 = var7.coord2.x % 64; int var9 = var7.coord2.y % 64; - var7.screenX = (int)(var5 * (float)var8 + (float)var1); - var7.screenY = (int)((float)var2 + (float)(63 - var9) * var5); + var7.screenX = (int)((float)var1 + (float)var8 * var5); + var7.screenY = (int)((float)(63 - var9) * var5 + (float)var2); if (!var3.contains(var7.getElement())) { - this.method464(var7, var7.screenX, var7.screenY, var5); + this.method531(var7, var7.screenX, var7.screenY, var5); } } } } - @ObfuscatedName("as") + @ObfuscatedName("al") @ObfuscatedSignature( - signature = "(Llf;Lin;I)I", - garbageValue = "864808689" + signature = "(Llx;Lin;I)I", + garbageValue = "1783118993" ) - int method468(Sprite var1, HorizontalAlignment var2) { + int method508(Sprite var1, HorizontalAlignment var2) { switch(var2.value) { - case 1: + case 0: return 0; - case 2: + case 1: return -var1.subWidth / 2; default: return -var1.subWidth; } } - @ObfuscatedName("ao") + @ObfuscatedName("ap") @ObfuscatedSignature( - signature = "(Llf;Lim;I)I", - garbageValue = "-1390115279" + signature = "(Llx;Lik;S)I", + garbageValue = "-8990" ) - int method480(Sprite var1, VerticalAlignment var2) { + int method509(Sprite var1, VerticalAlignment var2) { switch(var2.value) { case 0: return 0; - case 2: + case 1: return -var1.subHeight / 2; default: return -var1.subHeight; } } - @ObfuscatedName("al") + @ObfuscatedName("aj") @ObfuscatedSignature( - signature = "(IB)Law;", - garbageValue = "101" + signature = "(IB)Lar;", + garbageValue = "-77" ) - WorldMapLabel method470(int var1) { - WorldMapElement var2 = Decimator.WorldMapElement_get(var1); + WorldMapLabel method510(int var1) { + WorldMapElement var2 = class65.WorldMapElement_get(var1); return this.createMapLabel(var2); } - @ObfuscatedName("ad") + @ObfuscatedName("ae") @ObfuscatedSignature( - signature = "(Lij;I)Law;", - garbageValue = "1073905876" + signature = "(Lie;I)Lar;", + garbageValue = "520914529" ) @Export("createMapLabel") WorldMapLabel createMapLabel(WorldMapElement var1) { if (var1.name != null && this.fonts != null && this.fonts.get(WorldMapLabelSize.WorldMapLabelSize_small) != null) { - int var3 = var1.textSize; - WorldMapLabelSize[] var4 = WorldMapLabelSize.method196(); - int var5 = 0; - - WorldMapLabelSize var2; - while (true) { - if (var5 >= var4.length) { - var2 = null; - break; - } - - WorldMapLabelSize var6 = var4[var5]; - if (var3 == var6.field108) { - var2 = var6; - break; - } - - ++var5; - } - + WorldMapLabelSize var2 = WorldMapLabelSize.method228(var1.textSize); if (var2 == null) { return null; } else { - Font var14 = (Font)this.fonts.get(var2); - if (var14 == null) { + Font var3 = (Font)this.fonts.get(var2); + if (var3 == null) { return null; } else { - int var15 = var14.lineCount(var1.name, 1000000); - String[] var7 = new String[var15]; - var14.breakLines(var1.name, (int[])null, var7); - int var8 = var7.length * var14.ascent / 2; - int var9 = 0; - String[] var10 = var7; + int var4 = var3.lineCount(var1.name, 1000000); + String[] var5 = new String[var4]; + var3.breakLines(var1.name, (int[])null, var5); + int var6 = var5.length * var3.ascent / 2; + int var7 = 0; + String[] var8 = var5; - for (int var11 = 0; var11 < var10.length; ++var11) { - String var12 = var10[var11]; - int var13 = var14.stringWidth(var12); - if (var13 > var9) { - var9 = var13; + for (int var9 = 0; var9 < var8.length; ++var9) { + String var10 = var8[var9]; + int var11 = var3.stringWidth(var10); + if (var11 > var7) { + var7 = var11; } } - return new WorldMapLabel(var1.name, var9, var8, var2); + return new WorldMapLabel(var1.name, var7, var6, var2); } } } else { @@ -1027,12 +922,12 @@ public class WorldMapRegion { } } - @ObfuscatedName("an") + @ObfuscatedName("au") @ObfuscatedSignature( signature = "(IIIIII)Ljava/util/List;", - garbageValue = "1652888752" + garbageValue = "151787240" ) - List method472(int var1, int var2, int var3, int var4, int var5) { + List method512(int var1, int var2, int var3, int var4, int var5) { LinkedList var6 = new LinkedList(); if (var4 >= var1 && var5 >= var2) { if (var4 < var3 + var1 && var5 < var3 + var2) { @@ -1064,10 +959,10 @@ public class WorldMapRegion { } } - @ObfuscatedName("ai") + @ObfuscatedName("ah") @ObfuscatedSignature( signature = "(I)Ljava/util/List;", - garbageValue = "-1073519222" + garbageValue = "-769286964" ) @Export("icons") List icons() { @@ -1077,12 +972,12 @@ public class WorldMapRegion { return var1; } - @ObfuscatedName("ak") + @ObfuscatedName("an") @ObfuscatedSignature( signature = "(IIIII)V", - garbageValue = "-1671492545" + garbageValue = "1532319764" ) - void method474(int var1, int var2, int var3, int var4) { + void method514(int var1, int var2, int var3, int var4) { var3 %= 4; if (var3 == 0) { Rasterizer2D.Rasterizer2D_drawVerticalLine(this.pixelsPerTile * var1, this.pixelsPerTile * (63 - var2), this.pixelsPerTile, var4); @@ -1102,218 +997,71 @@ public class WorldMapRegion { } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lhp;II)Lgk;", - garbageValue = "-470288420" - ) - static MusicPatch method519(AbstractArchive var0, int var1) { - byte[] var2 = var0.takeFileFlat(var1); - return var2 == null ? null : new MusicPatch(var2); - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;II)Ljava/io/File;", - garbageValue = "2074983607" - ) - @Export("getCacheDir") - public static File getCacheDir(String var0, String var1, int var2) { - String var3 = var2 == 0 ? "" : "" + var2; - JagexCache.JagexCache_locationFile = new File(JagexCache.userHomeDirectory, "jagex_cl_" + var0 + "_" + var1 + var3 + ".dat"); - String var4 = null; - String var5 = null; - boolean var6 = false; - Buffer var8; - int var11; - File var27; - if (JagexCache.JagexCache_locationFile.exists()) { - try { - AccessFile var7 = new AccessFile(JagexCache.JagexCache_locationFile, "rw", 10000L); - - int var9; - for (var8 = new Buffer((int)var7.length()); var8.offset < var8.array.length; var8.offset += var9) { - var9 = var7.read(var8.array, var8.offset, var8.array.length - var8.offset); - if (var9 == -1) { - throw new IOException(); - } - } - - var8.offset = 0; - var9 = var8.readUnsignedByte(); - if (var9 < 1 || var9 > 3) { - throw new IOException("" + var9); - } - - int var10 = 0; - if (var9 > 1) { - var10 = var8.readUnsignedByte(); - } - - if (var9 <= 2) { - var4 = var8.readStringCp1252NullCircumfixed(); - if (var10 == 1) { - var5 = var8.readStringCp1252NullCircumfixed(); - } - } else { - var4 = var8.readCESU8(); - if (var10 == 1) { - var5 = var8.readCESU8(); - } - } - - var7.close(); - } catch (IOException var25) { - var25.printStackTrace(); - } - - if (var4 != null) { - var27 = new File(var4); - if (!var27.exists()) { - var4 = null; - } - } - - if (var4 != null) { - var27 = new File(var4, "test.dat"); - - boolean var28; - try { - RandomAccessFile var15 = new RandomAccessFile(var27, "rw"); - var11 = var15.read(); - var15.seek(0L); - var15.write(var11); - var15.seek(0L); - var15.close(); - var27.delete(); - var28 = true; - } catch (Exception var23) { - var28 = false; - } - - if (!var28) { - var4 = null; - } - } - } - - if (var4 == null && var2 == 0) { - label159: - for (int var16 = 0; var16 < class266.field3537.length; ++var16) { - for (int var17 = 0; var17 < UserComparator4.field1948.length; ++var17) { - File var18 = new File(UserComparator4.field1948[var17] + class266.field3537[var16] + File.separatorChar + var0 + File.separatorChar); - if (var18.exists()) { - File var19 = new File(var18, "test.dat"); - - boolean var29; - try { - RandomAccessFile var12 = new RandomAccessFile(var19, "rw"); - int var13 = var12.read(); - var12.seek(0L); - var12.write(var13); - var12.seek(0L); - var12.close(); - var19.delete(); - var29 = true; - } catch (Exception var22) { - var29 = false; - } - - if (var29) { - var4 = var18.toString(); - var6 = true; - break label159; - } - } - } - } - } - - if (var4 == null) { - var4 = JagexCache.userHomeDirectory + File.separatorChar + "jagexcache" + var3 + File.separatorChar + var0 + File.separatorChar + var1 + File.separatorChar; - var6 = true; - } - - File var26; - if (var5 != null) { - var26 = new File(var5); - var27 = new File(var4); - - try { - File[] var33 = var26.listFiles(); - File[] var31 = var33; - - for (var11 = 0; var11 < var31.length; ++var11) { - File var30 = var31[var11]; - File var20 = new File(var27, var30.getName()); - boolean var14 = var30.renameTo(var20); - if (!var14) { - throw new IOException(); - } - } - } catch (Exception var24) { - var24.printStackTrace(); - } - - var6 = true; - } - - if (var6) { - var26 = new File(var4); - var8 = null; - - try { - AccessFile var34 = new AccessFile(JagexCache.JagexCache_locationFile, "rw", 10000L); - Buffer var32 = new Buffer(500); - var32.writeByte(3); - var32.writeByte(var8 != null ? 1 : 0); - var32.writeCESU8(var26.getPath()); - if (var8 != null) { - var32.writeCESU8(""); - } - - var34.write(var32.array, 0, var32.offset); - var34.close(); - } catch (IOException var21) { - var21.printStackTrace(); - } - } - - return new File(var4); - } - @ObfuscatedName("d") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1776528190" + signature = "(B)V", + garbageValue = "73" ) - static int method506(int var0, Script var1, boolean var2) { - Widget var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - if (var0 == ScriptOpcodes.IF_GETTARGETMASK) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class2.method30(class2.getWidgetClickMask(var3)); - return 1; - } else if (var0 != ScriptOpcodes.IF_GETOP) { - if (var0 == ScriptOpcodes.IF_GETOPBASE) { - if (var3.dataText == null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.dataText; - } + static final void method599() { + Object var10000 = null; + String var0 = "You can't add yourself to your own friend list"; + class30.addGameMessage(30, "", var0); + } - return 1; - } else { - return 2; - } + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-2138859104" + ) + static int method574(int var0, Script var1, boolean var2) { + Widget var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + if (var0 == ScriptOpcodes.CC_GETSCROLLX) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollX; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETSCROLLY) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollY; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETTEXT) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.text; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETSCROLLWIDTH) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollWidth; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETSCROLLHEIGHT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollHeight; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETMODELZOOM) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelZoom; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETMODELANGLE_X) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleX; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETMODELANGLE_Z) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleZ; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETMODELANGLE_Y) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleY; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETTRANSTOP) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyTop; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETTRANSBOT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyBot; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETCOLOUR) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETFILLCOLOUR) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color2; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETFILLMODE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.fillMode.rsOrdinal(); + return 1; + } else if (var0 == ScriptOpcodes.CC_GETMODELTRANSPARENT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelTransparency ? 1 : 0; + return 1; } else { - int var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - --var4; - if (var3.actions != null && var4 < var3.actions.length && var3.actions[var4] != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.actions[var4]; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; + return 2; } } } diff --git a/runescape-client/src/main/java/WorldMapSection.java b/runescape-client/src/main/java/WorldMapSection.java index 23c769ce67..d51882aa75 100644 --- a/runescape-client/src/main/java/WorldMapSection.java +++ b/runescape-client/src/main/java/WorldMapSection.java @@ -3,53 +3,53 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ad") +@ObfuscatedName("al") @Implements("WorldMapSection") public interface WorldMapSection { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "2098672163" + signature = "(Laa;B)V", + garbageValue = "-111" ) @Export("expandBounds") void expandBounds(WorldMapArea var1); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIII)Z", - garbageValue = "-327883108" + garbageValue = "-1417818612" ) @Export("containsCoord") boolean containsCoord(int var1, int var2, int var3); - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-1535371561" + garbageValue = "-2132898041" ) @Export("containsPosition") boolean containsPosition(int var1, int var2); - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIII)[I", - garbageValue = "-1322751923" + garbageValue = "1209167521" ) @Export("getBorderTileLengths") int[] getBorderTileLengths(int var1, int var2, int var3); - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(III)Lhb;", - garbageValue = "1439979703" + signature = "(IIS)Lhf;", + garbageValue = "7283" ) @Export("coord") Coord coord(int var1, int var2); - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-99" + signature = "(Lkc;I)V", + garbageValue = "-568369534" ) @Export("read") void read(Buffer var1); diff --git a/runescape-client/src/main/java/WorldMapSection0.java b/runescape-client/src/main/java/WorldMapSection0.java index b8a51cd421..8553a35e2e 100644 --- a/runescape-client/src/main/java/WorldMapSection0.java +++ b/runescape-client/src/main/java/WorldMapSection0.java @@ -1,93 +1,96 @@ +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; +import java.util.Iterator; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("h") +@ObfuscatedName("b") @Implements("WorldMapSection0") public class WorldMapSection0 implements WorldMapSection { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1037587117 + intValue = -372540487 ) @Export("oldZ") int oldZ; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -1930448807 + intValue = 889180281 ) @Export("newZ") int newZ; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 686443425 + intValue = -400617797 ) @Export("oldX") int oldX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -542760431 + intValue = 399728783 ) @Export("oldY") int oldY; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 543857047 + intValue = -1763177127 ) @Export("newX") int newX; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = -386033045 + intValue = 923116577 ) @Export("newY") int newY; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -1004209975 + intValue = 335677209 ) @Export("oldChunkXLow") int oldChunkXLow; - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = 645797773 + intValue = -2053674359 ) @Export("oldChunkYLow") int oldChunkYLow; - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedGetter( - intValue = -478007643 + intValue = 1863625007 ) @Export("oldChunkXHigh") int oldChunkXHigh; - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedGetter( - intValue = 940484663 + intValue = -887060215 ) @Export("oldChunkYHigh") int oldChunkYHigh; - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedGetter( - intValue = 1473412629 + intValue = 1381589897 ) @Export("newChunkXLow") int newChunkXLow; - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 1495103355 + intValue = -1499685421 ) @Export("newChunkYLow") int newChunkYLow; - @ObfuscatedName("o") + @ObfuscatedName("h") @ObfuscatedGetter( - intValue = -1947965675 + intValue = -1091787841 ) @Export("newChunkXHigh") int newChunkXHigh; - @ObfuscatedName("a") + @ObfuscatedName("k") @ObfuscatedGetter( - intValue = 627288657 + intValue = 1129428397 ) @Export("newChunkYHigh") int newChunkYHigh; @@ -95,10 +98,10 @@ public class WorldMapSection0 implements WorldMapSection { WorldMapSection0() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "2098672163" + signature = "(Laa;B)V", + garbageValue = "-111" ) @Export("expandBounds") public void expandBounds(WorldMapArea var1) { @@ -120,10 +123,10 @@ public class WorldMapSection0 implements WorldMapSection { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIII)Z", - garbageValue = "-327883108" + garbageValue = "-1417818612" ) @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { @@ -134,20 +137,20 @@ public class WorldMapSection0 implements WorldMapSection { } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-1535371561" + garbageValue = "-2132898041" ) @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >= (this.newX << 6) + (this.newChunkXLow << 3) && var1 <= (this.newX << 6) + (this.newChunkXHigh << 3) + 7 && var2 >= (this.newY << 6) + (this.newChunkYLow << 3) && var2 <= (this.newY << 6) + (this.newChunkYHigh << 3) + 7; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIII)[I", - garbageValue = "-1322751923" + garbageValue = "1209167521" ) @Export("getBorderTileLengths") public int[] getBorderTileLengths(int var1, int var2, int var3) { @@ -159,10 +162,10 @@ public class WorldMapSection0 implements WorldMapSection { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(III)Lhb;", - garbageValue = "1439979703" + signature = "(IIS)Lhf;", + garbageValue = "7283" ) @Export("coord") public Coord coord(int var1, int var2) { @@ -175,10 +178,10 @@ public class WorldMapSection0 implements WorldMapSection { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-99" + signature = "(Lkc;I)V", + garbageValue = "-568369534" ) @Export("read") public void read(Buffer var1) { @@ -199,82 +202,87 @@ public class WorldMapSection0 implements WorldMapSection { this.postRead(); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1221797110" + signature = "(B)V", + garbageValue = "26" ) @Export("postRead") void postRead() { } - @ObfuscatedName("r") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)Z", - garbageValue = "1193049266" + signature = "(Lhq;I)V", + garbageValue = "667089827" ) - public static boolean method249(int var0) { - return (var0 >> 29 & 1) != 0; + public static void method263(AbstractArchive var0) { + VarpDefinition.VarpDefinition_archive = var0; + VarpDefinition.VarpDefinition_fileCount = VarpDefinition.VarpDefinition_archive.getGroupFileCount(16); } - @ObfuscatedName("fh") + @ObfuscatedName("ac") @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)V", - garbageValue = "1698246852" + signature = "(S)I", + garbageValue = "128" ) - @Export("doCheat") - static final void doCheat(String var0) { - if (var0.equalsIgnoreCase("toggleroof")) { - AbstractArchive.clientPreferences.roofsHidden = !AbstractArchive.clientPreferences.roofsHidden; - Language.savePreferences(); - if (AbstractArchive.clientPreferences.roofsHidden) { - class210.addGameMessage(99, "", "Roofs are now all hidden"); - } else { - class210.addGameMessage(99, "", "Roofs will only be removed selectively"); + @Export("getGcDuration") + protected static int getGcDuration() { + int var0 = 0; + if (WorldMapRectangle.garbageCollector == null || !WorldMapRectangle.garbageCollector.isValid()) { + try { + Iterator var1 = ManagementFactory.getGarbageCollectorMXBeans().iterator(); + + while (var1.hasNext()) { + GarbageCollectorMXBean var2 = (GarbageCollectorMXBean)var1.next(); + if (var2.isValid()) { + WorldMapRectangle.garbageCollector = var2; + GameShell.garbageCollectorLastCheckTimeMs = -1L; + GameShell.garbageCollectorLastCollectionTime = -1L; + } + } + } catch (Throwable var11) { } } - if (var0.equalsIgnoreCase("displayfps")) { - Client.displayFps = !Client.displayFps; + if (WorldMapRectangle.garbageCollector != null) { + long var9 = PlayerAppearance.currentTimeMillis(); + long var3 = WorldMapRectangle.garbageCollector.getCollectionTime(); + if (-1L != GameShell.garbageCollectorLastCollectionTime) { + long var5 = var3 - GameShell.garbageCollectorLastCollectionTime; + long var7 = var9 - GameShell.garbageCollectorLastCheckTimeMs; + if (0L != var7) { + var0 = (int)(100L * var5 / var7); + } + } + + GameShell.garbageCollectorLastCollectionTime = var3; + GameShell.garbageCollectorLastCheckTimeMs = var9; } - if (var0.equalsIgnoreCase("renderself")) { - Client.renderSelf = !Client.renderSelf; - } + return var0; + } - if (var0.equalsIgnoreCase("mouseovertext")) { - Client.showMouseOverText = !Client.showMouseOverText; - } + @ObfuscatedName("ff") + @ObfuscatedSignature( + signature = "(II)I", + garbageValue = "-1258868168" + ) + static int method285(int var0) { + return var0 * 3 + 600; + } - if (Client.staffModLevel >= 2) { - if (var0.equalsIgnoreCase("errortest")) { - throw new RuntimeException(); - } - - if (var0.equalsIgnoreCase("showcoord")) { - Tiles.worldMap.showCoord = !Tiles.worldMap.showCoord; - } - - if (var0.equalsIgnoreCase("fpson")) { - Client.displayFps = true; - } - - if (var0.equalsIgnoreCase("fpsoff")) { - Client.displayFps = false; - } - - if (var0.equalsIgnoreCase("gc")) { - System.gc(); - } - - if (var0.equalsIgnoreCase("clientdrop")) { - MouseRecorder.method1213(); + @ObfuscatedName("ik") + @ObfuscatedSignature( + signature = "(IIIII)V", + garbageValue = "1698930592" + ) + static final void method279(int var0, int var1, int var2, int var3) { + for (int var4 = 0; var4 < Client.rootWidgetCount; ++var4) { + if (Client.rootWidgetWidths[var4] + Client.rootWidgetXs[var4] > var0 && Client.rootWidgetXs[var4] < var0 + var2 && Client.rootWidgetHeights[var4] + Client.rootWidgetYs[var4] > var1 && Client.rootWidgetYs[var4] < var3 + var1) { + Client.field837[var4] = true; } } - PacketBufferNode var1 = InterfaceParent.getPacketBufferNode(ClientPacket.field2201, Client.packetWriter.isaacCipher); - var1.packetBuffer.writeByte(var0.length() + 1); - var1.packetBuffer.writeStringCp1252NullTerminated(var0); - Client.packetWriter.addNode(var1); } } diff --git a/runescape-client/src/main/java/WorldMapSection1.java b/runescape-client/src/main/java/WorldMapSection1.java index ec8c94201e..aaf985b4b2 100644 --- a/runescape-client/src/main/java/WorldMapSection1.java +++ b/runescape-client/src/main/java/WorldMapSection1.java @@ -1,51 +1,56 @@ +import java.awt.image.BufferedImage; +import java.awt.image.PixelGrabber; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import javax.imageio.ImageIO; import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ax") +@ObfuscatedName("av") @Implements("WorldMapSection1") public class WorldMapSection1 implements WorldMapSection { - @ObfuscatedName("bj") + @ObfuscatedName("br") @ObfuscatedSignature( - signature = "Lli;" + signature = "Lgw;" ) - @Export("loginType") - static LoginType loginType; - @ObfuscatedName("z") + @Export("clientLanguage") + static Language clientLanguage; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -202088829 + intValue = 1154068221 ) @Export("minPlane") int minPlane; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = 844746677 + intValue = -1054158347 ) @Export("planes") int planes; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 577078223 + intValue = -1028854111 ) @Export("regionStartX") int regionStartX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -98820949 + intValue = -1350471723 ) @Export("regionStartY") int regionStartY; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1420932505 + intValue = -1028705705 ) @Export("regionEndX") int regionEndX; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1812674669 + intValue = -615162757 ) @Export("regionEndY") int regionEndY; @@ -53,10 +58,10 @@ public class WorldMapSection1 implements WorldMapSection { WorldMapSection1() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "2098672163" + signature = "(Laa;B)V", + garbageValue = "-111" ) @Export("expandBounds") public void expandBounds(WorldMapArea var1) { @@ -78,34 +83,34 @@ public class WorldMapSection1 implements WorldMapSection { } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIII)Z", - garbageValue = "-327883108" + garbageValue = "-1417818612" ) @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { - if (var1 >= this.minPlane && var1 < this.planes + this.minPlane) { + if (var1 >= this.minPlane && var1 < this.minPlane + this.planes) { return var2 >> 6 == this.regionStartX && var3 >> 6 == this.regionStartY; } else { return false; } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-1535371561" + garbageValue = "-2132898041" ) @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >> 6 == this.regionEndX && var2 >> 6 == this.regionEndY; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIII)[I", - garbageValue = "-1322751923" + garbageValue = "1209167521" ) @Export("getBorderTileLengths") public int[] getBorderTileLengths(int var1, int var2, int var3) { @@ -117,10 +122,10 @@ public class WorldMapSection1 implements WorldMapSection { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(III)Lhb;", - garbageValue = "1439979703" + signature = "(IIS)Lhf;", + garbageValue = "7283" ) @Export("coord") public Coord coord(int var1, int var2) { @@ -133,10 +138,10 @@ public class WorldMapSection1 implements WorldMapSection { } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-99" + signature = "(Lkc;I)V", + garbageValue = "-568369534" ) @Export("read") public void read(Buffer var1) { @@ -149,218 +154,78 @@ public class WorldMapSection1 implements WorldMapSection { this.postRead(); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1580543944" + signature = "(B)V", + garbageValue = "0" ) @Export("postRead") void postRead() { } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lhp;Lhp;ZLkn;I)V", - garbageValue = "956714191" - ) - public static void method608(AbstractArchive var0, AbstractArchive var1, boolean var2, Font var3) { - ItemDefinition.ItemDefinition_archive = var0; - ItemDefinition.ItemDefinition_modelArchive = var1; - class162.ItemDefinition_inMembersWorld = var2; - JagexCache.ItemDefinition_fileCount = ItemDefinition.ItemDefinition_archive.getGroupFileCount(10); - FaceNormal.ItemDefinition_fontPlain11 = var3; + @ObfuscatedName("a") + static double method636(double var0, double var2, double var4) { + double var8 = (var0 - var2) / var4; + double var6 = Math.exp(var8 * -var8 / 2.0D) / Math.sqrt(6.283185307179586D); + return var6 / var4; } - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(III)Lcu;", - garbageValue = "-1499115361" + signature = "([BS)Llx;", + garbageValue = "-10858" ) - static Script method591(int var0, int var1) { - Script var2 = (Script)Script.Script_cached.get((long)(var0 << 16)); - if (var2 != null) { - return var2; - } else { - String var3 = String.valueOf(var0); - int var4 = GrandExchangeOfferOwnWorldComparator.archive12.getGroupId(var3); - if (var4 == -1) { - return null; - } else { - byte[] var5 = GrandExchangeOfferOwnWorldComparator.archive12.takeFileFlat(var4); - if (var5 != null) { - if (var5.length <= 1) { - return null; - } + @Export("convertJpgToSprite") + public static final Sprite convertJpgToSprite(byte[] var0) { + BufferedImage var1 = null; - var2 = class3.newScript(var5); - if (var2 != null) { - Script.Script_cached.put(var2, (long)(var0 << 16)); - return var2; - } - } - - return null; - } + try { + var1 = ImageIO.read(new ByteArrayInputStream(var0)); + int var2 = var1.getWidth(); + int var3 = var1.getHeight(); + int[] var4 = new int[var2 * var3]; + PixelGrabber var5 = new PixelGrabber(var1, 0, 0, var2, var3, var4, 0, var2); + var5.grabPixels(); + return new Sprite(var4, var2, var3); + } catch (IOException var7) { + } catch (InterruptedException var8) { } + + return new Sprite(0, 0); } - @ObfuscatedName("i") + @ObfuscatedName("hf") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "1323185906" + signature = "(I)V", + garbageValue = "-1373255332" ) - public static final void method582(int var0, int var1) { - ViewportMouse.ViewportMouse_x = var0; - ViewportMouse.ViewportMouse_y = var1; - ViewportMouse.ViewportMouse_isInViewport = true; - ViewportMouse.ViewportMouse_entityCount = 0; - ViewportMouse.ViewportMouse_false0 = false; + static final void method622() { + Client.field745 = 0; + int var0 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); + int var1 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); + if (var0 >= 3053 && var0 <= 3156 && var1 >= 3056 && var1 <= 3136) { + Client.field745 = 1; + } + + if (var0 >= 3072 && var0 <= 3118 && var1 >= 9492 && var1 <= 9535) { + Client.field745 = 1; + } + + if (Client.field745 == 1 && var0 >= 3139 && var0 <= 3199 && var1 >= 3008 && var1 <= 3062) { + Client.field745 = 0; + } + } - @ObfuscatedName("gx") + @ObfuscatedName("lk") @ObfuscatedSignature( - signature = "(IIIIIIIIIB)V", - garbageValue = "-11" + signature = "(I)V", + garbageValue = "1886233259" ) - @Export("updatePendingSpawn") - static final void updatePendingSpawn(int var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { - PendingSpawn var9 = null; - - for (PendingSpawn var10 = (PendingSpawn)Client.pendingSpawns.last(); var10 != null; var10 = (PendingSpawn)Client.pendingSpawns.previous()) { - if (var0 == var10.plane && var10.x == var1 && var2 == var10.y && var3 == var10.type) { - var9 = var10; - break; - } + static void method650() { + if (Client.oculusOrbState == 1) { + Client.field645 = true; } - if (var9 == null) { - var9 = new PendingSpawn(); - var9.plane = var0; - var9.type = var3; - var9.x = var1; - var9.y = var2; - GrandExchangeEvent.method88(var9); - Client.pendingSpawns.addFirst(var9); - } - - var9.id = var4; - var9.field916 = var5; - var9.orientation = var6; - var9.delay = var7; - var9.hitpoints = var8; - } - - @ObfuscatedName("hd") - @ObfuscatedSignature( - signature = "(IIIILjava/lang/String;B)V", - garbageValue = "31" - ) - @Export("widgetDefaultMenuAction") - static void widgetDefaultMenuAction(int opIndex, int parent, int childIdx, int itemID, String target) { - Widget var5 = GrandExchangeOfferWorldComparator.getWidgetChild(parent, childIdx); - if (var5 != null) { - if (var5.onOp != null) { - ScriptEvent var6 = new ScriptEvent(); - var6.widget = var5; - var6.opIndex = opIndex; - var6.targetName = target; - var6.args = var5.onOp; - ParamDefinition.runScriptEvent(var6); - } - - boolean var11 = true; - if (var5.contentType > 0) { - var11 = class43.method840(var5); - } - - if (var11) { - int var8 = class2.getWidgetClickMask(var5); - int var9 = opIndex - 1; - boolean var7 = (var8 >> var9 + 1 & 1) != 0; - if (var7) { - PacketBufferNode var10; - if (opIndex == 1) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2244, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 2) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2249, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 3) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2257, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 4) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2194, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 5) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2204, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 6) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2200, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 7) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2251, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 8) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2203, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 9) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2213, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - if (opIndex == 10) { - var10 = InterfaceParent.getPacketBufferNode(ClientPacket.field2285, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(parent); - var10.packetBuffer.writeShort(childIdx); - var10.packetBuffer.writeShort(itemID); - Client.packetWriter.addNode(var10); - } - - } - } - } } } diff --git a/runescape-client/src/main/java/WorldMapSection2.java b/runescape-client/src/main/java/WorldMapSection2.java index 80b7945296..0cb90249ce 100644 --- a/runescape-client/src/main/java/WorldMapSection2.java +++ b/runescape-client/src/main/java/WorldMapSection2.java @@ -3,166 +3,160 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("l") +@ObfuscatedName("u") @Implements("WorldMapSection2") public class WorldMapSection2 implements WorldMapSection { - @ObfuscatedName("go") - @ObfuscatedGetter( - intValue = -963712193 + @ObfuscatedName("bs") + @ObfuscatedSignature( + signature = "Llw;" ) - static int field195; - @ObfuscatedName("hn") + @Export("worldSelectRightSprite") + static IndexedSprite worldSelectRightSprite; + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = -4402151 - ) - @Export("cameraYaw") - static int cameraYaw; - @ObfuscatedName("z") - @ObfuscatedGetter( - intValue = -879876937 + intValue = 1295049317 ) @Export("minPlane") int minPlane; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -208083253 + intValue = 927715995 ) @Export("planes") int planes; - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedGetter( - intValue = -940491027 + intValue = 2066187395 ) @Export("regionStartX") int regionStartX; - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = -1613337015 + intValue = 1145498097 ) @Export("regionStartY") int regionStartY; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1112500481 + intValue = 844773533 ) @Export("regionEndX") int regionEndX; - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1241448217 + intValue = -274372249 ) @Export("regionEndY") int regionEndY; - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedGetter( - intValue = 1756578177 + intValue = -478444161 ) - int field191; - @ObfuscatedName("m") + int field185; + @ObfuscatedName("o") @ObfuscatedGetter( - intValue = -1979201453 + intValue = -1833104023 ) - int field192; - @ObfuscatedName("y") - @ObfuscatedGetter( - intValue = -783213001 - ) - int field193; + int field186; @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 634589909 + intValue = -697507029 ) - int field196; + int field179; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = -64934355 + ) + int field181; WorldMapSection2() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "2098672163" + signature = "(Laa;B)V", + garbageValue = "-111" ) @Export("expandBounds") public void expandBounds(WorldMapArea var1) { - if (var1.regionLowX > this.field191) { - var1.regionLowX = this.field191; + if (var1.regionLowX > this.field185) { + var1.regionLowX = this.field185; } - if (var1.regionHighX < this.field193) { - var1.regionHighX = this.field193; + if (var1.regionHighX < this.field179) { + var1.regionHighX = this.field179; } - if (var1.regionLowY > this.field192) { - var1.regionLowY = this.field192; + if (var1.regionLowY > this.field186) { + var1.regionLowY = this.field186; } - if (var1.regionHighY < this.field196) { - var1.regionHighY = this.field196; + if (var1.regionHighY < this.field181) { + var1.regionHighY = this.field181; } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIII)Z", - garbageValue = "-327883108" + garbageValue = "-1417818612" ) @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { - if (var1 >= this.minPlane && var1 < this.planes + this.minPlane) { + if (var1 >= this.minPlane && var1 < this.minPlane + this.planes) { return var2 >> 6 >= this.regionStartX && var2 >> 6 <= this.regionEndX && var3 >> 6 >= this.regionStartY && var3 >> 6 <= this.regionEndY; } else { return false; } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-1535371561" + garbageValue = "-2132898041" ) @Export("containsPosition") public boolean containsPosition(int var1, int var2) { - return var1 >> 6 >= this.field191 && var1 >> 6 <= this.field193 && var2 >> 6 >= this.field192 && var2 >> 6 <= this.field196; + return var1 >> 6 >= this.field185 && var1 >> 6 <= this.field179 && var2 >> 6 >= this.field186 && var2 >> 6 <= this.field181; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIII)[I", - garbageValue = "-1322751923" + garbageValue = "1209167521" ) @Export("getBorderTileLengths") public int[] getBorderTileLengths(int var1, int var2, int var3) { if (!this.containsCoord(var1, var2, var3)) { return null; } else { - int[] var4 = new int[]{this.field191 * 64 - this.regionStartX * 64 + var2, var3 + (this.field192 * 64 - this.regionStartY * 64)}; + int[] var4 = new int[]{this.field185 * 64 - this.regionStartX * 64 + var2, var3 + (this.field186 * 64 - this.regionStartY * 64)}; return var4; } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(III)Lhb;", - garbageValue = "1439979703" + signature = "(IIS)Lhf;", + garbageValue = "7283" ) @Export("coord") public Coord coord(int var1, int var2) { if (!this.containsPosition(var1, var2)) { return null; } else { - int var3 = this.regionStartX * 64 - this.field191 * 64 + var1; - int var4 = this.regionStartY * 64 - this.field192 * 64 + var2; + int var3 = this.regionStartX * 64 - this.field185 * 64 + var1; + int var4 = this.regionStartY * 64 - this.field186 * 64 + var2; return new Coord(this.minPlane, var3, var4); } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-99" + signature = "(Lkc;I)V", + garbageValue = "-568369534" ) @Export("read") public void read(Buffer var1) { @@ -172,121 +166,50 @@ public class WorldMapSection2 implements WorldMapSection { this.regionStartY = var1.readUnsignedShort(); this.regionEndX = var1.readUnsignedShort(); this.regionEndY = var1.readUnsignedShort(); - this.field191 = var1.readUnsignedShort(); - this.field192 = var1.readUnsignedShort(); - this.field193 = var1.readUnsignedShort(); - this.field196 = var1.readUnsignedShort(); + this.field185 = var1.readUnsignedShort(); + this.field186 = var1.readUnsignedShort(); + this.field179 = var1.readUnsignedShort(); + this.field181 = var1.readUnsignedShort(); this.postRead(); } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-3" + signature = "(I)V", + garbageValue = "1560468705" ) @Export("postRead") void postRead() { } - @ObfuscatedName("u") + @ObfuscatedName("ip") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-1894474277" + signature = "(B)V", + garbageValue = "16" ) - static int method342(int var0, Script var1, boolean var2) { - int var3; - int var4; - if (var0 == ScriptOpcodes.CC_CREATE) { - Interpreter.Interpreter_intStackSize -= 3; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - if (var4 == 0) { - throw new RuntimeException(); - } else { - Widget var6 = Canvas.getWidget(var3); - if (var6.children == null) { - var6.children = new Widget[var5 + 1]; - } + static final void method383() { + int var0 = MusicPatchNode.menuX; + int var1 = TextureProvider.menuY; + int var2 = KeyHandler.menuWidth; + int var3 = WorldMapData_1.menuHeight; + int var4 = 6116423; + Rasterizer2D.Rasterizer2D_fillRectangle(var0, var1, var2, var3, var4); + Rasterizer2D.Rasterizer2D_fillRectangle(var0 + 1, var1 + 1, var2 - 2, 16, 0); + Rasterizer2D.Rasterizer2D_drawRectangle(var0 + 1, var1 + 18, var2 - 2, var3 - 19, 0); + class43.fontBold12.draw("Choose Option", var0 + 3, var1 + 14, var4, -1); + int var5 = MouseHandler.MouseHandler_x; + int var6 = MouseHandler.MouseHandler_y; - if (var6.children.length <= var5) { - Widget[] var7 = new Widget[var5 + 1]; - - for (int var8 = 0; var8 < var6.children.length; ++var8) { - var7[var8] = var6.children[var8]; - } - - var6.children = var7; - } - - if (var5 > 0 && var6.children[var5 - 1] == null) { - throw new RuntimeException("" + (var5 - 1)); - } else { - Widget var12 = new Widget(); - var12.type = var4; - var12.parentId = var12.id = var6.id; - var12.childIndex = var5; - var12.isIf3 = true; - var6.children[var5] = var12; - if (var2) { - GrandExchangeOfferAgeComparator.field76 = var12; - } else { - KitDefinition.field3252 = var12; - } - - WorldMapSectionType.invalidateWidget(var6); - return 1; - } + for (int var7 = 0; var7 < Client.menuOptionsCount; ++var7) { + int var8 = (Client.menuOptionsCount - 1 - var7) * 15 + var1 + 31; + int var9 = 16777215; + if (var5 > var0 && var5 < var0 + var2 && var6 > var8 - 13 && var6 < var8 + 3) { + var9 = 16776960; } - } else { - Widget var9; - if (var0 == ScriptOpcodes.CC_DELETE) { - var9 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - Widget var10 = Canvas.getWidget(var9.id); - var10.children[var9.childIndex] = null; - WorldMapSectionType.invalidateWidget(var10); - return 1; - } else if (var0 == ScriptOpcodes.CC_DELETEALL) { - var9 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - var9.children = null; - WorldMapSectionType.invalidateWidget(var9); - return 1; - } else if (var0 != ScriptOpcodes.CC_FIND) { - if (var0 == ScriptOpcodes.IF_FIND) { - var9 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - if (var9 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - if (var2) { - GrandExchangeOfferAgeComparator.field76 = var9; - } else { - KitDefinition.field3252 = var9; - } - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - return 1; - } else { - return 2; - } - } else { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - Widget var11 = GrandExchangeOfferWorldComparator.getWidgetChild(var3, var4); - if (var11 != null && var4 != -1) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - if (var2) { - GrandExchangeOfferAgeComparator.field76 = var11; - } else { - KitDefinition.field3252 = var11; - } - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - } - - return 1; - } + class43.fontBold12.draw(class65.method1316(var7), var0 + 3, var8, var9, 0); } + + WorldMapSection0.method279(MusicPatchNode.menuX, TextureProvider.menuY, KeyHandler.menuWidth, WorldMapData_1.menuHeight); } } diff --git a/runescape-client/src/main/java/WorldMapSectionType.java b/runescape-client/src/main/java/WorldMapSectionType.java index ac8836967b..40a65e4063 100644 --- a/runescape-client/src/main/java/WorldMapSectionType.java +++ b/runescape-client/src/main/java/WorldMapSectionType.java @@ -4,46 +4,52 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("s") +@ObfuscatedName("z") @Implements("WorldMapSectionType") public enum WorldMapSectionType implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ls;" + signature = "Lz;" ) @Export("WORLDMAPSECTIONTYPE0") - WORLDMAPSECTIONTYPE0(0, (byte)0), - @ObfuscatedName("n") + WORLDMAPSECTIONTYPE0(3, (byte)0), + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Ls;" + signature = "Lz;" ) @Export("WORLDMAPSECTIONTYPE1") - WORLDMAPSECTIONTYPE1(3, (byte)1), - @ObfuscatedName("v") + WORLDMAPSECTIONTYPE1(1, (byte)1), + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Ls;" + signature = "Lz;" ) @Export("WORLDMAPSECTIONTYPE2") WORLDMAPSECTIONTYPE2(2, (byte)2), - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Ls;" + signature = "Lz;" ) @Export("WORLDMAPSECTIONTYPE3") - WORLDMAPSECTIONTYPE3(1, (byte)3); + WORLDMAPSECTIONTYPE3(0, (byte)3); - @ObfuscatedName("c") - @Export("musicTrackBoolean") - public static boolean musicTrackBoolean; - @ObfuscatedName("bk") - static String field150; - @ObfuscatedName("r") + @ObfuscatedName("sg") + @ObfuscatedSignature( + signature = "Lke;" + ) + @Export("masterDisk") + static ArchiveDisk masterDisk; + @ObfuscatedName("fq") @ObfuscatedGetter( - intValue = 19347147 + intValue = 16953731 + ) + static int field140; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = -1080856111 ) @Export("type") final int type; - @ObfuscatedName("p") + @ObfuscatedName("l") @Export("id") final byte id; @@ -52,55 +58,199 @@ public enum WorldMapSectionType implements Enumerated { this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("jf") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lho;I)V", - garbageValue = "529400812" + signature = "(II)Liq;", + garbageValue = "-1193696463" ) - @Export("invalidateWidget") - static void invalidateWidget(Widget var0) { - if (var0.cycle == Client.field638) { - Client.field841[var0.rootIndex] = true; - } - - } - - @ObfuscatedName("ks") - @ObfuscatedSignature( - signature = "(Lho;B)Z", - garbageValue = "7" - ) - @Export("isComponentHidden") - static boolean isComponentHidden(Widget var0) { - return var0.isHidden; - } - - @ObfuscatedName("kj") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)Ljava/lang/String;", - garbageValue = "-1617760184" - ) - static String method250(String var0) { - PlayerType[] var1 = class226.PlayerType_values(); - - for (int var2 = 0; var2 < var1.length; ++var2) { - PlayerType var3 = var1[var2]; - if (var3.modIcon != -1 && var0.startsWith(class247.method4455(var3.modIcon))) { - var0 = var0.substring(6 + Integer.toString(var3.modIcon).length()); - break; + @Export("getInvDefinition") + public static InvDefinition getInvDefinition(int var0) { + InvDefinition var1 = (InvDefinition)InvDefinition.InvDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; + } else { + byte[] var2 = class1.InvDefinition_archive.takeFile(5, var0); + var1 = new InvDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); } + + InvDefinition.InvDefinition_cached.put(var1, (long)var0); + return var1; + } + } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(CB)C", + garbageValue = "27" + ) + static char method296(char var0) { + if (var0 == 198) { + return 'E'; + } else if (var0 == 230) { + return 'e'; + } else if (var0 == 223) { + return 's'; + } else if (var0 == 338) { + return 'E'; + } else { + return (char)(var0 == 339 ? 'e' : '\u0000'); + } + } + + @ObfuscatedName("fv") + @ObfuscatedSignature( + signature = "(IZZZI)Lij;", + garbageValue = "-1053216303" + ) + @Export("newArchive") + static Archive newArchive(int var0, boolean var1, boolean var2, boolean var3) { + ArchiveDisk var4 = null; + if (JagexCache.JagexCache_dat2File != null) { + var4 = new ArchiveDisk(var0, JagexCache.JagexCache_dat2File, ArchiveLoader.JagexCache_idxFiles[var0], 1000000); + } + + return new Archive(var4, masterDisk, var0, var1, var2, var3); + } + + @ObfuscatedName("hd") + @ObfuscatedSignature( + signature = "(IIZI)V", + garbageValue = "1770012537" + ) + static final void method290(int var0, int var1, boolean var2) { + if (!var2 || var0 != field140 || ScriptEvent.field563 != var1) { + field140 = var0; + ScriptEvent.field563 = var1; + Tile.updateGameState(25); + GrandExchangeEvents.drawLoadingMessage("Loading - please wait.", true); + int var3 = UserComparator8.baseX * 64; + int var4 = HealthBar.baseY * 64; + UserComparator8.baseX = (var0 - 6) * 8; + HealthBar.baseY = (var1 - 6) * 8; + int var5 = UserComparator8.baseX * 64 - var3; + int var6 = HealthBar.baseY * 64 - var4; + var3 = UserComparator8.baseX * 64; + var4 = HealthBar.baseY * 64; + + int var7; + int var9; + int[] var10000; + for (var7 = 0; var7 < 32768; ++var7) { + NPC var8 = Client.npcs[var7]; + if (var8 != null) { + for (var9 = 0; var9 < 10; ++var9) { + var10000 = var8.pathX; + var10000[var9] -= var5; + var10000 = var8.pathY; + var10000[var9] -= var6; + } + + var8.x -= var5 * 128; + var8.y -= var6 * 128; + } + } + + for (var7 = 0; var7 < 2048; ++var7) { + Player var21 = Client.players[var7]; + if (var21 != null) { + for (var9 = 0; var9 < 10; ++var9) { + var10000 = var21.pathX; + var10000[var9] -= var5; + var10000 = var21.pathY; + var10000[var9] -= var6; + } + + var21.x -= var5 * 128; + var21.y -= var6 * 128; + } + } + + byte var20 = 0; + byte var18 = 104; + byte var22 = 1; + if (var5 < 0) { + var20 = 103; + var18 = -1; + var22 = -1; + } + + byte var10 = 0; + byte var11 = 104; + byte var12 = 1; + if (var6 < 0) { + var10 = 103; + var11 = -1; + var12 = -1; + } + + int var14; + for (int var13 = var20; var13 != var18; var13 += var22) { + for (var14 = var10; var11 != var14; var14 += var12) { + int var15 = var13 + var5; + int var16 = var6 + var14; + + for (int var17 = 0; var17 < 4; ++var17) { + if (var15 >= 0 && var16 >= 0 && var15 < 104 && var16 < 104) { + Client.groundItems[var17][var13][var14] = Client.groundItems[var17][var15][var16]; + } else { + Client.groundItems[var17][var13][var14] = null; + } + } + } + } + + for (PendingSpawn var19 = (PendingSpawn)Client.pendingSpawns.last(); var19 != null; var19 = (PendingSpawn)Client.pendingSpawns.previous()) { + var19.x -= var5; + var19.y -= var6; + if (var19.x < 0 || var19.y < 0 || var19.x >= 104 || var19.y >= 104) { + var19.remove(); + } + } + + if (Client.destinationX != 0) { + Client.destinationX -= var5; + Client.destinationY -= var6; + } + + Client.soundEffectCount = 0; + Client.isCameraLocked = false; + UrlRequester.cameraX -= var5 << 7; + GrandExchangeOfferAgeComparator.cameraZ -= var6 << 7; + IgnoreList.oculusOrbFocalPointX -= var5 << 7; + AbstractArchive.oculusOrbFocalPointY -= var6 << 7; + Client.field856 = -1; + Client.graphicsObjects.clear(); + Client.projectiles.clear(); + + for (var14 = 0; var14 < 4; ++var14) { + Client.collisionMaps[var14].clear(); + } + + } + } + + @ObfuscatedName("kt") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "1414236502" + ) + static final void method294() { + for (int var0 = 0; var0 < Players.Players_count; ++var0) { + Player var1 = Client.players[Players.Players_indices[var0]]; + var1.clearIsInClanChat(); } - return var0; } } diff --git a/runescape-client/src/main/java/WorldMapSprite.java b/runescape-client/src/main/java/WorldMapSprite.java index 8b9b430622..442099a392 100644 --- a/runescape-client/src/main/java/WorldMapSprite.java +++ b/runescape-client/src/main/java/WorldMapSprite.java @@ -3,10 +3,22 @@ import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("az") +@ObfuscatedName("aw") @Implements("WorldMapSprite") public final class WorldMapSprite { - @ObfuscatedName("n") + @ObfuscatedName("r") + @ObfuscatedSignature( + signature = "Lau;" + ) + @Export("worldMapEvent") + static WorldMapEvent worldMapEvent; + @ObfuscatedName("du") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive9") + static Archive archive9; + @ObfuscatedName("t") @Export("tileColors") final int[] tileColors; @@ -18,164 +30,405 @@ public final class WorldMapSprite { this.tileColors = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIS)I", - garbageValue = "-9220" + signature = "(III)I", + garbageValue = "1284529716" ) @Export("getTileColor") final int getTileColor(int var1, int var2) { - return this.tileColors[var2 * 64 + var1]; + return this.tileColors[var1 + var2 * 64]; } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(IB)I", - garbageValue = "-104" - ) - @Export("getVarbit") - public static int getVarbit(int var0) { - VarbitDefinition var2 = (VarbitDefinition)VarbitDefinition.VarbitDefinition_cached.get((long)var0); - VarbitDefinition var1; - if (var2 != null) { - var1 = var2; - } else { - byte[] var7 = VarbitDefinition.VarbitDefinition_archive.takeFile(14, var0); - var2 = new VarbitDefinition(); - if (var7 != null) { - var2.decode(new Buffer(var7)); + @ObfuscatedName("a") + public static final int method472(double var0, double var2, double var4) { + double var6 = var4; + double var8 = var4; + double var10 = var4; + if (0.0D != var2) { + double var12; + if (var4 < 0.5D) { + var12 = (1.0D + var2) * var4; + } else { + var12 = var2 + var4 - var2 * var4; } - VarbitDefinition.VarbitDefinition_cached.put(var2, (long)var0); - var1 = var2; + double var14 = 2.0D * var4 - var12; + double var16 = 0.3333333333333333D + var0; + if (var16 > 1.0D) { + --var16; + } + + double var20 = var0 - 0.3333333333333333D; + if (var20 < 0.0D) { + ++var20; + } + + if (6.0D * var16 < 1.0D) { + var6 = 6.0D * (var12 - var14) * var16 + var14; + } else if (2.0D * var16 < 1.0D) { + var6 = var12; + } else if (3.0D * var16 < 2.0D) { + var6 = 6.0D * (var12 - var14) * (0.6666666666666666D - var16) + var14; + } else { + var6 = var14; + } + + if (6.0D * var0 < 1.0D) { + var8 = 6.0D * (var12 - var14) * var0 + var14; + } else if (var0 * 2.0D < 1.0D) { + var8 = var12; + } else if (var0 * 3.0D < 2.0D) { + var8 = 6.0D * (0.6666666666666666D - var0) * (var12 - var14) + var14; + } else { + var8 = var14; + } + + if (var20 * 6.0D < 1.0D) { + var10 = var20 * 6.0D * (var12 - var14) + var14; + } else if (var20 * 2.0D < 1.0D) { + var10 = var12; + } else if (var20 * 3.0D < 2.0D) { + var10 = (0.6666666666666666D - var20) * (var12 - var14) * 6.0D + var14; + } else { + var10 = var14; + } } - int var3 = var1.baseVar; - int var4 = var1.startBit; - int var5 = var1.endBit; - int var6 = Varps.Varps_masks[var5 - var4]; - return Varps.Varps_main[var3] >> var4 & var6; + int var22 = (int)(var6 * 256.0D); + int var13 = (int)(256.0D * var8); + int var23 = (int)(256.0D * var10); + int var15 = var23 + (var13 << 8) + (var22 << 16); + return var15; } - @ObfuscatedName("z") + @ObfuscatedName("gv") @ObfuscatedSignature( - signature = "(Lhp;Lhp;ZII)V", - garbageValue = "257961128" + signature = "(B)V", + garbageValue = "5" ) - static void method435(AbstractArchive var0, AbstractArchive var1, boolean var2, int var3) { - if (Login.field1160) { - if (var3 == 4) { - Login.loginIndex = 4; - } + static void method473() { + int var0 = Players.Players_count; + int[] var1 = Players.Players_indices; - } else { - Login.loginIndex = var3; - Rasterizer2D.Rasterizer2D_clear(); - byte[] var4 = var0.takeFileByNames("title.jpg", ""); - WorldMapID.leftTitleSprite = class40.convertJpgToSprite(var4); - class51.rightTitleSprite = WorldMapID.leftTitleSprite.mirrorHorizontally(); - if ((Client.worldProperties & 536870912) != 0) { - FontName.logoSprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "logo_deadman_mode", ""); - } else { - FontName.logoSprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "logo", ""); + for (int var2 = 0; var2 < var0; ++var2) { + if (var1[var2] != Client.combatTargetPlayerIndex && var1[var2] != Client.localPlayerIndex) { + Player.addPlayerToScene(Client.players[var1[var2]], true); } - - class32.titleboxSprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "titlebox", ""); - AbstractRasterProvider.titlebuttonSprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "titlebutton", ""); - Login.runesSprite = WorldMapIcon_0.method222(var1, "runes", ""); - UserComparator7.title_muteSprite = WorldMapIcon_0.method222(var1, "title_mute", ""); - class195.options_buttons_0Sprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,0", ""); - ClientPreferences.field1046 = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,4", ""); - class42.options_buttons_2Sprite = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,2", ""); - Login.field1163 = WorldMapRectangle.SpriteBuffer_getIndexedSpriteByName(var1, "options_radio_buttons,6", ""); - class83.field1145 = class195.options_buttons_0Sprite.subWidth; - WorldMapCacheName.field286 = class195.options_buttons_0Sprite.subHeight; - BufferedSink.loginScreenRunesAnimation = new LoginScreenAnimation(Login.runesSprite); - if (var2) { - Login.Login_username = ""; - Login.Login_password = ""; - } - - class185.field2305 = 0; - DesktopPlatformInfoProvider.otp = ""; - Login.field1183 = true; - Login.worldSelectOpen = false; - if (!AbstractArchive.clientPreferences.titleMusicDisabled) { - WorldMapData_0.method194(2, class225.archive6, "scape main", "", 255, false); - } else { - class197.field2386 = 1; - class197.musicTrackArchive = null; - class188.musicTrackGroupId = -1; - class49.musicTrackFileId = -1; - TileItem.field1223 = 0; - WorldMapSectionType.musicTrackBoolean = false; - MusicPatchNode2.field2382 = 2; - } - - DirectByteArrayCopier.method3924(false); - Login.field1160 = true; - Login.xPadding = (FloorDecoration.canvasWidth - 765) / 2; - Login.loginBoxX = Login.xPadding + 202; - GrandExchangeOfferUnitPriceComparator.loginBoxCenter = Login.loginBoxX + 180; - WorldMapID.leftTitleSprite.drawAt(Login.xPadding, 0); - class51.rightTitleSprite.drawAt(Login.xPadding + 382, 0); - FontName.logoSprite.drawAt(Login.xPadding + 382 - FontName.logoSprite.subWidth / 2, 18); } + } - @ObfuscatedName("fx") + @ObfuscatedName("ht") @ObfuscatedSignature( - signature = "(Ljava/lang/String;ZB)V", - garbageValue = "-87" + signature = "(Lge;I)V", + garbageValue = "-226939781" ) - @Export("drawLoadingMessage") - static final void drawLoadingMessage(String var0, boolean var1) { - if (Client.showLoadingMessages) { - byte var2 = 4; - int var3 = var2 + 6; - int var4 = var2 + 6; - int var5 = GraphicsDefaults.fontPlain12.lineWidth(var0, 250); - int var6 = GraphicsDefaults.fontPlain12.lineCount(var0, 250) * 13; - Rasterizer2D.Rasterizer2D_fillRectangle(var3 - var2, var4 - var2, var2 + var5 + var2, var2 + var6 + var2, 0); - Rasterizer2D.Rasterizer2D_drawRectangle(var3 - var2, var4 - var2, var2 + var5 + var2, var2 + var2 + var6, 16777215); - GraphicsDefaults.fontPlain12.drawLines(var0, var3, var4, var5, var6, 16777215, -1, 1, 1, 0); - int var7 = var3 - var2; - int var8 = var4 - var2; - int var9 = var5 + var2 + var2; - int var10 = var2 + var6 + var2; - - int var11; - for (var11 = 0; var11 < Client.rootWidgetCount; ++var11) { - if (Client.rootWidgetXs[var11] + Client.rootWidgetWidths[var11] > var7 && Client.rootWidgetXs[var11] < var9 + var7 && Client.rootWidgetHeights[var11] + Client.rootWidgetYs[var11] > var8 && Client.rootWidgetYs[var11] < var8 + var10) { - Client.field841[var11] = true; + static final void method474(class185 var0) { + PacketBuffer var1 = Client.packetWriter.packetBuffer; + int var2; + int var3; + int var4; + int var5; + int var6; + int var7; + int var8; + int var11; + int var37; + if (class185.field2300 == var0) { + var2 = var1.readUnsignedShort(); + var3 = var1.readUnsignedByte(); + var4 = (var3 >> 4 & 7) + SpriteMask.field2501; + var5 = (var3 & 7) + GrandExchangeOffer.field61; + var6 = var1.method5697(); + var7 = var6 >> 2; + var8 = var6 & 3; + var37 = Client.field692[var7]; + if (var4 >= 0 && var5 >= 0 && var4 < 103 && var5 < 103) { + if (var37 == 0) { + BoundaryObject var10 = WorldMapArea.scene.method3225(Player.Scene_plane, var4, var5); + if (var10 != null) { + var11 = UserComparator8.Entity_unpackID(var10.tag); + if (var7 == 2) { + var10.entity1 = new DynamicObject(var11, 2, var8 + 4, Player.Scene_plane, var4, var5, var2, false, var10.entity1); + var10.entity2 = new DynamicObject(var11, 2, var8 + 1 & 3, Player.Scene_plane, var4, var5, var2, false, var10.entity2); + } else { + var10.entity1 = new DynamicObject(var11, var7, var8, Player.Scene_plane, var4, var5, var2, false, var10.entity1); + } + } } - } - if (var1) { - class42.rasterProvider.drawFull(0, 0); - } else { - var11 = var3; - int var12 = var4; - int var13 = var5; - int var14 = var6; + if (var37 == 1) { + WallDecoration var38 = WorldMapArea.scene.method3339(Player.Scene_plane, var4, var5); + if (var38 != null) { + var11 = UserComparator8.Entity_unpackID(var38.tag); + if (var7 != 4 && var7 != 5) { + if (var7 == 6) { + var38.entity1 = new DynamicObject(var11, 4, var8 + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + } else if (var7 == 7) { + var38.entity1 = new DynamicObject(var11, 4, (var8 + 2 & 3) + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + } else if (var7 == 8) { + var38.entity1 = new DynamicObject(var11, 4, var8 + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + var38.entity2 = new DynamicObject(var11, 4, (var8 + 2 & 3) + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity2); + } + } else { + var38.entity1 = new DynamicObject(var11, 4, var8, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + } + } + } - for (int var15 = 0; var15 < Client.rootWidgetCount; ++var15) { - if (Client.rootWidgetXs[var15] + Client.rootWidgetWidths[var15] > var11 && Client.rootWidgetXs[var15] < var11 + var13 && Client.rootWidgetYs[var15] + Client.rootWidgetHeights[var15] > var12 && Client.rootWidgetYs[var15] < var14 + var12) { - Client.field842[var15] = true; + if (var37 == 2) { + GameObject var39 = WorldMapArea.scene.method3227(Player.Scene_plane, var4, var5); + if (var7 == 11) { + var7 = 10; + } + + if (var39 != null) { + var39.entity = new DynamicObject(UserComparator8.Entity_unpackID(var39.tag), var7, var8, Player.Scene_plane, var4, var5, var2, false, var39.entity); + } + } + + if (var37 == 3) { + FloorDecoration var40 = WorldMapArea.scene.getFloorDecoration(Player.Scene_plane, var4, var5); + if (var40 != null) { + var40.entity = new DynamicObject(UserComparator8.Entity_unpackID(var40.tag), 22, var8, Player.Scene_plane, var4, var5, var2, false, var40.entity); } } } + } else if (class185.field2293 == var0) { + var2 = var1.method5639(); + var3 = var1.method5648(); + var4 = var1.method5648(); + var5 = var1.readUnsignedByte(); + var6 = (var5 >> 4 & 7) + SpriteMask.field2501; + var7 = (var5 & 7) + GrandExchangeOffer.field61; + if (var6 >= 0 && var7 >= 0 && var6 < 104 && var7 < 104) { + var6 = var6 * 128 + 64; + var7 = var7 * 128 + 64; + GraphicsObject var44 = new GraphicsObject(var4, Player.Scene_plane, var6, var7, GraphicsObject.getTileHeight(var6, var7, Player.Scene_plane) - var2, var3, Client.cycle); + Client.graphicsObjects.addFirst(var44); + } + + } else { + int var12; + int var13; + int var32; + if (class185.field2298 == var0) { + var2 = var1.method5650(); + var3 = var1.method5622(); + var4 = var1.method5622() * 4; + var5 = var1.method5647(); + var6 = var1.readUnsignedByte(); + var7 = (var6 >> 4 & 7) + SpriteMask.field2501; + var8 = (var6 & 7) + GrandExchangeOffer.field61; + var37 = var1.method5639() * 4; + var32 = var1.method5647(); + byte var41 = var1.method5671(); + byte var42 = var1.method5671(); + var13 = var1.method5697(); + int var43 = var1.method5647(); + var11 = var41 + var7; + var12 = var42 + var8; + if (var7 >= 0 && var8 >= 0 && var7 < 104 && var8 < 104 && var11 >= 0 && var12 >= 0 && var11 < 104 && var12 < 104 && var5 != 65535) { + var7 = var7 * 128 + 64; + var8 = var8 * 128 + 64; + var11 = var11 * 128 + 64; + var12 = var12 * 128 + 64; + Projectile var15 = new Projectile(var5, Player.Scene_plane, var7, var8, GraphicsObject.getTileHeight(var7, var8, Player.Scene_plane) - var4, var32 + Client.cycle, var43 + Client.cycle, var13, var3, var2, var37); + var15.setDestination(var11, var12, GraphicsObject.getTileHeight(var11, var12, Player.Scene_plane) - var37, var32 + Client.cycle); + Client.projectiles.addFirst(var15); + } + + } else { + TileItem var33; + if (class185.field2292 == var0) { + var2 = var1.readUnsignedShort(); + var3 = var1.method5646(); + var4 = var1.readUnsignedByte(); + var5 = (var4 >> 4 & 7) + SpriteMask.field2501; + var6 = (var4 & 7) + GrandExchangeOffer.field61; + if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { + var33 = new TileItem(); + var33.id = var3; + var33.quantity = var2; + if (Client.groundItems[Player.Scene_plane][var5][var6] == null) { + Client.groundItems[Player.Scene_plane][var5][var6] = new NodeDeque(); + } + + Client.groundItems[Player.Scene_plane][var5][var6].addFirst(var33); + class4.updateItemPile(var5, var6); + } + + } else { + if (class185.field2291 == var0) { + var2 = var1.method5648(); + var3 = var1.readUnsignedShort(); + var4 = var1.method5622(); + var5 = var4 >> 2; + var6 = var4 & 3; + var7 = Client.field692[var5]; + var8 = var1.readUnsignedShort(); + byte var9 = var1.method5763(); + var32 = var1.method5697(); + var11 = (var32 >> 4 & 7) + SpriteMask.field2501; + var12 = (var32 & 7) + GrandExchangeOffer.field61; + var13 = var1.method5646(); + byte var14 = var1.method5640(); + byte var34 = var1.readByte(); + byte var16 = var1.method5671(); + Player var17; + if (var13 == Client.localPlayerIndex) { + var17 = class215.localPlayer; + } else { + var17 = Client.players[var13]; + } + + if (var17 != null) { + ObjectDefinition var18 = WorldMapDecorationType.getObjectDefinition(var3); + int var19; + int var20; + if (var6 != 1 && var6 != 3) { + var19 = var18.sizeX; + var20 = var18.sizeY; + } else { + var19 = var18.sizeY; + var20 = var18.sizeX; + } + + int var21 = var11 + (var19 >> 1); + int var22 = var11 + (var19 + 1 >> 1); + int var23 = var12 + (var20 >> 1); + int var24 = var12 + (var20 + 1 >> 1); + int[][] var25 = Tiles.Tiles_heights[Player.Scene_plane]; + int var26 = var25[var22][var24] + var25[var21][var24] + var25[var22][var23] + var25[var21][var23] >> 2; + int var27 = (var11 << 7) + (var19 << 6); + int var28 = (var12 << 7) + (var20 << 6); + Model var29 = var18.getModel(var5, var6, var25, var27, var26, var28); + if (var29 != null) { + GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Scene_plane, var11, var12, var7, -1, 0, 0, var2 + 1, var8 + 1); + var17.animationCycleStart = var2 + Client.cycle; + var17.animationCycleEnd = var8 + Client.cycle; + var17.model0 = var29; + var17.field620 = var11 * 128 + var19 * 64; + var17.field613 = var12 * 128 + var20 * 64; + var17.tileHeight2 = var26; + byte var30; + if (var34 > var9) { + var30 = var34; + var34 = var9; + var9 = var30; + } + + if (var16 > var14) { + var30 = var16; + var16 = var14; + var14 = var30; + } + + var17.field595 = var34 + var11; + var17.field612 = var9 + var11; + var17.field611 = var16 + var12; + var17.field604 = var14 + var12; + } + } + } + + if (class185.field2299 == var0) { + var2 = var1.method5622(); + var3 = var2 >> 2; + var4 = var2 & 3; + var5 = Client.field692[var3]; + var6 = var1.readUnsignedByte(); + var7 = (var6 >> 4 & 7) + SpriteMask.field2501; + var8 = (var6 & 7) + GrandExchangeOffer.field61; + if (var7 >= 0 && var8 >= 0 && var7 < 104 && var8 < 104) { + GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Scene_plane, var7, var8, var5, -1, var3, var4, 0, -1); + } + + } else if (class185.field2296 == var0) { + var2 = var1.method5622(); + var3 = (var2 >> 4 & 7) + SpriteMask.field2501; + var4 = (var2 & 7) + GrandExchangeOffer.field61; + var5 = var1.method5648(); + var6 = var1.method5639(); + var7 = var6 >> 2; + var8 = var6 & 3; + var37 = Client.field692[var7]; + if (var3 >= 0 && var4 >= 0 && var3 < 104 && var4 < 104) { + GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Scene_plane, var3, var4, var37, var5, var7, var8, 0, -1); + } + + } else if (class185.field2297 == var0) { + var2 = var1.method5647(); + var3 = var1.method5648(); + var4 = var1.readUnsignedByte(); + var5 = (var4 >> 4 & 7) + SpriteMask.field2501; + var6 = (var4 & 7) + GrandExchangeOffer.field61; + var7 = var1.method5647(); + if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { + NodeDeque var31 = Client.groundItems[Player.Scene_plane][var5][var6]; + if (var31 != null) { + for (TileItem var35 = (TileItem)var31.last(); var35 != null; var35 = (TileItem)var31.previous()) { + if ((var2 & 32767) == var35.id && var7 == var35.quantity) { + var35.quantity = var3; + break; + } + } + + class4.updateItemPile(var5, var6); + } + } + + } else if (class185.field2294 != var0) { + if (class185.field2295 == var0) { + var2 = var1.method5622(); + var3 = var1.method5697(); + var4 = var3 >> 4 & 15; + var5 = var3 & 7; + var6 = var1.method5697(); + var7 = (var6 >> 4 & 7) + SpriteMask.field2501; + var8 = (var6 & 7) + GrandExchangeOffer.field61; + var37 = var1.method5646(); + if (var7 >= 0 && var8 >= 0 && var7 < 104 && var8 < 104) { + var32 = var4 + 1; + if (class215.localPlayer.pathX[0] >= var7 - var32 && class215.localPlayer.pathX[0] <= var7 + var32 && class215.localPlayer.pathY[0] >= var8 - var32 && class215.localPlayer.pathY[0] <= var8 + var32 && Client.field868 != 0 && var5 > 0 && Client.soundEffectCount < 50) { + Client.soundEffectIds[Client.soundEffectCount] = var37; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var5; + Client.queuedSoundEffectDelays[Client.soundEffectCount] = var2; + Client.soundEffects[Client.soundEffectCount] = null; + Client.soundLocations[Client.soundEffectCount] = var4 + (var8 << 8) + (var7 << 16); + ++Client.soundEffectCount; + } + } + } + + } else { + var2 = var1.readUnsignedShort(); + var3 = var1.method5622(); + var4 = (var3 >> 4 & 7) + SpriteMask.field2501; + var5 = (var3 & 7) + GrandExchangeOffer.field61; + if (var4 >= 0 && var5 >= 0 && var4 < 104 && var5 < 104) { + NodeDeque var36 = Client.groundItems[Player.Scene_plane][var4][var5]; + if (var36 != null) { + for (var33 = (TileItem)var36.last(); var33 != null; var33 = (TileItem)var36.previous()) { + if ((var2 & 32767) == var33.id) { + var33.remove(); + break; + } + } + + if (var36.last() == null) { + Client.groundItems[Player.Scene_plane][var4][var5] = null; + } + + class4.updateItemPile(var4, var5); + } + } + + } + } + } } } - - @ObfuscatedName("in") - @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-240794843" - ) - @Export("getTapToDrop") - static boolean getTapToDrop() { - return Client.tapToDrop; - } } diff --git a/runescape-client/src/main/java/Wrapper.java b/runescape-client/src/main/java/Wrapper.java index b9cb10d79f..c29b3f0afb 100644 --- a/runescape-client/src/main/java/Wrapper.java +++ b/runescape-client/src/main/java/Wrapper.java @@ -2,10 +2,10 @@ import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("ec") +@ObfuscatedName("eo") @Implements("Wrapper") public abstract class Wrapper extends DualNode { - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("size") final int size; @@ -13,11 +13,11 @@ public abstract class Wrapper extends DualNode { this.size = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("get") abstract Object get(); - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("isSoft") abstract boolean isSoft(); } diff --git a/runescape-client/src/main/java/class0.java b/runescape-client/src/main/java/class0.java index 35b5ba79c6..83dee573d9 100644 --- a/runescape-client/src/main/java/class0.java +++ b/runescape-client/src/main/java/class0.java @@ -1,19 +1,19 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("z") +@ObfuscatedName("a") public interface class0 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/lang/Object;Lkl;B)V", - garbageValue = "0" + signature = "(Ljava/lang/Object;Lkc;B)V", + garbageValue = "25" ) - void vmethod64(Object var1, Buffer var2); + void vmethod89(Object var1, Buffer var2); - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;B)Ljava/lang/Object;", - garbageValue = "-93" + signature = "(Lkc;I)Ljava/lang/Object;", + garbageValue = "242985434" ) - Object vmethod55(Buffer var1); + Object vmethod74(Buffer var1); } diff --git a/runescape-client/src/main/java/class1.java b/runescape-client/src/main/java/class1.java index f8bce832ac..fcb0c6021d 100644 --- a/runescape-client/src/main/java/class1.java +++ b/runescape-client/src/main/java/class1.java @@ -2,200 +2,514 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("n") +@ObfuscatedName("t") final class class1 implements class0 { - @ObfuscatedName("dr") + @ObfuscatedName("ou") @ObfuscatedSignature( - signature = "Lie;" + signature = "Lcz;" ) - @Export("archive0") - static Archive archive0; + @Export("varcs") + static Varcs varcs; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "Lhq;" + ) + @Export("InvDefinition_archive") + public static AbstractArchive InvDefinition_archive; + @ObfuscatedName("gh") + @ObfuscatedSignature( + signature = "Llx;" + ) + @Export("compass") + static Sprite compass; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/lang/Object;Lkl;B)V", - garbageValue = "0" + signature = "(Ljava/lang/Object;Lkc;B)V", + garbageValue = "25" ) - public void vmethod64(Object var1, Buffer var2) { - this.method13((Integer)var1, var2); + public void vmethod89(Object var1, Buffer var2) { + this.method12((Integer)var1, var2); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;B)Ljava/lang/Object;", - garbageValue = "-93" + signature = "(Lkc;I)Ljava/lang/Object;", + garbageValue = "242985434" ) - public Object vmethod55(Buffer var1) { + public Object vmethod74(Buffer var1) { return var1.readInt(); } @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(Ljava/lang/Integer;Lkl;I)V", - garbageValue = "-1770008879" + signature = "(Ljava/lang/Integer;Lkc;I)V", + garbageValue = "1640474163" ) - void method13(Integer var1, Buffer var2) { + void method12(Integer var1, Buffer var2) { var2.writeInt(var1); } - @ObfuscatedName("r") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(ZZI)I", - garbageValue = "1419553069" + signature = "(I)I", + garbageValue = "646080011" ) - public static int method5(boolean var0, boolean var1) { - byte var2 = 0; - int var3 = var2 + NetCache.NetCache_pendingPriorityWritesCount + NetCache.NetCache_pendingPriorityResponsesCount; - return var3; + public static int method26() { + return KeyHandler.KeyHandler_idleCycles; } - @ObfuscatedName("l") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(ZB)V", - garbageValue = "16" + signature = "(I)Lbk;", + garbageValue = "1796263151" ) - public static void method16(boolean var0) { - if (var0 != class162.ItemDefinition_inMembersWorld) { - InterfaceParent.method1193(); - class162.ItemDefinition_inMembersWorld = var0; - } - + @Export("getNextWorldListWorld") + static World getNextWorldListWorld() { + return World.World_listCount < World.World_count ? Username.World_worlds[++World.World_listCount - 1] : null; } - @ObfuscatedName("hh") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(IIIIIIII)V", - garbageValue = "557524614" + signature = "(Lks;Lks;Lks;I)V", + garbageValue = "-196875939" ) - @Export("addPendingSpawnToScene") - static final void addPendingSpawnToScene(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { - if (var2 >= 1 && var3 >= 1 && var2 <= 102 && var3 <= 102) { - if (Client.isLowDetail && var0 != WorldMapRectangle.plane) { - return; + @Export("drawTitle") + static void drawTitle(Font var0, Font var1, Font var2) { + Login.xPadding = (class286.canvasWidth - 765) / 2; + Login.loginBoxX = Login.xPadding + 202; + class192.loginBoxCenter = Login.loginBoxX + 180; + if (Login.worldSelectOpen) { + UrlRequester.method3430(var0, var1); + } else { + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + FontName.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + Tiles.logoSprite.drawAt(Login.xPadding + 382 - Tiles.logoSprite.subWidth / 2, 18); + int var4; + if (Client.gameState == 0 || Client.gameState == 5) { + byte var3 = 20; + var0.drawCentered("RuneScape is loading - please wait...", Login.loginBoxX + 180, 245 - var3, 16777215, -1); + var4 = 253 - var3; + Rasterizer2D.Rasterizer2D_drawRectangle(Login.loginBoxX + 180 - 152, var4, 304, 34, 9179409); + Rasterizer2D.Rasterizer2D_drawRectangle(Login.loginBoxX + 180 - 151, var4 + 1, 302, 32, 0); + Rasterizer2D.Rasterizer2D_fillRectangle(Login.loginBoxX + 180 - 150, var4 + 2, Login.Login_loadingPercent * 3, 30, 9179409); + Rasterizer2D.Rasterizer2D_fillRectangle(Login.loginBoxX + 180 - 150 + Login.Login_loadingPercent * 3, var4 + 2, 300 - Login.Login_loadingPercent * 3, 30, 0); + var0.drawCentered(Login.Login_loadingText, Login.loginBoxX + 180, 276 - var3, 16777215, -1); } - long var7 = 0L; - boolean var9 = true; - boolean var10 = false; - boolean var11 = false; - if (var1 == 0) { - var7 = PacketWriter.scene.getBoundaryObjectTag(var0, var2, var3); - } + String var5; + String var7; + String var8; + int var9; + char[] var10; + int var11; + short var25; + int var26; + short var27; + if (Client.gameState == 20) { + NPC.titleboxSprite.drawAt(Login.loginBoxX + 180 - NPC.titleboxSprite.subWidth / 2, 271 - NPC.titleboxSprite.subHeight / 2); + var25 = 201; + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 15; + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var26 += 7; + if (Login.loginIndex != 4) { + var0.draw("Login: ", Login.loginBoxX + 180 - 110, var26, 16777215, 0); + var27 = 200; - if (var1 == 1) { - var7 = PacketWriter.scene.getWallDecorationTag(var0, var2, var3); - } - - if (var1 == 2) { - var7 = PacketWriter.scene.getGameObjectTag(var0, var2, var3); - } - - if (var1 == 3) { - var7 = PacketWriter.scene.getFloorDecorationTag(var0, var2, var3); - } - - int var12; - if (0L != var7) { - var12 = PacketWriter.scene.getObjectFlags(var0, var2, var3, var7); - int var14 = class81.Entity_unpackID(var7); - int var15 = var12 & 31; - int var16 = var12 >> 6 & 3; - ObjectDefinition var13; - if (var1 == 0) { - PacketWriter.scene.removeBoundaryObject(var0, var2, var3); - var13 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var14); - if (var13.interactType != 0) { - Client.collisionMaps[var0].method3514(var2, var3, var15, var16, var13.boolean1); - } - } - - if (var1 == 1) { - PacketWriter.scene.removeWallDecoration(var0, var2, var3); - } - - if (var1 == 2) { - PacketWriter.scene.removeGameObject(var0, var2, var3); - var13 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var14); - if (var2 + var13.sizeX > 103 || var3 + var13.sizeX > 103 || var2 + var13.sizeY > 103 || var3 + var13.sizeY > 103) { - return; + for (var5 = ScriptEvent.method1277(); var0.stringWidth(var5) > var27; var5 = var5.substring(0, var5.length() - 1)) { } - if (var13.interactType != 0) { - Client.collisionMaps[var0].setFlagOffNonSquare(var2, var3, var13.sizeX, var13.sizeY, var16, var13.boolean1); - } - } + var0.draw(AbstractFont.escapeBrackets(var5), Login.loginBoxX + 180 - 70, var26, 16777215, 0); + var26 += 15; + var7 = Login.Login_password; + var9 = var7.length(); + var10 = new char[var9]; - if (var1 == 3) { - PacketWriter.scene.removeFloorDecoration(var0, var2, var3); - var13 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var14); - if (var13.interactType == 1) { - Client.collisionMaps[var0].method3517(var2, var3); + for (var11 = 0; var11 < var9; ++var11) { + var10[var11] = '*'; + } + + var8 = new String(var10); + + for (var8 = var8; var0.stringWidth(var8) > var27; var8 = var8.substring(1)) { + } + + var0.draw("Password: " + var8, Login.loginBoxX + 180 - 108, var26, 16777215, 0); + var26 += 15; + } + } + + if (Client.gameState == 10 || Client.gameState == 11) { + NPC.titleboxSprite.drawAt(Login.loginBoxX, 171); + short var19; + if (Login.loginIndex == 0) { + var25 = 251; + var0.drawCentered("Welcome to RuneScape", Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 30; + var4 = Login.loginBoxX + 180 - 80; + var19 = 291; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawLines("New User", var4 - 73, var19 - 20, 144, 40, 16777215, 0, 1, 1, 0); + var4 = Login.loginBoxX + 180 + 80; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawLines("Existing User", var4 - 73, var19 - 20, 144, 40, 16777215, 0, 1, 1, 0); + } else if (Login.loginIndex == 1) { + var0.drawCentered(Login.Login_response0, Login.loginBoxX + 180, 201, 16776960, 0); + var25 = 236; + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var25, 16777215, 0); + var26 = var25 + 15; + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var26, 16777215, 0); + var26 += 15; + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var26, 16777215, 0); + var26 += 15; + var4 = Login.loginBoxX + 180 - 80; + var19 = 321; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Continue", var4, var19 + 5, 16777215, 0); + var4 = Login.loginBoxX + 180 + 80; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Cancel", var4, var19 + 5, 16777215, 0); + } else { + IndexedSprite var29; + if (Login.loginIndex == 2) { + var25 = 201; + var0.drawCentered(Login.Login_response1, class192.loginBoxCenter, var25, 16776960, 0); + var26 = var25 + 15; + var0.drawCentered(Login.Login_response2, class192.loginBoxCenter, var26, 16776960, 0); + var26 += 15; + var0.drawCentered(Login.Login_response3, class192.loginBoxCenter, var26, 16776960, 0); + var26 += 15; + var26 += 7; + var0.draw("Login: ", class192.loginBoxCenter - 110, var26, 16777215, 0); + var27 = 200; + + for (var5 = ScriptEvent.method1277(); var0.stringWidth(var5) > var27; var5 = var5.substring(1)) { + } + + var0.draw(AbstractFont.escapeBrackets(var5) + (Login.currentLoginField == 0 & Client.cycle % 40 < 20 ? AbstractArchive.colorStartTag(16776960) + "|" : ""), class192.loginBoxCenter - 70, var26, 16777215, 0); + var26 += 15; + var7 = Login.Login_password; + var9 = var7.length(); + var10 = new char[var9]; + + for (var11 = 0; var11 < var9; ++var11) { + var10[var11] = '*'; + } + + var8 = new String(var10); + + for (var8 = var8; var0.stringWidth(var8) > var27; var8 = var8.substring(1)) { + } + + var0.draw("Password: " + var8 + (Login.currentLoginField == 1 & Client.cycle % 40 < 20 ? AbstractArchive.colorStartTag(16776960) + "|" : ""), class192.loginBoxCenter - 108, var26, 16777215, 0); + var26 += 15; + var25 = 277; + var9 = class192.loginBoxCenter + -117; + boolean var30 = Client.Login_isUsernameRemembered; + boolean var12 = Login.field1159; + var29 = var30 ? (var12 ? class4.field23 : Login.options_buttons_2Sprite) : (var12 ? class51.field412 : UserComparator8.options_buttons_0Sprite); + var29.drawAt(var9, var25); + var9 = var9 + var29.subWidth + 5; + var1.draw("Remember username", var9, var25 + 13, 16776960, 0); + var9 = class192.loginBoxCenter + 24; + boolean var15 = ScriptEvent.clientPreferences.hideUsername; + boolean var16 = Login.field1175; + IndexedSprite var14 = var15 ? (var16 ? class4.field23 : Login.options_buttons_2Sprite) : (var16 ? class51.field412 : UserComparator8.options_buttons_0Sprite); + var14.drawAt(var9, var25); + var9 = var9 + var14.subWidth + 5; + var1.draw("Hide username", var9, var25 + 13, 16776960, 0); + var26 = var25 + 15; + int var17 = class192.loginBoxCenter - 80; + short var18 = 321; + UserComparator9.titlebuttonSprite.drawAt(var17 - 73, var18 - 20); + var0.drawCentered("Login", var17, var18 + 5, 16777215, 0); + var17 = class192.loginBoxCenter + 80; + UserComparator9.titlebuttonSprite.drawAt(var17 - 73, var18 - 20); + var0.drawCentered("Cancel", var17, var18 + 5, 16777215, 0); + var25 = 357; + switch(Login.field1166) { + case 2: + VarbitDefinition.field3288 = "Having trouble logging in?"; + break; + default: + VarbitDefinition.field3288 = "Can't login? Click here."; + } + + WorldMapLabel.field225 = new Bounds(class192.loginBoxCenter, var25, var1.stringWidth(VarbitDefinition.field3288), 11); + WorldMapManager.field319 = new Bounds(class192.loginBoxCenter, var25, var1.stringWidth("Still having trouble logging in?"), 11); + var1.drawCentered(VarbitDefinition.field3288, class192.loginBoxCenter, var25, 16777215, 0); + } else if (Login.loginIndex == 3) { + var25 = 201; + var0.drawCentered("Invalid credentials.", Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 20; + var1.drawCentered("For accounts created after 24th November 2010, please use your", Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var1.drawCentered("email address to login. Otherwise please login with your username.", Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var4 = Login.loginBoxX + 180; + var19 = 276; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var2.drawCentered("Try again", var4, var19 + 5, 16777215, 0); + var4 = Login.loginBoxX + 180; + var19 = 326; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var2.drawCentered("Forgotten password?", var4, var19 + 5, 16777215, 0); + } else if (Login.loginIndex == 4) { + var0.drawCentered("Authenticator", Login.loginBoxX + 180, 201, 16776960, 0); + var25 = 236; + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var25, 16777215, 0); + var26 = var25 + 15; + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var26, 16777215, 0); + var26 += 15; + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var26, 16777215, 0); + var26 += 15; + var5 = "PIN: "; + var7 = class268.otp; + var9 = var7.length(); + var10 = new char[var9]; + + for (var11 = 0; var11 < var9; ++var11) { + var10[var11] = '*'; + } + + var8 = new String(var10); + var0.draw(var5 + var8 + (Client.cycle % 40 < 20 ? AbstractArchive.colorStartTag(16776960) + "|" : ""), Login.loginBoxX + 180 - 108, var26, 16777215, 0); + var26 -= 8; + var0.draw("Trust this computer", Login.loginBoxX + 180 - 9, var26, 16776960, 0); + var26 += 15; + var0.draw("for 30 days: ", Login.loginBoxX + 180 - 9, var26, 16776960, 0); + int var23 = Login.loginBoxX + 180 - 9 + var0.stringWidth("for 30 days: ") + 15; + var9 = var26 - var0.ascent; + if (Login.field1177) { + var29 = Login.options_buttons_2Sprite; + } else { + var29 = UserComparator8.options_buttons_0Sprite; + } + + var29.drawAt(var23, var9); + var26 += 15; + var11 = Login.loginBoxX + 180 - 80; + short var31 = 321; + UserComparator9.titlebuttonSprite.drawAt(var11 - 73, var31 - 20); + var0.drawCentered("Continue", var11, var31 + 5, 16777215, 0); + var11 = Login.loginBoxX + 180 + 80; + UserComparator9.titlebuttonSprite.drawAt(var11 - 73, var31 - 20); + var0.drawCentered("Cancel", var11, var31 + 5, 16777215, 0); + var1.drawCentered("Can't Log In?", Login.loginBoxX + 180, var31 + 36, 255, 0); + } else if (Login.loginIndex == 5) { + var0.drawCentered("Forgotten your password?", Login.loginBoxX + 180, 201, 16776960, 0); + var25 = 221; + var2.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 15; + var2.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var2.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var26 += 14; + var0.draw("Username/email: ", Login.loginBoxX + 180 - 145, var26, 16777215, 0); + var27 = 174; + + for (var5 = ScriptEvent.method1277(); var0.stringWidth(var5) > var27; var5 = var5.substring(1)) { + } + + var0.draw(AbstractFont.escapeBrackets(var5) + (Client.cycle % 40 < 20 ? AbstractArchive.colorStartTag(16776960) + "|" : ""), Login.loginBoxX + 180 - 34, var26, 16777215, 0); + var26 += 15; + int var6 = Login.loginBoxX + 180 - 80; + short var24 = 321; + UserComparator9.titlebuttonSprite.drawAt(var6 - 73, var24 - 20); + var0.drawCentered("Recover", var6, var24 + 5, 16777215, 0); + var6 = Login.loginBoxX + 180 + 80; + UserComparator9.titlebuttonSprite.drawAt(var6 - 73, var24 - 20); + var0.drawCentered("Back", var6, var24 + 5, 16777215, 0); + var24 = 356; + var1.drawCentered("Still having trouble logging in?", class192.loginBoxCenter, var24, 268435455, 0); + } else if (Login.loginIndex == 6) { + var25 = 201; + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 15; + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var4 = Login.loginBoxX + 180; + var19 = 321; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Back", var4, var19 + 5, 16777215, 0); + } else if (Login.loginIndex == 7) { + var25 = 216; + var0.drawCentered("Your date of birth isn't set.", Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 15; + var2.drawCentered("Please verify your account status by", Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var2.drawCentered("setting your date of birth.", Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var4 = Login.loginBoxX + 180 - 80; + var19 = 321; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Set Date of Birth", var4, var19 + 5, 16777215, 0); + var4 = Login.loginBoxX + 180 + 80; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Back", var4, var19 + 5, 16777215, 0); + } else if (Login.loginIndex == 8) { + var25 = 216; + var0.drawCentered("Sorry, but your account is not eligible to play.", Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 15; + var2.drawCentered("For more information, please take a look at", Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var2.drawCentered("our privacy policy.", Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var4 = Login.loginBoxX + 180 - 80; + var19 = 321; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Privacy Policy", var4, var19 + 5, 16777215, 0); + var4 = Login.loginBoxX + 180 + 80; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Back", var4, var19 + 5, 16777215, 0); + } else if (Login.loginIndex == 12) { + var25 = 201; + String var22 = ""; + var5 = ""; + String var21 = ""; + switch(Login.field1156) { + case 0: + var22 = "Your account has been disabled."; + var5 = Strings.field2797; + var21 = ""; + break; + case 1: + var22 = "Account locked as we suspect it has been stolen."; + var5 = Strings.field3006; + var21 = ""; + break; + default: + UserComparator3.Login_promptCredentials(false); + } + + var0.drawCentered(var22, Login.loginBoxX + 180, var25, 16776960, 0); + var26 = var25 + 15; + var2.drawCentered(var5, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + var2.drawCentered(var21, Login.loginBoxX + 180, var26, 16776960, 0); + var26 += 15; + int var34 = Login.loginBoxX + 180; + short var33 = 276; + UserComparator9.titlebuttonSprite.drawAt(var34 - 73, var33 - 20); + var0.drawCentered("Support Page", var34, var33 + 5, 16777215, 0); + var34 = Login.loginBoxX + 180; + var33 = 326; + UserComparator9.titlebuttonSprite.drawAt(var34 - 73, var33 - 20); + var0.drawCentered("Back", var34, var33 + 5, 16777215, 0); + } else if (Login.loginIndex == 24) { + var25 = 221; + var0.drawCentered(Login.Login_response1, Login.loginBoxX + 180, var25, 16777215, 0); + var26 = var25 + 15; + var0.drawCentered(Login.Login_response2, Login.loginBoxX + 180, var26, 16777215, 0); + var26 += 15; + var0.drawCentered(Login.Login_response3, Login.loginBoxX + 180, var26, 16777215, 0); + var26 += 15; + var4 = Login.loginBoxX + 180; + var19 = 301; + UserComparator9.titlebuttonSprite.drawAt(var4 - 73, var19 - 20); + var0.drawCentered("Ok", var4, var19 + 5, 16777215, 0); } } } - if (var4 >= 0) { - var12 = var0; - if (var0 < 3 && (Tiles.Tiles_renderFlags[1][var2][var3] & 2) == 2) { - var12 = var0 + 1; - } - - class3.method50(var0, var12, var2, var3, var4, var5, var6, PacketWriter.scene, Client.collisionMaps[var0]); + if (Client.gameState >= 10) { + int[] var20 = new int[4]; + Rasterizer2D.Rasterizer2D_getClipArray(var20); + Rasterizer2D.Rasterizer2D_setClip(Login.xPadding, 0, Login.xPadding + 765, FloorUnderlayDefinition.canvasHeight); + Login.loginScreenRunesAnimation.draw(Login.xPadding - 22, Client.cycle); + Login.loginScreenRunesAnimation.draw(Login.xPadding + 22 + 765 - 128, Client.cycle); + Rasterizer2D.Rasterizer2D_setClipArray(var20); } - } - } - - @ObfuscatedName("hl") - @ObfuscatedSignature( - signature = "(Lbi;IIBI)V", - garbageValue = "916902326" - ) - static final void method14(Player var0, int var1, int var2, byte var3) { - int var4 = var0.pathX[0]; - int var5 = var0.pathY[0]; - int var6 = var0.transformedSize(); - if (var4 >= var6 && var4 < 104 - var6 && var5 >= var6 && var5 < 104 - var6) { - if (var1 >= var6 && var1 < 104 - var6 && var2 >= var6 && var2 < 104 - var6) { - int var9 = var0.transformedSize(); - Client.field909.approxDestinationX = var1; - Client.field909.approxDestinationY = var2; - Client.field909.approxDestinationSizeX = 1; - Client.field909.approxDestinationSizeY = 1; - class65 var10 = Client.field909; - int var11 = class192.method3646(var4, var5, var9, var10, Client.collisionMaps[var0.plane], true, Client.field910, Client.field911); - if (var11 >= 1) { - for (int var12 = 0; var12 < var11 - 1; ++var12) { - var0.method1263(Client.field910[var12], Client.field911[var12], var3); + Decimator.title_muteSprite[ScriptEvent.clientPreferences.titleMusicDisabled ? 1 : 0].drawAt(Login.xPadding + 765 - 40, 463); + if (Client.gameState > 5 && Language.Language_EN == WorldMapSection1.clientLanguage) { + if (Message.field587 != null) { + var26 = Login.xPadding + 5; + var27 = 463; + byte var32 = 100; + byte var28 = 35; + Message.field587.drawAt(var26, var27); + var0.drawCentered("World" + " " + Client.worldId, var32 / 2 + var26, var28 / 2 + var27 - 2, 16777215, 0); + if (class96.World_request != null) { + var1.drawCentered("Loading...", var32 / 2 + var26, var28 / 2 + var27 + 12, 16777215, 0); + } else { + var1.drawCentered("Click to switch", var32 / 2 + var26, var28 / 2 + var27 + 12, 16777215, 0); } - + } else { + Message.field587 = ClientPacket.SpriteBuffer_getIndexedSpriteByName(GrandExchangeOfferUnitPriceComparator.archive8, "sl_button", ""); } } + } } - @ObfuscatedName("kt") + @ObfuscatedName("fx") @ObfuscatedSignature( signature = "(B)V", - garbageValue = "2" + garbageValue = "12" ) - static void method15() { - if (Client.field879 && class223.localPlayer != null) { - int var0 = class223.localPlayer.pathX[0]; - int var1 = class223.localPlayer.pathY[0]; - if (var0 < 0 || var1 < 0 || var0 >= 104 || var1 >= 104) { - return; - } + @Export("logOut") + static final void logOut() { + Client.packetWriter.close(); + FloorOverlayDefinition.FloorOverlayDefinition_cached.clear(); + Login.method2258(); + WorldMapCacheName.method682(); + ObjectDefinition.ObjectDefinition_cached.clear(); + ObjectDefinition.ObjectDefinition_cachedModelData.clear(); + ObjectDefinition.ObjectDefinition_cachedEntities.clear(); + ObjectDefinition.ObjectDefinition_cachedModels.clear(); + NPCDefinition.NpcDefinition_cached.clear(); + NPCDefinition.NpcDefinition_cachedModels.clear(); + FriendSystem.method2038(); + BuddyRankComparator.method3568(); + class81.method2207(); + VarbitDefinition.VarbitDefinition_cached.clear(); + WorldMapRectangle.method331(); + HitSplatDefinition.HitSplatDefinition_cached.clear(); + HitSplatDefinition.HitSplatDefinition_cachedSprites.clear(); + HitSplatDefinition.HitSplatDefinition_cachedFonts.clear(); + HealthBarDefinition.HealthBarDefinition_cached.clear(); + HealthBarDefinition.HealthBarDefinition_cachedSprites.clear(); + StructDefinition.StructDefinition_cached.clear(); + ParamDefinition.ParamDefinition_cached.clear(); + MusicPatchNode.method3973(); + DirectByteArrayCopier.method4101(); + Widget.Widget_cachedSprites.clear(); + Widget.Widget_cachedModels.clear(); + Widget.Widget_cachedFonts.clear(); + Widget.Widget_cachedSpriteMasks.clear(); + ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).clear(); + Script.Script_cached.clear(); + BuddyRankComparator.archive0.clearFiles(); + LoginPacket.archive1.clearFiles(); + SpriteMask.archive3.clearFiles(); + NetFileRequest.archive4.clearFiles(); + WorldMapRectangle.archive5.clearFiles(); + class216.archive6.clearFiles(); + Language.archive7.clearFiles(); + GrandExchangeOfferUnitPriceComparator.archive8.clearFiles(); + WorldMapSprite.archive9.clearFiles(); + WorldMapID.archive10.clearFiles(); + Decimator.archive11.clearFiles(); + Occluder.archive12.clearFiles(); + WorldMapArea.scene.clear(); - ObjectSound.oculusOrbFocalPointX = class223.localPlayer.x; - int var2 = MusicPatchPcmStream.getTileHeight(class223.localPlayer.x, class223.localPlayer.y, WorldMapRectangle.plane) - Client.camFollowHeight; - if (var2 < ModelData0.field1840) { - ModelData0.field1840 = var2; - } - - class14.oculusOrbFocalPointY = class223.localPlayer.y; - Client.field879 = false; + for (int var0 = 0; var0 < 4; ++var0) { + Client.collisionMaps[var0].clear(); } + System.gc(); + class80.method2194(2); + Client.field865 = -1; + Client.field855 = false; + GameShell.method1141(); + Tile.updateGameState(10); } } diff --git a/runescape-client/src/main/java/class13.java b/runescape-client/src/main/java/class13.java index 6a34fca35b..10eca10019 100644 --- a/runescape-client/src/main/java/class13.java +++ b/runescape-client/src/main/java/class13.java @@ -1,134 +1,24 @@ -import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("a") +@ObfuscatedName("k") public class class13 { - @ObfuscatedName("gx") - @ObfuscatedSignature( - signature = "[Llf;" - ) - @Export("mapDotSprites") - static Sprite[] mapDotSprites; - @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(CLgt;I)C", - garbageValue = "-1706308889" + signature = "(CS)Z", + garbageValue = "32317" ) - @Export("standardizeChar") - static char standardizeChar(char var0, Language var1) { - if (var0 >= 192 && var0 <= 255) { - if (var0 >= 192 && var0 <= 198) { - return 'A'; - } - - if (var0 == 199) { - return 'C'; - } - - if (var0 >= 200 && var0 <= 203) { - return 'E'; - } - - if (var0 >= 204 && var0 <= 207) { - return 'I'; - } - - if (var0 == 209 && var1 != Language.Language_ES) { - return 'N'; - } - - if (var0 >= 210 && var0 <= 214) { - return 'O'; - } - - if (var0 >= 217 && var0 <= 220) { - return 'U'; - } - - if (var0 == 221) { - return 'Y'; - } - - if (var0 == 223) { - return 's'; - } - - if (var0 >= 224 && var0 <= 230) { - return 'a'; - } - - if (var0 == 231) { - return 'c'; - } - - if (var0 >= 232 && var0 <= 235) { - return 'e'; - } - - if (var0 >= 236 && var0 <= 239) { - return 'i'; - } - - if (var0 == 241 && var1 != Language.Language_ES) { - return 'n'; - } - - if (var0 >= 242 && var0 <= 246) { - return 'o'; - } - - if (var0 >= 249 && var0 <= 252) { - return 'u'; - } - - if (var0 == 253 || var0 == 255) { - return 'y'; - } - } - - if (var0 == 338) { - return 'O'; - } else if (var0 == 339) { - return 'o'; - } else if (var0 == 376) { - return 'Y'; - } else { - return var0; - } + public static final boolean method200(char var0) { + return var0 == 160 || var0 == ' ' || var0 == '_' || var0 == '-'; } - @ObfuscatedName("y") + @ObfuscatedName("fi") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "-114703177" + signature = "(B)V", + garbageValue = "2" ) - @Export("Messages_getNextChatID") - static int Messages_getNextChatID(int var0) { - Message var1 = (Message)Messages.Messages_hashTable.get((long)var0); - if (var1 == null) { - return -1; - } else { - return var1.previousDual == Messages.Messages_queue.sentinel ? -1 : ((Message)var1.previousDual).count; - } - } - - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "(Lho;II)V", - garbageValue = "891811325" - ) - @Export("Widget_setKeyIgnoreHeld") - static final void Widget_setKeyIgnoreHeld(Widget var0, int var1) { - if (var0.field2552 == null) { - throw new RuntimeException(); - } else { - if (var0.field2684 == null) { - var0.field2684 = new int[var0.field2552.length]; - } - - var0.field2684[var1] = Integer.MAX_VALUE; - } + static final void method199() { + Scene.Scene_isLowDetail = false; + Client.isLowDetail = false; } } diff --git a/runescape-client/src/main/java/class14.java b/runescape-client/src/main/java/class14.java index c301052d3a..0bf50e33bf 100644 --- a/runescape-client/src/main/java/class14.java +++ b/runescape-client/src/main/java/class14.java @@ -1,290 +1,79 @@ +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("e") +@ObfuscatedName("x") public class class14 { - @ObfuscatedName("ry") + @ObfuscatedName("qn") @ObfuscatedGetter( - intValue = 1308893635 + intValue = 1643724800 ) - static int field90; - @ObfuscatedName("z") + static int field88; + @ObfuscatedName("gd") @ObfuscatedSignature( - signature = "Lhp;" + signature = "[Llx;" ) - @Export("SpotAnimationDefinition_archive") - public static AbstractArchive SpotAnimationDefinition_archive; - @ObfuscatedName("gu") + @Export("headIconHintSprites") + static Sprite[] headIconHintSprites; + + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "[Llp;" + signature = "(I)V", + garbageValue = "-1580849456" ) - @Export("mapSceneSprites") - static IndexedSprite[] mapSceneSprites; - @ObfuscatedName("hy") - @ObfuscatedGetter( - intValue = -1228592435 - ) - @Export("oculusOrbFocalPointY") - static int oculusOrbFocalPointY; - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(Ljava/lang/Throwable;Ljava/lang/String;)Lmf;" - ) - @Export("newRunException") - public static RunException newRunException(Throwable var0, String var1) { - RunException var2; - if (var0 instanceof RunException) { - var2 = (RunException)var0; - var2.message = var2.message + ' ' + var1; - } else { - var2 = new RunException(var0, var1); - } - - return var2; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(CI)C", - garbageValue = "-2022718130" - ) - static char method175(char var0) { - if (var0 == 198) { - return 'E'; - } else if (var0 == 230) { - return 'e'; - } else if (var0 == 223) { - return 's'; - } else if (var0 == 338) { - return 'E'; - } else { - return (char)(var0 == 339 ? 'e' : '\u0000'); - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(IIILfi;Lfa;B)Z", - garbageValue = "-110" - ) - static final boolean method172(int var0, int var1, int var2, RouteStrategy var3, CollisionMap var4) { - int var5 = var0; - int var6 = var1; - byte var7 = 64; - byte var8 = 64; - int var9 = var0 - var7; - int var10 = var1 - var8; - class173.directions[var7][var8] = 99; - class173.distances[var7][var8] = 0; - byte var11 = 0; - int var12 = 0; - class173.bufferX[var11] = var0; - int var20 = var11 + 1; - class173.bufferY[var11] = var1; - int[][] var13 = var4.flags; - - while (true) { - label303: - while (true) { - int var14; - int var15; - int var16; - int var17; - int var18; - int var19; - do { - do { - do { - label280: - do { - if (var12 == var20) { - UserComparator10.field1956 = var5; - class173.field2075 = var6; - return false; - } - - var5 = class173.bufferX[var12]; - var6 = class173.bufferY[var12]; - var12 = var12 + 1 & 4095; - var18 = var5 - var9; - var19 = var6 - var10; - var14 = var5 - var4.xInset; - var15 = var6 - var4.yInset; - if (var3.hasArrived(var2, var5, var6, var4)) { - UserComparator10.field1956 = var5; - class173.field2075 = var6; - return true; - } - - var16 = class173.distances[var18][var19] + 1; - if (var18 > 0 && class173.directions[var18 - 1][var19] == 0 && (var13[var14 - 1][var15] & 19136782) == 0 && (var13[var14 - 1][var15 + var2 - 1] & 19136824) == 0) { - var17 = 1; - - while (true) { - if (var17 >= var2 - 1) { - class173.bufferX[var20] = var5 - 1; - class173.bufferY[var20] = var6; - var20 = var20 + 1 & 4095; - class173.directions[var18 - 1][var19] = 2; - class173.distances[var18 - 1][var19] = var16; - break; - } - - if ((var13[var14 - 1][var15 + var17] & 19136830) != 0) { - break; - } - - ++var17; - } - } - - if (var18 < 128 - var2 && class173.directions[var18 + 1][var19] == 0 && (var13[var14 + var2][var15] & 19136899) == 0 && (var13[var14 + var2][var15 + var2 - 1] & 19136992) == 0) { - var17 = 1; - - while (true) { - if (var17 >= var2 - 1) { - class173.bufferX[var20] = var5 + 1; - class173.bufferY[var20] = var6; - var20 = var20 + 1 & 4095; - class173.directions[var18 + 1][var19] = 8; - class173.distances[var18 + 1][var19] = var16; - break; - } - - if ((var13[var14 + var2][var17 + var15] & 19136995) != 0) { - break; - } - - ++var17; - } - } - - if (var19 > 0 && class173.directions[var18][var19 - 1] == 0 && (var13[var14][var15 - 1] & 19136782) == 0 && (var13[var14 + var2 - 1][var15 - 1] & 19136899) == 0) { - var17 = 1; - - while (true) { - if (var17 >= var2 - 1) { - class173.bufferX[var20] = var5; - class173.bufferY[var20] = var6 - 1; - var20 = var20 + 1 & 4095; - class173.directions[var18][var19 - 1] = 1; - class173.distances[var18][var19 - 1] = var16; - break; - } - - if ((var13[var17 + var14][var15 - 1] & 19136911) != 0) { - break; - } - - ++var17; - } - } - - if (var19 < 128 - var2 && class173.directions[var18][var19 + 1] == 0 && (var13[var14][var15 + var2] & 19136824) == 0 && (var13[var14 + var2 - 1][var15 + var2] & 19136992) == 0) { - var17 = 1; - - while (true) { - if (var17 >= var2 - 1) { - class173.bufferX[var20] = var5; - class173.bufferY[var20] = var6 + 1; - var20 = var20 + 1 & 4095; - class173.directions[var18][var19 + 1] = 4; - class173.distances[var18][var19 + 1] = var16; - break; - } - - if ((var13[var14 + var17][var15 + var2] & 19137016) != 0) { - break; - } - - ++var17; - } - } - - if (var18 > 0 && var19 > 0 && class173.directions[var18 - 1][var19 - 1] == 0 && (var13[var14 - 1][var15 - 1] & 19136782) == 0) { - var17 = 1; - - while (true) { - if (var17 >= var2) { - class173.bufferX[var20] = var5 - 1; - class173.bufferY[var20] = var6 - 1; - var20 = var20 + 1 & 4095; - class173.directions[var18 - 1][var19 - 1] = 3; - class173.distances[var18 - 1][var19 - 1] = var16; - break; - } - - if ((var13[var14 - 1][var17 + (var15 - 1)] & 19136830) != 0 || (var13[var17 + (var14 - 1)][var15 - 1] & 19136911) != 0) { - break; - } - - ++var17; - } - } - - if (var18 < 128 - var2 && var19 > 0 && class173.directions[var18 + 1][var19 - 1] == 0 && (var13[var14 + var2][var15 - 1] & 19136899) == 0) { - var17 = 1; - - while (true) { - if (var17 >= var2) { - class173.bufferX[var20] = var5 + 1; - class173.bufferY[var20] = var6 - 1; - var20 = var20 + 1 & 4095; - class173.directions[var18 + 1][var19 - 1] = 9; - class173.distances[var18 + 1][var19 - 1] = var16; - break; - } - - if ((var13[var14 + var2][var17 + (var15 - 1)] & 19136995) != 0 || (var13[var17 + var14][var15 - 1] & 19136911) != 0) { - break; - } - - ++var17; - } - } - - if (var18 > 0 && var19 < 128 - var2 && class173.directions[var18 - 1][var19 + 1] == 0 && (var13[var14 - 1][var15 + var2] & 19136824) == 0) { - for (var17 = 1; var17 < var2; ++var17) { - if ((var13[var14 - 1][var17 + var15] & 19136830) != 0 || (var13[var17 + (var14 - 1)][var15 + var2] & 19137016) != 0) { - continue label280; - } - } - - class173.bufferX[var20] = var5 - 1; - class173.bufferY[var20] = var6 + 1; - var20 = var20 + 1 & 4095; - class173.directions[var18 - 1][var19 + 1] = 6; - class173.distances[var18 - 1][var19 + 1] = var16; - } - } while(var18 >= 128 - var2); - } while(var19 >= 128 - var2); - } while(class173.directions[var18 + 1][var19 + 1] != 0); - } while((var13[var14 + var2][var15 + var2] & 19136992) != 0); - - for (var17 = 1; var17 < var2; ++var17) { - if ((var13[var17 + var14][var15 + var2] & 19137016) != 0 || (var13[var14 + var2][var15 + var17] & 19136995) != 0) { - continue label303; + static void method204() { + try { + File var0 = new File(class30.userHomeDirectory, "random.dat"); + int var2; + if (var0.exists()) { + JagexCache.JagexCache_randomDat = new BufferedFile(new AccessFile(var0, "rw", 25L), 24, 0); + } else { + label39: + for (int var1 = 0; var1 < class312.field3803.length; ++var1) { + for (var2 = 0; var2 < BoundaryObject.field1859.length; ++var2) { + File var3 = new File(BoundaryObject.field1859[var2] + class312.field3803[var1] + File.separatorChar + "random.dat"); + if (var3.exists()) { + JagexCache.JagexCache_randomDat = new BufferedFile(new AccessFile(var3, "rw", 25L), 24, 0); + break label39; + } } } - - class173.bufferX[var20] = var5 + 1; - class173.bufferY[var20] = var6 + 1; - var20 = var20 + 1 & 4095; - class173.directions[var18 + 1][var19 + 1] = 12; - class173.distances[var18 + 1][var19 + 1] = var16; } + + if (JagexCache.JagexCache_randomDat == null) { + RandomAccessFile var4 = new RandomAccessFile(var0, "rw"); + var2 = var4.read(); + var4.seek(0L); + var4.write(var2); + var4.seek(0L); + var4.close(); + JagexCache.JagexCache_randomDat = new BufferedFile(new AccessFile(var0, "rw", 25L), 24, 0); + } + } catch (IOException var5) { + } + + } + + @ObfuscatedName("fw") + @ObfuscatedSignature( + signature = "(I)I", + garbageValue = "363418967" + ) + static int method203() { + if (Client.archiveLoaders != null && Client.archiveLoadersDone < Client.archiveLoaders.size()) { + int var0 = 0; + + for (int var1 = 0; var1 <= Client.archiveLoadersDone; ++var1) { + var0 += ((ArchiveLoader)Client.archiveLoaders.get(var1)).loadedCount; + } + + return var0 * 10000 / Client.field903; + } else { + return 10000; } } - - @ObfuscatedName("il") - @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-259743374" - ) - static boolean method174() { - return Client.tapToDrop || KeyHandler.KeyHandler_pressedKeys[81]; - } } diff --git a/runescape-client/src/main/java/class146.java b/runescape-client/src/main/java/class146.java index e10689916a..5782e44c37 100644 --- a/runescape-client/src/main/java/class146.java +++ b/runescape-client/src/main/java/class146.java @@ -1,7 +1,7 @@ import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("ev") +@ObfuscatedName("es") public interface class146 { - @ObfuscatedName("z") - void method3302(Object var1); + @ObfuscatedName("a") + void method3453(Object var1); } diff --git a/runescape-client/src/main/java/class16.java b/runescape-client/src/main/java/class16.java index 10aa9e4471..9513378af8 100644 --- a/runescape-client/src/main/java/class16.java +++ b/runescape-client/src/main/java/class16.java @@ -1,20 +1,47 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("t") +@ObfuscatedName("r") public class class16 { - @ObfuscatedName("bv") - @ObfuscatedSignature( - signature = "Lha;" + @ObfuscatedName("hi") + @ObfuscatedGetter( + intValue = -71438851 ) - static StudioGame field101; + @Export("cameraY") + static int cameraY; - @ObfuscatedName("gt") + @ObfuscatedName("ad") @ObfuscatedSignature( - signature = "(I)Z", - garbageValue = "-194801296" + signature = "(ILcj;ZI)I", + garbageValue = "2052755977" ) - static boolean method195() { - return (Client.drawPlayerNames & 8) != 0; + static int method224(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.SOUND_SYNTH) { + Interpreter.Interpreter_intStackSize -= 3; + class185.queueSoundEffect(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]); + return 1; + } else if (var0 == ScriptOpcodes.SOUND_SONG) { + AbstractWorldMapIcon.playSong(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + return 1; + } else if (var0 == ScriptOpcodes.SOUND_JINGLE) { + Interpreter.Interpreter_intStackSize -= 2; + WorldMapEvent.playSoundJingle(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + return 1; + } else { + return 2; + } + } + + @ObfuscatedName("iw") + @ObfuscatedSignature( + signature = "(B)I", + garbageValue = "1" + ) + @Export("getNewestMenuIdx") + static final int getNewestMenuIdx() { + return Client.menuOptionsCount - 1; } } diff --git a/runescape-client/src/main/java/class160.java b/runescape-client/src/main/java/class160.java index 4d947fc6d5..60382d4ef8 100644 --- a/runescape-client/src/main/java/class160.java +++ b/runescape-client/src/main/java/class160.java @@ -3,137 +3,269 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ff") +@ObfuscatedName("fp") public enum class160 implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lff;" + signature = "Lfp;" ) - field1979(3, 0), + field1986(2, 0), + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lfp;" + ) + field1987(1, 1), @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lff;" + signature = "Lfp;" ) - field1976(1, 1), - @ObfuscatedName("v") + field1982(3, 2), + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lff;" + signature = "Lfp;" ) - field1985(2, 2), - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lff;" - ) - field1977(0, 3); + field1985(0, 3); - @ObfuscatedName("ei") - @Export("worldHost") - static String worldHost; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -1676935957 + intValue = -1547837327 ) - public final int field1984; - @ObfuscatedName("p") + public final int field1983; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 1779758939 + intValue = 2121072249 ) @Export("id") final int id; class160(int var3, int var4) { - this.field1984 = var3; + this.field1983 = var3; this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("o") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(IIB)I", - garbageValue = "18" + signature = "(IIII)V", + garbageValue = "-1766799370" ) - static final int method3416(int var0, int var1) { - int var2 = var0 + var1 * 57; - var2 ^= var2 << 13; - int var3 = var2 * (var2 * var2 * 15731 + 789221) + 1376312589 & Integer.MAX_VALUE; - return var3 >> 19 & 255; + static final void method3585(int var0, int var1, int var2) { + int var3; + for (var3 = 0; var3 < 8; ++var3) { + for (int var4 = 0; var4 < 8; ++var4) { + Tiles.Tiles_heights[var0][var3 + var1][var4 + var2] = 0; + } + } + + if (var1 > 0) { + for (var3 = 1; var3 < 8; ++var3) { + Tiles.Tiles_heights[var0][var1][var3 + var2] = Tiles.Tiles_heights[var0][var1 - 1][var3 + var2]; + } + } + + if (var2 > 0) { + for (var3 = 1; var3 < 8; ++var3) { + Tiles.Tiles_heights[var0][var3 + var1][var2] = Tiles.Tiles_heights[var0][var3 + var1][var2 - 1]; + } + } + + if (var1 > 0 && Tiles.Tiles_heights[var0][var1 - 1][var2] != 0) { + Tiles.Tiles_heights[var0][var1][var2] = Tiles.Tiles_heights[var0][var1 - 1][var2]; + } else if (var2 > 0 && Tiles.Tiles_heights[var0][var1][var2 - 1] != 0) { + Tiles.Tiles_heights[var0][var1][var2] = Tiles.Tiles_heights[var0][var1][var2 - 1]; + } else if (var1 > 0 && var2 > 0 && Tiles.Tiles_heights[var0][var1 - 1][var2 - 1] != 0) { + Tiles.Tiles_heights[var0][var1][var2] = Tiles.Tiles_heights[var0][var1 - 1][var2 - 1]; + } + } - @ObfuscatedName("gz") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "-44" + signature = "([BIII)Ljava/lang/String;", + garbageValue = "-634451931" ) - static final void method3417() { - for (PendingSpawn var0 = (PendingSpawn)Client.pendingSpawns.last(); var0 != null; var0 = (PendingSpawn)Client.pendingSpawns.previous()) { - if (var0.hitpoints > 0) { - --var0.hitpoints; + @Export("decodeStringCp1252") + public static String decodeStringCp1252(byte[] var0, int var1, int var2) { + char[] var3 = new char[var2]; + int var4 = 0; + + for (int var5 = 0; var5 < var2; ++var5) { + int var6 = var0[var5 + var1] & 255; + if (var6 != 0) { + if (var6 >= 128 && var6 < 160) { + char var7 = class287.cp1252AsciiExtension[var6 - 128]; + if (var7 == 0) { + var7 = '?'; + } + + var6 = var7; + } + + var3[var4++] = (char)var6; + } + } + + return new String(var3, 0, var4); + } + + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "(IIIZIB)J", + garbageValue = "-75" + ) + @Export("calculateTag") + public static long calculateTag(int var0, int var1, int var2, boolean var3, int var4) { + long var5 = (long)((var0 & 127) << 0 | (var1 & 127) << 7 | (var2 & 3) << 14) | ((long)var4 & 4294967295L) << 17; + if (var3) { + var5 |= 65536L; + } + + return var5; + } + + @ObfuscatedName("hq") + @ObfuscatedSignature( + signature = "(Lkf;I)V", + garbageValue = "1886858655" + ) + static final void method3586(PacketBuffer var0) { + for (int var1 = 0; var1 < Client.field676; ++var1) { + int var2 = Client.field677[var1]; + NPC var3 = Client.npcs[var2]; + int var4 = var0.readUnsignedByte(); + int var5; + int var6; + int var7; + if ((var4 & 2) != 0) { + var5 = var0.method5646(); + if (var5 == 65535) { + var5 = -1; + } + + var6 = var0.method5639(); + if (var5 == var3.sequence && var5 != -1) { + var7 = PlayerType.SequenceDefinition_get(var5).field3521; + if (var7 == 1) { + var3.sequenceFrame = 0; + var3.sequenceFrameCycle = 0; + var3.sequenceDelay = var6; + var3.field960 = 0; + } + + if (var7 == 2) { + var3.field960 = 0; + } + } else if (var5 == -1 || var3.sequence == -1 || PlayerType.SequenceDefinition_get(var5).field3519 >= PlayerType.SequenceDefinition_get(var3.sequence).field3519) { + var3.sequence = var5; + var3.sequenceFrame = 0; + var3.sequenceFrameCycle = 0; + var3.sequenceDelay = var6; + var3.field960 = 0; + var3.field983 = var3.pathLength; + } } - boolean var1; - int var2; - int var3; - ObjectDefinition var4; - if (var0.hitpoints == 0) { - if (var0.objectId >= 0) { - var2 = var0.objectId; - var3 = var0.field921; - var4 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var2); - if (var3 == 11) { - var3 = 10; - } + if ((var4 & 1) != 0) { + var3.targetIndex = var0.method5647(); + if (var3.targetIndex == 65535) { + var3.targetIndex = -1; + } + } - if (var3 >= 5 && var3 <= 8) { - var3 = 4; - } + if ((var4 & 32) != 0) { + var3.spotAnimation = var0.method5647(); + var5 = var0.method5603(); + var3.field965 = var5 >> 16; + var3.field973 = (var5 & 65535) + Client.cycle; + var3.spotAnimationFrame = 0; + var3.spotAnimationFrameCycle = 0; + if (var3.field973 > Client.cycle) { + var3.spotAnimationFrame = -1; + } - var1 = var4.method4567(var3); - if (!var1) { - continue; + if (var3.spotAnimation == 65535) { + var3.spotAnimation = -1; + } + } + + int var8; + if ((var4 & 16) != 0) { + var5 = var0.method5647(); + var6 = var0.method5648(); + var7 = var3.x - (var5 - UserComparator8.baseX * 64 - UserComparator8.baseX * 64) * 64; + var8 = var3.y - (var6 - HealthBar.baseY * 64 - HealthBar.baseY * 64) * 64; + if (var7 != 0 || var8 != 0) { + var3.field934 = (int)(Math.atan2((double)var7, (double)var8) * 325.949D) & 2047; + } + } + + if ((var4 & 4) != 0) { + var3.overheadText = var0.readStringCp1252NullTerminated(); + var3.overheadTextCyclesRemaining = 100; + } + + if ((var4 & 8) != 0) { + var3.definition = SecureRandomCallable.getNpcDefinition(var0.readUnsignedShort()); + var3.field927 = var3.definition.size; + var3.field977 = var3.definition.rotation; + var3.walkSequence = var3.definition.walkSequence; + var3.walkBackSequence = var3.definition.walkBackSequence; + var3.walkLeftSequence = var3.definition.walkLeftSequence; + var3.walkRightSequence = var3.definition.walkRightSequence; + var3.readySequence = var3.definition.readySequence; + var3.turnLeftSequence = var3.definition.turnLeftSequence; + var3.turnRightSequence = var3.definition.turnRightSequence; + } + + if ((var4 & 64) != 0) { + var5 = var0.method5639(); + int var9; + int var10; + int var11; + if (var5 > 0) { + for (var6 = 0; var6 < var5; ++var6) { + var8 = -1; + var9 = -1; + var10 = -1; + var7 = var0.readUShortSmart(); + if (var7 == 32767) { + var7 = var0.readUShortSmart(); + var9 = var0.readUShortSmart(); + var8 = var0.readUShortSmart(); + var10 = var0.readUShortSmart(); + } else if (var7 != 32766) { + var9 = var0.readUShortSmart(); + } else { + var7 = -1; + } + + var11 = var0.readUShortSmart(); + var3.addHitSplat(var7, var9, var8, var10, Client.cycle, var11); } } - class1.addPendingSpawnToScene(var0.plane, var0.type, var0.x, var0.y, var0.objectId, var0.field922, var0.field921); - var0.remove(); - } else { - if (var0.delay > 0) { - --var0.delay; - } - - if (var0.delay == 0 && var0.x >= 1 && var0.y >= 1 && var0.x <= 102 && var0.y <= 102) { - if (var0.id >= 0) { - var2 = var0.id; - var3 = var0.field916; - var4 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var2); - if (var3 == 11) { - var3 = 10; + var6 = var0.method5697(); + if (var6 > 0) { + for (var7 = 0; var7 < var6; ++var7) { + var8 = var0.readUShortSmart(); + var9 = var0.readUShortSmart(); + if (var9 != 32767) { + var10 = var0.readUShortSmart(); + var11 = var0.readUnsignedByte(); + int var12 = var9 > 0 ? var0.method5639() : var11; + var3.addHealthBar(var8, Client.cycle, var9, var10, var11, var12); + } else { + var3.removeHealthBar(var8); } - - if (var3 >= 5 && var3 <= 8) { - var3 = 4; - } - - var1 = var4.method4567(var3); - if (!var1) { - continue; - } - } - - class1.addPendingSpawnToScene(var0.plane, var0.type, var0.x, var0.y, var0.id, var0.orientation, var0.field916); - var0.delay = -1; - if (var0.objectId == var0.id && var0.objectId == -1) { - var0.remove(); - } else if (var0.id == var0.objectId && var0.field922 == var0.orientation && var0.field921 == var0.field916) { - var0.remove(); } } } diff --git a/runescape-client/src/main/java/class161.java b/runescape-client/src/main/java/class161.java index 35459ea2a9..dd8f86fa9c 100644 --- a/runescape-client/src/main/java/class161.java +++ b/runescape-client/src/main/java/class161.java @@ -1,5 +1,5 @@ import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("fo") +@ObfuscatedName("fu") public interface class161 { } diff --git a/runescape-client/src/main/java/class162.java b/runescape-client/src/main/java/class162.java index 196dc363a5..d8da1279ad 100644 --- a/runescape-client/src/main/java/class162.java +++ b/runescape-client/src/main/java/class162.java @@ -2,33 +2,41 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fk") +@ObfuscatedName("fy") public class class162 implements class161 { - @ObfuscatedName("m") - @Export("ItemDefinition_inMembersWorld") - static boolean ItemDefinition_inMembersWorld; - @ObfuscatedName("s") - public static String field1990; - @ObfuscatedName("ao") - @ObfuscatedSignature( - signature = "Lll;" - ) - static Bounds field1988; + @ObfuscatedName("u") + @Export("BZip2Decompressor_block") + static int[] BZip2Decompressor_block; - @ObfuscatedName("r") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "1376590669" + signature = "(IB)Liy;", + garbageValue = "113" ) - @Export("clearItemContainer") - static void clearItemContainer(int var0) { - ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + @Export("getParamDefinition") + public static ParamDefinition getParamDefinition(int var0) { + ParamDefinition var1 = (ParamDefinition)ParamDefinition.ParamDefinition_cached.get((long)var0); if (var1 != null) { - for (int var2 = 0; var2 < var1.ids.length; ++var2) { - var1.ids[var2] = -1; - var1.quantities[var2] = 0; + return var1; + } else { + byte[] var2 = ParamDefinition.ParamDefinition_archive.takeFile(11, var0); + var1 = new ParamDefinition(); + if (var2 != null) { + var1.decode(new Buffer(var2)); } + var1.postDecode(); + ParamDefinition.ParamDefinition_cached.put(var1, (long)var0); + return var1; } } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(IB)Z", + garbageValue = "47" + ) + public static boolean method3588(int var0) { + return (var0 >> 28 & 1) != 0; + } } diff --git a/runescape-client/src/main/java/class173.java b/runescape-client/src/main/java/class173.java index e3c7fc2052..5a4a11522f 100644 --- a/runescape-client/src/main/java/class173.java +++ b/runescape-client/src/main/java/class173.java @@ -3,31 +3,27 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("fr") +@ObfuscatedName("fx") public class class173 { - @ObfuscatedName("v") + @ObfuscatedName("n") @Export("directions") static int[][] directions; - @ObfuscatedName("u") + @ObfuscatedName("q") @Export("distances") static int[][] distances; - @ObfuscatedName("p") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 764450151 + intValue = 1388693747 ) - static int field2075; - @ObfuscatedName("m") + static int field2070; + @ObfuscatedName("o") @Export("bufferX") static int[] bufferX; - @ObfuscatedName("y") + @ObfuscatedName("i") @Export("bufferY") static int[] bufferY; - @ObfuscatedName("fu") - @ObfuscatedSignature( - signature = "Lkn;" - ) - @Export("fontBold12") - static Font fontBold12; + @ObfuscatedName("ed") + static int[] field2074; static { directions = new int[128][128]; @@ -36,26 +32,21 @@ public class class173 { bufferY = new int[4096]; } - @ObfuscatedName("z") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;I)I", - garbageValue = "1868348372" + signature = "(CI)C", + garbageValue = "-1784750626" ) - public static int method3556(CharSequence var0) { - int var1 = var0.length(); - int var2 = 0; + static char method3720(char var0) { + return var0 != 181 && var0 != 402 ? Character.toTitleCase(var0) : var0; + } - for (int var3 = 0; var3 < var1; ++var3) { - char var4 = var0.charAt(var3); - if (var4 <= 127) { - ++var2; - } else if (var4 <= 2047) { - var2 += 2; - } else { - var2 += 3; - } - } - - return var2; + @ObfuscatedName("jr") + @ObfuscatedSignature( + signature = "(IB)Ljava/lang/String;", + garbageValue = "0" + ) + static final String method3728(int var0) { + return var0 < 999999999 ? Integer.toString(var0) : "*"; } } diff --git a/runescape-client/src/main/java/class181.java b/runescape-client/src/main/java/class181.java index 7efa431267..2911c6240e 100644 --- a/runescape-client/src/main/java/class181.java +++ b/runescape-client/src/main/java/class181.java @@ -1,5 +1,5 @@ import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("fp") +@ObfuscatedName("fo") public interface class181 { } diff --git a/runescape-client/src/main/java/class185.java b/runescape-client/src/main/java/class185.java index 504bba28b4..bbfaf473ef 100644 --- a/runescape-client/src/main/java/class185.java +++ b/runescape-client/src/main/java/class185.java @@ -1,82 +1,72 @@ -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.Reflection; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("gw") +@ObfuscatedName("ge") public class class185 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgw;" - ) - public static final class185 field2299; - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lgw;" - ) - public static final class185 field2300; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lgw;" - ) - public static final class185 field2298; - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lgw;" - ) - public static final class185 field2297; - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lgw;" - ) - public static final class185 field2295; - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lgw;" + signature = "Lge;" ) public static final class185 field2296; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lge;" + ) + public static final class185 field2292; + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "Lge;" + ) + public static final class185 field2293; @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lgw;" + signature = "Lge;" ) - public static final class185 field2301; - @ObfuscatedName("m") + public static final class185 field2294; + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lgw;" + signature = "Lge;" ) - public static final class185 field2302; - @ObfuscatedName("y") + public static final class185 field2295; + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lgw;" + signature = "Lge;" ) - public static final class185 field2303; + public static final class185 field2291; + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "Lge;" + ) + public static final class185 field2298; + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "Lge;" + ) + public static final class185 field2297; @ObfuscatedName("i") @ObfuscatedSignature( - signature = "Lgw;" + signature = "Lge;" ) - public static final class185 field2304; - @ObfuscatedName("at") - @ObfuscatedGetter( - intValue = 1987889023 + public static final class185 field2299; + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "Lge;" ) - static int field2305; + public static final class185 field2300; static { - field2299 = new class185(4); - field2300 = new class185(5); - field2298 = new class185(14); - field2297 = new class185(5); - field2295 = new class185(15); - field2296 = new class185(2); - field2301 = new class185(6); - field2302 = new class185(4); - field2303 = new class185(7); - field2304 = new class185(3); + field2296 = new class185(4); + field2292 = new class185(5); + field2293 = new class185(6); + field2294 = new class185(3); + field2295 = new class185(5); + field2291 = new class185(14); + field2298 = new class185(15); + field2297 = new class185(7); + field2299 = new class185(2); + field2300 = new class185(4); } @ObfuscatedSignature( @@ -86,169 +76,252 @@ public class class185 { class185(int var1) { } - @ObfuscatedName("n") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/String;ZS)Lmh;", - garbageValue = "3503" + signature = "(I)V", + garbageValue = "-883649352" ) - @Export("getPreferencesFile") - public static AccessFile getPreferencesFile(String var0, String var1, boolean var2) { - File var3 = new File(GrandExchangeOfferOwnWorldComparator.cacheDir, "preferences" + var0 + ".dat"); - if (var3.exists()) { - try { - AccessFile var10 = new AccessFile(var3, "rw", 10000L); - return var10; - } catch (IOException var9) { - } + public static void method3774() { + if (NetCache.NetCache_socket != null) { + NetCache.NetCache_socket.close(); } - String var4 = ""; - if (BufferedNetSocket.cacheGamebuild == 33) { - var4 = "_rc"; - } else if (BufferedNetSocket.cacheGamebuild == 34) { - var4 = "_wip"; - } - - File var5 = new File(JagexCache.userHomeDirectory, "jagex_" + var1 + "_preferences" + var0 + var4 + ".dat"); - AccessFile var6; - if (!var2 && var5.exists()) { - try { - var6 = new AccessFile(var5, "rw", 10000L); - return var6; - } catch (IOException var8) { - } - } - - try { - var6 = new AccessFile(var3, "rw", 10000L); - return var6; - } catch (IOException var7) { - throw new RuntimeException(); - } } - @ObfuscatedName("n") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(Lkl;II)V", - garbageValue = "65280" + signature = "(ILcj;ZI)I", + garbageValue = "-1968035328" ) - @Export("readReflectionCheck") - public static void readReflectionCheck(Buffer var0, int var1) { - ReflectionCheck var2 = new ReflectionCheck(); - var2.size = var0.readUnsignedByte(); - var2.id = var0.readInt(); - var2.operations = new int[var2.size]; - var2.creationErrors = new int[var2.size]; - var2.fields = new Field[var2.size]; - var2.intReplaceValues = new int[var2.size]; - var2.methods = new Method[var2.size]; - var2.arguments = new byte[var2.size][][]; + static int method3772(int var0, Script var1, boolean var2) { + int var4 = -1; + Widget var3; + if (var0 >= 2000) { + var0 -= 1000; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var3 = PacketBufferNode.getWidget(var4); + } else { + var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + } - for (int var3 = 0; var3 < var2.size; ++var3) { - try { - int var4 = var0.readUnsignedByte(); - String var5; - String var6; - int var7; - if (var4 != 0 && var4 != 1 && var4 != 2) { - if (var4 == 3 || var4 == 4) { - var5 = var0.readStringCp1252NullTerminated(); - var6 = var0.readStringCp1252NullTerminated(); - var7 = var0.readUnsignedByte(); - String[] var8 = new String[var7]; + if (var0 == ScriptOpcodes.CC_SETSCROLLPOS) { + Interpreter.Interpreter_intStackSize -= 2; + var3.scrollX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + if (var3.scrollX > var3.scrollWidth - var3.width) { + var3.scrollX = var3.scrollWidth - var3.width; + } - for (int var9 = 0; var9 < var7; ++var9) { - var8[var9] = var0.readStringCp1252NullTerminated(); - } + if (var3.scrollX < 0) { + var3.scrollX = 0; + } - String var20 = var0.readStringCp1252NullTerminated(); - byte[][] var10 = new byte[var7][]; - int var12; - if (var4 == 3) { - for (int var11 = 0; var11 < var7; ++var11) { - var12 = var0.readInt(); - var10[var11] = new byte[var12]; - var0.readBytes(var10[var11], 0, var12); - } - } + var3.scrollY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + if (var3.scrollY > var3.scrollHeight - var3.height) { + var3.scrollY = var3.scrollHeight - var3.height; + } - var2.operations[var3] = var4; - Class[] var21 = new Class[var7]; + if (var3.scrollY < 0) { + var3.scrollY = 0; + } - for (var12 = 0; var12 < var7; ++var12) { - var21[var12] = TextureProvider.loadClassFromDescriptor(var8[var12]); - } - - Class var22 = TextureProvider.loadClassFromDescriptor(var20); - if (TextureProvider.loadClassFromDescriptor(var5).getClassLoader() == null) { - throw new SecurityException(); - } - - Method[] var13 = TextureProvider.loadClassFromDescriptor(var5).getDeclaredMethods(); - Method[] var14 = var13; - - for (int var15 = 0; var15 < var14.length; ++var15) { - Method var16 = var14[var15]; - if (Reflection.getMethodName(var16).equals(var6)) { - Class[] var17 = Reflection.getParameterTypes(var16); - if (var21.length == var17.length) { - boolean var18 = true; - - for (int var19 = 0; var19 < var21.length; ++var19) { - if (var17[var19] != var21[var19]) { - var18 = false; - break; - } - } - - if (var18 && var22 == var16.getReturnType()) { - var2.methods[var3] = var16; - } - } - } - } - - var2.arguments[var3] = var10; - } - } else { - var5 = var0.readStringCp1252NullTerminated(); - var6 = var0.readStringCp1252NullTerminated(); - var7 = 0; - if (var4 == 1) { - var7 = var0.readInt(); - } - - var2.operations[var3] = var4; - var2.intReplaceValues[var3] = var7; - if (TextureProvider.loadClassFromDescriptor(var5).getClassLoader() == null) { - throw new SecurityException(); - } - - var2.fields[var3] = Reflection.findField(TextureProvider.loadClassFromDescriptor(var5), var6); + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETCOLOUR) { + var3.color = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETFILL) { + var3.fill = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTRANS) { + var3.transparencyTop = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETLINEWID) { + var3.lineWid = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETGRAPHIC) { + var3.spriteId2 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SET2DANGLE) { + var3.spriteAngle = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTILING) { + var3.spriteTiling = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETMODEL) { + var3.modelType = 1; + var3.modelId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETMODELANGLE) { + Interpreter.Interpreter_intStackSize -= 6; + var3.modelOffsetX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var3.modelOffsetY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var3.modelAngleX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + var3.modelAngleY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; + var3.modelAngleZ = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 4]; + var3.modelZoom = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 5]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else { + int var8; + if (var0 == ScriptOpcodes.CC_SETMODELANIM) { + var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var8 != var3.sequenceId) { + var3.sequenceId = var8; + var3.modelFrame = 0; + var3.modelFrameCycle = 0; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + } + + return 1; + } else if (var0 == ScriptOpcodes.CC_SETMODELORTHOG) { + var3.modelOrthog = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTEXT) { + String var7 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + if (!var7.equals(var3.text)) { + var3.text = var7; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + } + + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTEXTFONT) { + var3.fontId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTEXTALIGN) { + Interpreter.Interpreter_intStackSize -= 3; + var3.textXAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var3.textYAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + var3.textLineHeight = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETTEXTSHADOW) { + var3.textShadowed = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETOUTLINE) { + var3.outline = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETGRAPHICSHADOW) { + var3.spriteShadow = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETVFLIP) { + var3.spriteFlipV = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETHFLIP) { + var3.spriteFlipH = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETSCROLLSIZE) { + Interpreter.Interpreter_intStackSize -= 2; + var3.scrollWidth = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var3.scrollHeight = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + if (var4 != -1 && var3.type == 0) { + class43.revalidateWidgetScroll(Widget.Widget_interfaceComponents[var4 >> 16], var3, false); + } + + return 1; + } else if (var0 == ScriptOpcodes.CC_RESUME_PAUSEBUTTON) { + Tiles.resumePauseWidget(var3.id, var3.childIndex); + Client.meslayerContinueWidget = var3; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == 1122) { + var3.spriteId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETFILLCOLOUR) { + var3.color2 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == 1124) { + var3.transparencyBot = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + return 1; + } else if (var0 == ScriptOpcodes.CC_SETFILLMODE) { + var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + FillMode var6 = (FillMode)WorldMapIcon_1.findEnumerated(class188.FillMode_values(), var8); + if (var6 != null) { + var3.fillMode = var6; + GrandExchangeOfferAgeComparator.invalidateWidget(var3); + } + + return 1; + } else { + boolean var5; + if (var0 == ScriptOpcodes.CC_SETLINEDIRECTION) { + var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + var3.field2641 = var5; + return 1; + } else if (var0 == ScriptOpcodes.CC_SETMODELTRANSPARENT) { + var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + var3.modelTransparency = var5; + return 1; + } else { + return 2; } - } catch (ClassNotFoundException var24) { - var2.creationErrors[var3] = -1; - } catch (SecurityException var25) { - var2.creationErrors[var3] = -2; - } catch (NullPointerException var26) { - var2.creationErrors[var3] = -3; - } catch (Exception var27) { - var2.creationErrors[var3] = -4; - } catch (Throwable var28) { - var2.creationErrors[var3] = -5; } } - - class96.reflectionChecks.addFirst(var2); } - @ObfuscatedName("jy") + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "16256" + signature = "(ILcj;ZB)I", + garbageValue = "-67" ) - static final void method3593() { - Client.field830 = Client.cycleCntr; - GrandExchangeOfferAgeComparator.ClanChat_inClanChat = true; + static int method3773(int var0, Script var1, boolean var2) { + Widget var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + if (var0 == ScriptOpcodes.CC_GETX) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.x; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETY) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.y; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETWIDTH) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.width; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETHEIGHT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.height; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETHIDE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.isHidden ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CC_GETLAYER) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.parentId; + return 1; + } else { + return 2; + } + } + + @ObfuscatedName("fd") + @ObfuscatedSignature( + signature = "(IIII)V", + garbageValue = "-188592863" + ) + @Export("queueSoundEffect") + static void queueSoundEffect(int var0, int var1, int var2) { + if (Client.soundEffectVolume != 0 && var1 != 0 && Client.soundEffectCount < 50) { + Client.soundEffectIds[Client.soundEffectCount] = var0; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var1; + Client.queuedSoundEffectDelays[Client.soundEffectCount] = var2; + Client.soundEffects[Client.soundEffectCount] = null; + Client.soundLocations[Client.soundEffectCount] = 0; + ++Client.soundEffectCount; + } + } } diff --git a/runescape-client/src/main/java/class186.java b/runescape-client/src/main/java/class186.java index 0366b55c69..344fdbde57 100644 --- a/runescape-client/src/main/java/class186.java +++ b/runescape-client/src/main/java/class186.java @@ -1,166 +1,24 @@ -import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gg") +@ObfuscatedName("gu") public class class186 { - @ObfuscatedName("av") + @ObfuscatedName("lo") @ObfuscatedSignature( - signature = "(II)V", - garbageValue = "38319207" + signature = "(Ljava/lang/String;B)Ljava/lang/String;", + garbageValue = "-37" ) - @Export("runWidgetOnLoadListener") - static void runWidgetOnLoadListener(int var0) { - if (var0 != -1) { - if (WorldMapData_0.loadInterface(var0)) { - Widget[] var1 = UserComparator5.Widget_interfaceComponents[var0]; - - for (int var2 = 0; var2 < var1.length; ++var2) { - Widget var3 = var1[var2]; - if (var3.onLoad != null) { - ScriptEvent var4 = new ScriptEvent(); - var4.widget = var3; - var4.args = var3.onLoad; - KeyHandler.runScript(var4, 5000000); - } - } + static String method3776(String var0) { + PlayerType[] var1 = class51.PlayerType_values(); + for (int var2 = 0; var2 < var1.length; ++var2) { + PlayerType var3 = var1[var2]; + if (var3.modIcon != -1 && var0.startsWith(GrandExchangeEvent.method122(var3.modIcon))) { + var0 = var0.substring(6 + Integer.toString(var3.modIcon).length()); + break; } } - } - @ObfuscatedName("ih") - @ObfuscatedSignature( - signature = "(Lil;IIII)V", - garbageValue = "1588588018" - ) - @Export("addNpcToMenu") - static final void addNpcToMenu(NPCDefinition var0, int var1, int var2, int var3) { - if (Client.menuOptionsCount < 400) { - if (var0.transforms != null) { - var0 = var0.transform(); - } - - if (var0 != null) { - if (var0.isInteractable) { - if (!var0.isFollower || Client.followerIndex == var1) { - String var4 = var0.name; - int var7; - int var8; - if (var0.combatLevel != 0) { - var7 = var0.combatLevel; - var8 = class223.localPlayer.combatLevel; - int var9 = var8 - var7; - String var6; - if (var9 < -9) { - var6 = World.colorStartTag(16711680); - } else if (var9 < -6) { - var6 = World.colorStartTag(16723968); - } else if (var9 < -3) { - var6 = World.colorStartTag(16740352); - } else if (var9 < 0) { - var6 = World.colorStartTag(16756736); - } else if (var9 > 9) { - var6 = World.colorStartTag(65280); - } else if (var9 > 6) { - var6 = World.colorStartTag(4259584); - } else if (var9 > 3) { - var6 = World.colorStartTag(8453888); - } else if (var9 > 0) { - var6 = World.colorStartTag(12648192); - } else { - var6 = World.colorStartTag(16776960); - } - - var4 = var4 + var6 + " " + " (" + "level-" + var0.combatLevel + ")"; - } - - if (var0.isFollower && Client.followerOpsLowPriority) { - WorldMapData_1.insertMenuItemNoShift("Examine", World.colorStartTag(16776960) + var4, 1003, var1, var2, var3); - } - - if (Client.isItemSelected == 1) { - WorldMapData_1.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + World.colorStartTag(16776960) + var4, 7, var1, var2, var3); - } else if (Client.isSpellSelected) { - if ((ItemContainer.selectedSpellFlags & 2) == 2) { - WorldMapData_1.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + World.colorStartTag(16776960) + var4, 8, var1, var2, var3); - } - } else { - int var10 = var0.isFollower && Client.followerOpsLowPriority ? 2000 : 0; - String[] var11 = var0.actions; - if (var11 != null) { - for (var7 = 4; var7 >= 0; --var7) { - if (var11[var7] != null && !var11[var7].equalsIgnoreCase("Attack")) { - var8 = 0; - if (var7 == 0) { - var8 = var10 + 9; - } - - if (var7 == 1) { - var8 = var10 + 10; - } - - if (var7 == 2) { - var8 = var10 + 11; - } - - if (var7 == 3) { - var8 = var10 + 12; - } - - if (var7 == 4) { - var8 = var10 + 13; - } - - WorldMapData_1.insertMenuItemNoShift(var11[var7], World.colorStartTag(16776960) + var4, var8, var1, var2, var3); - } - } - } - - if (var11 != null) { - for (var7 = 4; var7 >= 0; --var7) { - if (var11[var7] != null && var11[var7].equalsIgnoreCase("Attack")) { - short var12 = 0; - if (Client.npcAttackOption != AttackOption.AttackOption_hidden) { - if (AttackOption.AttackOption_alwaysRightClick == Client.npcAttackOption || AttackOption.AttackOption_dependsOnCombatLevels == Client.npcAttackOption && var0.combatLevel > class223.localPlayer.combatLevel) { - var12 = 2000; - } - - var8 = 0; - if (var7 == 0) { - var8 = var12 + 9; - } - - if (var7 == 1) { - var8 = var12 + 10; - } - - if (var7 == 2) { - var8 = var12 + 11; - } - - if (var7 == 3) { - var8 = var12 + 12; - } - - if (var7 == 4) { - var8 = var12 + 13; - } - - WorldMapData_1.insertMenuItemNoShift(var11[var7], World.colorStartTag(16776960) + var4, var8, var1, var2, var3); - } - } - } - } - - if (!var0.isFollower || !Client.followerOpsLowPriority) { - WorldMapData_1.insertMenuItemNoShift("Examine", World.colorStartTag(16776960) + var4, 1003, var1, var2, var3); - } - } - - } - } - } - } + return var0; } } diff --git a/runescape-client/src/main/java/class188.java b/runescape-client/src/main/java/class188.java index 859dcd2c07..a8f92e4ef0 100644 --- a/runescape-client/src/main/java/class188.java +++ b/runescape-client/src/main/java/class188.java @@ -1,35 +1,44 @@ import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gd") +@ObfuscatedName("gn") public class class188 { - @ObfuscatedName("z") - static int[] field2322; - @ObfuscatedName("v") + @ObfuscatedName("a") + static int[] field2313; + @ObfuscatedName("h") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lcc;" ) - @Export("SequenceDefinition_skeletonsArchive") - static AbstractArchive SequenceDefinition_skeletonsArchive; - @ObfuscatedName("q") - @ObfuscatedGetter( - intValue = 823451467 - ) - @Export("musicTrackGroupId") - public static int musicTrackGroupId; + @Export("pcmPlayerProvider") + static class99 pcmPlayerProvider; static { new Object(); - field2322 = new int[33]; - field2322[0] = 0; + field2313 = new int[33]; + field2313[0] = 0; int var0 = 2; for (int var1 = 1; var1 < 33; ++var1) { - field2322[var1] = var0 - 1; + field2313[var1] = var0 - 1; var0 += var0; } } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(B)[Llt;", + garbageValue = "80" + ) + @Export("FillMode_values") + public static FillMode[] FillMode_values() { + return new FillMode[]{FillMode.SOLID, FillMode.field3849, FillMode.field3847}; + } + + @ObfuscatedName("t") + static boolean method3793(long var0) { + int var2 = (int)(var0 >>> 14 & 3L); + return var2 == 2; + } } diff --git a/runescape-client/src/main/java/class189.java b/runescape-client/src/main/java/class189.java index c208a32fbc..e6be48fefd 100644 --- a/runescape-client/src/main/java/class189.java +++ b/runescape-client/src/main/java/class189.java @@ -1,574 +1,1279 @@ -import java.io.ByteArrayInputStream; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; -import java.io.InvalidClassException; -import java.io.ObjectInputStream; -import java.io.OptionalDataException; -import java.io.StreamCorruptedException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.Reflection; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("gi") +@ObfuscatedName("gf") public class class189 { - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "[Lmm;" + @ObfuscatedName("c") + @ObfuscatedGetter( + intValue = 2129560759 ) - @Export("JagexCache_idxFiles") - public static BufferedFile[] JagexCache_idxFiles; - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Lkf;I)V", - garbageValue = "-1032758603" + @Export("musicTrackGroupId") + public static int musicTrackGroupId; + @ObfuscatedName("j") + @ObfuscatedGetter( + intValue = -552919085 ) - @Export("performReflectionCheck") - public static void performReflectionCheck(PacketBuffer var0) { - ReflectionCheck var1 = (ReflectionCheck)class96.reflectionChecks.last(); - if (var1 != null) { - int var2 = var0.offset; - var0.writeInt(var1.id); + @Export("cacheGamebuild") + static int cacheGamebuild; - for (int var3 = 0; var3 < var1.size; ++var3) { - if (var1.creationErrors[var3] != 0) { - var0.writeByte(var1.creationErrors[var3]); - } else { - try { - int var4 = var1.operations[var3]; - Field var5; - int var6; - if (var4 == 0) { - var5 = var1.fields[var3]; - var6 = Reflection.getInt(var5, (Object)null); - var0.writeByte(0); - var0.writeInt(var6); - } else if (var4 == 1) { - var5 = var1.fields[var3]; - Reflection.setInt(var5, (Object)null, var1.intReplaceValues[var3]); - var0.writeByte(0); - } else if (var4 == 2) { - var5 = var1.fields[var3]; - var6 = var5.getModifiers(); - var0.writeByte(0); - var0.writeInt(var6); + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(Lbg;I)V", + garbageValue = "-1848275879" + ) + @Export("doCycleTitle") + static void doCycleTitle(GameShell var0) { + int var4; + if (Login.worldSelectOpen) { + while (true) { + if (!class237.isKeyDown()) { + if (MouseHandler.MouseHandler_lastButton != 1 && (WorldMapLabelSize.mouseCam || MouseHandler.MouseHandler_lastButton != 4)) { + break; + } + + int var1 = Login.xPadding + 280; + if (MouseHandler.MouseHandler_lastPressedX >= var1 && MouseHandler.MouseHandler_lastPressedX <= var1 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(0, 0); + break; + } + + if (MouseHandler.MouseHandler_lastPressedX >= var1 + 15 && MouseHandler.MouseHandler_lastPressedX <= var1 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(0, 1); + break; + } + + int var2 = Login.xPadding + 390; + if (MouseHandler.MouseHandler_lastPressedX >= var2 && MouseHandler.MouseHandler_lastPressedX <= var2 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(1, 0); + break; + } + + if (MouseHandler.MouseHandler_lastPressedX >= var2 + 15 && MouseHandler.MouseHandler_lastPressedX <= var2 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(1, 1); + break; + } + + int var25 = Login.xPadding + 500; + if (MouseHandler.MouseHandler_lastPressedX >= var25 && MouseHandler.MouseHandler_lastPressedX <= var25 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(2, 0); + break; + } + + if (MouseHandler.MouseHandler_lastPressedX >= var25 + 15 && MouseHandler.MouseHandler_lastPressedX <= var25 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(2, 1); + break; + } + + var4 = Login.xPadding + 610; + if (MouseHandler.MouseHandler_lastPressedX >= var4 && MouseHandler.MouseHandler_lastPressedX <= var4 + 14 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(3, 0); + break; + } + + if (MouseHandler.MouseHandler_lastPressedX >= var4 + 15 && MouseHandler.MouseHandler_lastPressedX <= var4 + 80 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedY <= 18) { + UrlRequester.changeWorldSelectSorting(3, 1); + break; + } + + if (MouseHandler.MouseHandler_lastPressedX >= Login.xPadding + 708 && MouseHandler.MouseHandler_lastPressedY >= 4 && MouseHandler.MouseHandler_lastPressedX <= Login.xPadding + 708 + 50 && MouseHandler.MouseHandler_lastPressedY <= 20) { + Login.worldSelectOpen = false; + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + FontName.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + Tiles.logoSprite.drawAt(Login.xPadding + 382 - Tiles.logoSprite.subWidth / 2, 18); + break; + } + + if (Login.hoveredWorldIndex != -1) { + World var5 = Username.World_worlds[Login.hoveredWorldIndex]; + MouseRecorder.changeWorld(var5); + Login.worldSelectOpen = false; + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + FontName.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + Tiles.logoSprite.drawAt(Login.xPadding + 382 - Tiles.logoSprite.subWidth / 2, 18); + } else { + if (Login.worldSelectPage > 0 && class288.worldSelectLeftSprite != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= class288.worldSelectLeftSprite.subWidth && MouseHandler.MouseHandler_lastPressedY >= FloorUnderlayDefinition.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= FloorUnderlayDefinition.canvasHeight / 2 + 50) { + --Login.worldSelectPage; } - Method var25; - if (var4 != 3) { - if (var4 == 4) { - var25 = var1.methods[var3]; - var6 = var25.getModifiers(); - var0.writeByte(0); - var0.writeInt(var6); + if (Login.worldSelectPage < Login.worldSelectPagesCount && WorldMapSection2.worldSelectRightSprite != null && MouseHandler.MouseHandler_lastPressedX >= class286.canvasWidth - WorldMapSection2.worldSelectRightSprite.subWidth - 5 && MouseHandler.MouseHandler_lastPressedX <= class286.canvasWidth && MouseHandler.MouseHandler_lastPressedY >= FloorUnderlayDefinition.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= FloorUnderlayDefinition.canvasHeight / 2 + 50) { + ++Login.worldSelectPage; + } + } + break; + } + + if (WorldMapLabel.field229 == 13) { + Login.worldSelectOpen = false; + Login.leftTitleSprite.drawAt(Login.xPadding, 0); + FontName.rightTitleSprite.drawAt(Login.xPadding + 382, 0); + Tiles.logoSprite.drawAt(Login.xPadding + 382 - Tiles.logoSprite.subWidth / 2, 18); + break; + } + + if (WorldMapLabel.field229 == 96) { + if (Login.worldSelectPage > 0 && class288.worldSelectLeftSprite != null) { + --Login.worldSelectPage; + } + } else if (WorldMapLabel.field229 == 97 && Login.worldSelectPage < Login.worldSelectPagesCount && WorldMapSection2.worldSelectRightSprite != null) { + ++Login.worldSelectPage; + } + } + + } else { + if ((MouseHandler.MouseHandler_lastButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_lastButton == 4) && MouseHandler.MouseHandler_lastPressedX >= Login.xPadding + 765 - 50 && MouseHandler.MouseHandler_lastPressedY >= 453) { + ScriptEvent.clientPreferences.titleMusicDisabled = !ScriptEvent.clientPreferences.titleMusicDisabled; + HitSplatDefinition.savePreferences(); + if (!ScriptEvent.clientPreferences.titleMusicDisabled) { + WorldMapRectangle.method330(class216.archive6, "scape main", "", 255, false); + } else { + ReflectionCheck.method2438(); + } + } + + if (Client.gameState != 5) { + if (Login.field1185 == -1L) { + Login.field1185 = PlayerAppearance.currentTimeMillis() + 1000L; + } + + long var16 = PlayerAppearance.currentTimeMillis(); + boolean var3; + if (Client.archiveLoaders != null && Client.archiveLoadersDone < Client.archiveLoaders.size()) { + while (true) { + if (Client.archiveLoadersDone >= Client.archiveLoaders.size()) { + var3 = true; + break; + } + + ArchiveLoader var18 = (ArchiveLoader)Client.archiveLoaders.get(Client.archiveLoadersDone); + if (!var18.isLoaded()) { + var3 = false; + break; + } + + ++Client.archiveLoadersDone; + } + } else { + var3 = true; + } + + if (var3 && Login.field1186 == -1L) { + Login.field1186 = var16; + if (Login.field1186 > Login.field1185) { + Login.field1185 = Login.field1186; + } + } + + if (Client.gameState == 10 || Client.gameState == 11) { + if (WorldMapSection1.clientLanguage == Language.Language_EN) { + if (MouseHandler.MouseHandler_lastButton == 1 || !WorldMapLabelSize.mouseCam && MouseHandler.MouseHandler_lastButton == 4) { + var4 = Login.xPadding + 5; + short var19 = 463; + byte var6 = 100; + byte var7 = 35; + if (MouseHandler.MouseHandler_lastPressedX >= var4 && MouseHandler.MouseHandler_lastPressedX <= var6 + var4 && MouseHandler.MouseHandler_lastPressedY >= var19 && MouseHandler.MouseHandler_lastPressedY <= var19 + var7) { + AttackOption.method2215(); + return; + } + } + + if (class96.World_request != null) { + AttackOption.method2215(); + } + } + + var4 = MouseHandler.MouseHandler_lastButton; + int var32 = MouseHandler.MouseHandler_lastPressedX; + int var26 = MouseHandler.MouseHandler_lastPressedY; + if (var4 == 0) { + var32 = MouseHandler.MouseHandler_x; + var26 = MouseHandler.MouseHandler_y; + } + + if (!WorldMapLabelSize.mouseCam && var4 == 4) { + var4 = 1; + } + + short var29; + int var30; + if (Login.loginIndex == 0) { + boolean var31 = false; + + while (class237.isKeyDown()) { + if (WorldMapLabel.field229 == 84) { + var31 = true; + } + } + + var30 = class192.loginBoxCenter - 80; + var29 = 291; + if (var4 == 1 && var32 >= var30 - 75 && var32 <= var30 + 75 && var26 >= var29 - 20 && var26 <= var29 + 20) { + class2.openURL(WorldMapElement.method4547("secure", true) + "m=account-creation/g=oldscape/create_account_funnel.ws", true, false); + } + + var30 = class192.loginBoxCenter + 80; + if (var4 == 1 && var32 >= var30 - 75 && var32 <= var30 + 75 && var26 >= var29 - 20 && var26 <= var29 + 20 || var31) { + if ((Client.worldProperties & 33554432) != 0) { + Login.Login_response0 = ""; + Login.Login_response1 = "This is a Beta world."; + Login.Login_response2 = "Your normal account will not be affected."; + Login.Login_response3 = ""; + Login.loginIndex = 1; + if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { + Login.currentLoginField = 1; + } else { + Login.currentLoginField = 0; + } + } else if ((Client.worldProperties & 4) != 0) { + if ((Client.worldProperties & 1024) != 0) { + Login.Login_response1 = "This is a High Risk PvP world."; + Login.Login_response2 = "Players can attack each other almost everywhere"; + Login.Login_response3 = "and the Protect Item prayer won't work."; + } else { + Login.Login_response1 = "This is a PvP world."; + Login.Login_response2 = "Players can attack each other"; + Login.Login_response3 = "almost everywhere."; + } + + Login.Login_response0 = "Warning!"; + Login.loginIndex = 1; + if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { + Login.currentLoginField = 1; + } else { + Login.currentLoginField = 0; + } + } else if ((Client.worldProperties & 1024) != 0) { + Login.Login_response1 = "This is a High Risk world."; + Login.Login_response2 = "The Protect Item prayer will"; + Login.Login_response3 = "not work on this world."; + Login.Login_response0 = "Warning!"; + Login.loginIndex = 1; + if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { + Login.currentLoginField = 1; + } else { + Login.currentLoginField = 0; + } + } else { + UserComparator3.Login_promptCredentials(false); + } + } + } else { + short var8; + int var27; + if (Login.loginIndex == 1) { + while (true) { + if (!class237.isKeyDown()) { + var27 = class192.loginBoxCenter - 80; + var8 = 321; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + UserComparator3.Login_promptCredentials(false); + } + + var27 = class192.loginBoxCenter + 80; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + Login.loginIndex = 0; + } + break; + } + + if (WorldMapLabel.field229 == 84) { + UserComparator3.Login_promptCredentials(false); + } else if (WorldMapLabel.field229 == 13) { + Login.loginIndex = 0; + } } } else { - var25 = var1.methods[var3]; - byte[][] var10 = var1.arguments[var3]; - Object[] var7 = new Object[var10.length]; + short var28; + if (Login.loginIndex == 2) { + var28 = 201; + var27 = var28 + 52; + if (var4 == 1 && var26 >= var27 - 12 && var26 < var27 + 2) { + Login.currentLoginField = 0; + } - for (int var8 = 0; var8 < var10.length; ++var8) { - ObjectInputStream var9 = new ObjectInputStream(new ByteArrayInputStream(var10[var8])); - var7[var8] = var9.readObject(); - } + var27 += 15; + if (var4 == 1 && var26 >= var27 - 12 && var26 < var27 + 2) { + Login.currentLoginField = 1; + } - Object var11 = Reflection.invoke(var25, (Object)null, var7); - if (var11 == null) { - var0.writeByte(0); - } else if (var11 instanceof Number) { - var0.writeByte(1); - var0.writeLong(((Number)var11).longValue()); - } else if (var11 instanceof String) { - var0.writeByte(2); - var0.writeStringCp1252NullTerminated((String)var11); + var27 += 15; + var28 = 361; + if (WorldMapLabel.field225 != null) { + var30 = WorldMapLabel.field225.highX / 2; + if (var4 == 1 && var32 >= WorldMapLabel.field225.lowX - var30 && var32 <= var30 + WorldMapLabel.field225.lowX && var26 >= var28 - 15 && var26 < var28) { + switch(Login.field1166) { + case 1: + GrandExchangeOffer.setLoginResponseString("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); + Login.loginIndex = 5; + return; + case 2: + class2.openURL("https://support.runescape.com/hc/en-gb", true, false); + } + } + } + + var30 = class192.loginBoxCenter - 80; + var29 = 321; + if (var4 == 1 && var32 >= var30 - 75 && var32 <= var30 + 75 && var26 >= var29 - 20 && var26 <= var29 + 20) { + Login.Login_username = Login.Login_username.trim(); + if (Login.Login_username.length() == 0) { + GrandExchangeOffer.setLoginResponseString("", "Please enter your username/email address.", ""); + return; + } + + if (Login.Login_password.length() == 0) { + GrandExchangeOffer.setLoginResponseString("", "Please enter your password.", ""); + return; + } + + GrandExchangeOffer.setLoginResponseString("", "Connecting to server...", ""); + WorldMapLabelSize.method235(false); + Tile.updateGameState(20); + return; + } + + var30 = Login.loginBoxX + 180 + 80; + if (var4 == 1 && var32 >= var30 - 75 && var32 <= var30 + 75 && var26 >= var29 - 20 && var26 <= var29 + 20) { + Login.loginIndex = 0; + Login.Login_username = ""; + Login.Login_password = ""; + Huffman.field2491 = 0; + class268.otp = ""; + Login.field1177 = true; + } + + var30 = class192.loginBoxCenter + -117; + var29 = 277; + Login.field1159 = var32 >= var30 && var32 < var30 + Login.field1174 && var26 >= var29 && var26 < var29 + Language.field2328; + if (var4 == 1 && Login.field1159) { + Client.Login_isUsernameRemembered = !Client.Login_isUsernameRemembered; + if (!Client.Login_isUsernameRemembered && ScriptEvent.clientPreferences.rememberedUsername != null) { + ScriptEvent.clientPreferences.rememberedUsername = null; + HitSplatDefinition.savePreferences(); + } + } + + var30 = class192.loginBoxCenter + 24; + var29 = 277; + Login.field1175 = var32 >= var30 && var32 < var30 + Login.field1174 && var26 >= var29 && var26 < var29 + Language.field2328; + if (var4 == 1 && Login.field1175) { + ScriptEvent.clientPreferences.hideUsername = !ScriptEvent.clientPreferences.hideUsername; + if (!ScriptEvent.clientPreferences.hideUsername) { + Login.Login_username = ""; + ScriptEvent.clientPreferences.rememberedUsername = null; + if (Client.Login_isUsernameRemembered && Login.Login_username != null && Login.Login_username.length() > 0) { + Login.currentLoginField = 1; + } else { + Login.currentLoginField = 0; + } + } + + HitSplatDefinition.savePreferences(); + } + + while (true) { + Transferable var11; + int var12; + do { + while (true) { + label1121: + do { + while (true) { + while (class237.isKeyDown()) { + if (WorldMapLabel.field229 != 13) { + if (Login.currentLoginField != 0) { + continue label1121; + } + + WorldMapAreaData.method755(DevicePcmPlayerProvider.field395); + if (WorldMapLabel.field229 == 85 && Login.Login_username.length() > 0) { + Login.Login_username = Login.Login_username.substring(0, Login.Login_username.length() - 1); + } + + if (WorldMapLabel.field229 == 84 || WorldMapLabel.field229 == 80) { + Login.currentLoginField = 1; + } + + if (AbstractWorldMapIcon.method679(DevicePcmPlayerProvider.field395) && Login.Login_username.length() < 320) { + Login.Login_username = Login.Login_username + DevicePcmPlayerProvider.field395; + } + } else { + Login.loginIndex = 0; + Login.Login_username = ""; + Login.Login_password = ""; + Huffman.field2491 = 0; + class268.otp = ""; + Login.field1177 = true; + } + } + + return; + } + } while(Login.currentLoginField != 1); + + if (WorldMapLabel.field229 == 85 && Login.Login_password.length() > 0) { + Login.Login_password = Login.Login_password.substring(0, Login.Login_password.length() - 1); + } else if (WorldMapLabel.field229 == 84 || WorldMapLabel.field229 == 80) { + Login.currentLoginField = 0; + if (WorldMapLabel.field229 == 84) { + Login.Login_username = Login.Login_username.trim(); + if (Login.Login_username.length() == 0) { + GrandExchangeOffer.setLoginResponseString("", "Please enter your username/email address.", ""); + return; + } + + if (Login.Login_password.length() == 0) { + GrandExchangeOffer.setLoginResponseString("", "Please enter your password.", ""); + return; + } + + GrandExchangeOffer.setLoginResponseString("", "Connecting to server...", ""); + WorldMapLabelSize.method235(false); + Tile.updateGameState(20); + return; + } + } + + if ((KeyHandler.KeyHandler_pressedKeys[82] || KeyHandler.KeyHandler_pressedKeys[87]) && WorldMapLabel.field229 == 67) { + Clipboard var10 = Toolkit.getDefaultToolkit().getSystemClipboard(); + var11 = var10.getContents(WorldMapID.client); + var12 = 20 - Login.Login_password.length(); + break; + } + + if (PcmPlayer.method2639(DevicePcmPlayerProvider.field395) && AbstractWorldMapIcon.method679(DevicePcmPlayerProvider.field395) && Login.Login_password.length() < 20) { + Login.Login_password = Login.Login_password + DevicePcmPlayerProvider.field395; + } + } + } while(var12 <= 0); + + try { + String var13 = (String)var11.getTransferData(DataFlavor.stringFlavor); + int var14 = Math.min(var12, var13.length()); + + for (int var15 = 0; var15 < var14; ++var15) { + if (!PcmPlayer.method2639(var13.charAt(var15)) || !AbstractWorldMapIcon.method679(var13.charAt(var15))) { + Login.loginIndex = 3; + return; + } + } + + Login.Login_password = Login.Login_password + var13.substring(0, var14); + } catch (UnsupportedFlavorException var23) { + } catch (IOException var24) { + } + } + } else if (Login.loginIndex == 3) { + var27 = Login.loginBoxX + 180; + var8 = 276; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + UserComparator3.Login_promptCredentials(false); + } + + var27 = Login.loginBoxX + 180; + var8 = 326; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + GrandExchangeOffer.setLoginResponseString("Please enter your username.", "If you created your account after November", "2010, this will be the creation email address."); + Login.loginIndex = 5; + return; + } } else { - var0.writeByte(4); - } - } - } catch (ClassNotFoundException var13) { - var0.writeByte(-10); - } catch (InvalidClassException var14) { - var0.writeByte(-11); - } catch (StreamCorruptedException var15) { - var0.writeByte(-12); - } catch (OptionalDataException var16) { - var0.writeByte(-13); - } catch (IllegalAccessException var17) { - var0.writeByte(-14); - } catch (IllegalArgumentException var18) { - var0.writeByte(-15); - } catch (InvocationTargetException var19) { - var0.writeByte(-16); - } catch (SecurityException var20) { - var0.writeByte(-17); - } catch (IOException var21) { - var0.writeByte(-18); - } catch (NullPointerException var22) { - var0.writeByte(-19); - } catch (Exception var23) { - var0.writeByte(-20); - } catch (Throwable var24) { - var0.writeByte(-21); - } - } - } + int var20; + if (Login.loginIndex == 4) { + var27 = Login.loginBoxX + 180 - 80; + var8 = 321; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + class268.otp.trim(); + if (class268.otp.length() != 6) { + GrandExchangeOffer.setLoginResponseString("", "Please enter a 6-digit PIN.", ""); + return; + } - var0.writeCrc(var2); - var1.remove(); - } - } + Huffman.field2491 = Integer.parseInt(class268.otp); + class268.otp = ""; + WorldMapLabelSize.method235(true); + GrandExchangeOffer.setLoginResponseString("", "Connecting to server...", ""); + Tile.updateGameState(20); + return; + } - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "(IIIS)I", - garbageValue = "22050" - ) - static int method3612(int var0, int var1, int var2) { - if ((Tiles.Tiles_renderFlags[var0][var1][var2] & 8) != 0) { - return 0; - } else { - return var0 > 0 && (Tiles.Tiles_renderFlags[1][var1][var2] & 2) != 0 ? var0 - 1 : var0; - } - } + if (var4 == 1 && var32 >= Login.loginBoxX + 180 - 9 && var32 <= Login.loginBoxX + 180 + 130 && var26 >= 263 && var26 <= 296) { + Login.field1177 = !Login.field1177; + } - @ObfuscatedName("e") - @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "-1300861116" - ) - public static int method3615(int var0) { - if (var0 > 0) { - return 1; - } else { - return var0 < 0 ? -1 : 0; - } - } + if (var4 == 1 && var32 >= Login.loginBoxX + 180 - 34 && var32 <= Login.loginBoxX + 34 + 180 && var26 >= 351 && var26 <= 363) { + class2.openURL(WorldMapElement.method4547("secure", true) + "m=totp-authenticator/disableTOTPRequest", true, false); + } - @ObfuscatedName("eu") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-615502292" - ) - @Export("load") - static void load() { - int var0; - if (Client.titleLoadingStage == 0) { - PacketWriter.scene = new Scene(4, 104, 104, Tiles.Tiles_heights); + var27 = Login.loginBoxX + 180 + 80; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + Login.loginIndex = 0; + Login.Login_username = ""; + Login.Login_password = ""; + Huffman.field2491 = 0; + class268.otp = ""; + } - for (var0 = 0; var0 < 4; ++var0) { - Client.collisionMaps[var0] = new CollisionMap(104, 104); - } + while (class237.isKeyDown()) { + boolean var9 = false; - ObjectSound.sceneMinimapSprite = new Sprite(512, 512); - Login.Login_loadingText = "Starting game engine..."; - Login.Login_loadingPercent = 5; - Client.titleLoadingStage = 20; - } else if (Client.titleLoadingStage == 20) { - Login.Login_loadingText = "Prepared visibility map"; - Login.Login_loadingPercent = 10; - Client.titleLoadingStage = 30; - } else if (Client.titleLoadingStage == 30) { - class1.archive0 = AttackOption.newArchive(0, false, true, true); - WorldMapLabelSize.archive1 = AttackOption.newArchive(1, false, true, true); - FaceNormal.archive2 = AttackOption.newArchive(2, true, false, true); - BoundaryObject.archive3 = AttackOption.newArchive(3, false, true, true); - GrandExchangeOfferAgeComparator.archive4 = AttackOption.newArchive(4, false, true, true); - class3.archive5 = AttackOption.newArchive(5, true, true, true); - class225.archive6 = AttackOption.newArchive(6, true, true, true); - Language.archive7 = AttackOption.newArchive(7, false, true, true); - GrandExchangeOfferAgeComparator.archive8 = AttackOption.newArchive(8, false, true, true); - AttackOption.archive9 = AttackOption.newArchive(9, false, true, true); - Client.archive10 = AttackOption.newArchive(10, false, true, true); - ClanMate.archive11 = AttackOption.newArchive(11, false, true, true); - GrandExchangeOfferOwnWorldComparator.archive12 = AttackOption.newArchive(12, false, true, true); - Tile.archive13 = AttackOption.newArchive(13, true, false, true); - WorldMapData_1.archive14 = AttackOption.newArchive(14, false, true, true); - Script.archive15 = AttackOption.newArchive(15, false, true, true); - Client.archive17 = AttackOption.newArchive(17, true, true, true); - VarcInt.archive18 = AttackOption.newArchive(18, false, true, true); - WorldMapLabel.archive19 = AttackOption.newArchive(19, false, true, true); - WorldMapEvent.archive20 = AttackOption.newArchive(20, false, true, true); - Login.Login_loadingText = "Connecting to update server"; - Login.Login_loadingPercent = 20; - Client.titleLoadingStage = 40; - } else if (Client.titleLoadingStage == 40) { - byte var28 = 0; - var0 = var28 + class1.archive0.percentage() * 4 / 100; - var0 += WorldMapLabelSize.archive1.percentage() * 4 / 100; - var0 += FaceNormal.archive2.percentage() * 2 / 100; - var0 += BoundaryObject.archive3.percentage() * 2 / 100; - var0 += GrandExchangeOfferAgeComparator.archive4.percentage() * 6 / 100; - var0 += class3.archive5.percentage() * 4 / 100; - var0 += class225.archive6.percentage() * 2 / 100; - var0 += Language.archive7.percentage() * 56 / 100; - var0 += GrandExchangeOfferAgeComparator.archive8.percentage() * 2 / 100; - var0 += AttackOption.archive9.percentage() * 2 / 100; - var0 += Client.archive10.percentage() * 2 / 100; - var0 += ClanMate.archive11.percentage() * 2 / 100; - var0 += GrandExchangeOfferOwnWorldComparator.archive12.percentage() * 2 / 100; - var0 += Tile.archive13.percentage() * 2 / 100; - var0 += WorldMapData_1.archive14.percentage() * 2 / 100; - var0 += Script.archive15.percentage() * 2 / 100; - var0 += WorldMapLabel.archive19.percentage() / 100; - var0 += VarcInt.archive18.percentage() / 100; - var0 += WorldMapEvent.archive20.percentage() / 100; - var0 += Client.archive17.method4235() && Client.archive17.isFullyLoaded() ? 1 : 0; - if (var0 != 100) { - if (var0 != 0) { - Login.Login_loadingText = "Checking for updates - " + var0 + "%"; - } + for (var20 = 0; var20 < "1234567890".length(); ++var20) { + if (DevicePcmPlayerProvider.field395 == "1234567890".charAt(var20)) { + var9 = true; + break; + } + } - Login.Login_loadingPercent = 30; - } else { - WorldMapAreaData.method718(class1.archive0, "Animations"); - WorldMapAreaData.method718(WorldMapLabelSize.archive1, "Skeletons"); - WorldMapAreaData.method718(GrandExchangeOfferAgeComparator.archive4, "Sound FX"); - WorldMapAreaData.method718(class3.archive5, "Maps"); - WorldMapAreaData.method718(class225.archive6, "Music Tracks"); - WorldMapAreaData.method718(Language.archive7, "Models"); - WorldMapAreaData.method718(GrandExchangeOfferAgeComparator.archive8, "Sprites"); - WorldMapAreaData.method718(ClanMate.archive11, "Music Jingles"); - WorldMapAreaData.method718(WorldMapData_1.archive14, "Music Samples"); - WorldMapAreaData.method718(Script.archive15, "Music Patches"); - WorldMapAreaData.method718(WorldMapLabel.archive19, "World Map"); - WorldMapAreaData.method718(VarcInt.archive18, "World Map Geography"); - WorldMapAreaData.method718(WorldMapEvent.archive20, "World Map Ground"); - WorldMapData_0.spriteIds = new GraphicsDefaults(); - WorldMapData_0.spriteIds.decode(Client.archive17); - Login.Login_loadingText = "Loaded update list"; - Login.Login_loadingPercent = 30; - Client.titleLoadingStage = 45; - } - } else { - Archive var2; - Archive var3; - Archive var4; - if (Client.titleLoadingStage == 45) { - boolean var27 = !Client.isLowDetail; - UrlRequest.PcmPlayer_sampleRate = 22050; - PcmPlayer.PcmPlayer_stereo = var27; - MenuAction.PcmPlayer_count = 2; - MidiPcmStream var26 = new MidiPcmStream(); - var26.method3746(9, 128); - class219.pcmPlayer0 = GrandExchangeOfferNameComparator.method151(GameShell.taskHandler, 0, 22050); - class219.pcmPlayer0.setStream(var26); - var2 = Script.archive15; - var3 = WorldMapData_1.archive14; - var4 = GrandExchangeOfferAgeComparator.archive4; - class197.musicPatchesArchive = var2; - SecureRandomCallable.musicSamplesArchive = var3; - class197.soundEffectsArchive = var4; - class49.midiPcmStream = var26; - GrandExchangeOfferWorldComparator.pcmPlayer1 = GrandExchangeOfferNameComparator.method151(GameShell.taskHandler, 1, 2048); - WorldMapLabelSize.pcmStreamMixer = new PcmStreamMixer(); - GrandExchangeOfferWorldComparator.pcmPlayer1.setStream(WorldMapLabelSize.pcmStreamMixer); - Interpreter.decimator = new Decimator(22050, UrlRequest.PcmPlayer_sampleRate); - Login.Login_loadingText = "Prepared sound engine"; - Login.Login_loadingPercent = 35; - Client.titleLoadingStage = 50; - UserComparator7.WorldMapElement_fonts = new Fonts(GrandExchangeOfferAgeComparator.archive8, Tile.archive13); - } else if (Client.titleLoadingStage == 50) { - var0 = FontName.method5272().length; - Client.fontsMap = UserComparator7.WorldMapElement_fonts.createMap(FontName.method5272()); - if (Client.fontsMap.size() < var0) { - Login.Login_loadingText = "Loading fonts - " + Client.fontsMap.size() * 100 / var0 + "%"; - Login.Login_loadingPercent = 40; - } else { - GrandExchangeOfferOwnWorldComparator.fontPlain11 = (Font)Client.fontsMap.get(FontName.FontName_plain11); - GraphicsDefaults.fontPlain12 = (Font)Client.fontsMap.get(FontName.FontName_plain12); - class173.fontBold12 = (Font)Client.fontsMap.get(FontName.FontName_bold12); - class269.platformInfo = Client.platformInfoProvider.get(); - Login.Login_loadingText = "Loaded fonts"; - Login.Login_loadingPercent = 40; - Client.titleLoadingStage = 60; - } - } else { - Archive var1; - int var20; - if (Client.titleLoadingStage == 60) { - var1 = Client.archive10; - var2 = GrandExchangeOfferAgeComparator.archive8; - var20 = 0; - if (var1.tryLoadFileByNames("title.jpg", "")) { - ++var20; - } + if (WorldMapLabel.field229 == 13) { + Login.loginIndex = 0; + Login.Login_username = ""; + Login.Login_password = ""; + Huffman.field2491 = 0; + class268.otp = ""; + } else { + if (WorldMapLabel.field229 == 85 && class268.otp.length() > 0) { + class268.otp = class268.otp.substring(0, class268.otp.length() - 1); + } - if (var2.tryLoadFileByNames("logo", "")) { - ++var20; - } + if (WorldMapLabel.field229 == 84) { + class268.otp.trim(); + if (class268.otp.length() != 6) { + GrandExchangeOffer.setLoginResponseString("", "Please enter a 6-digit PIN.", ""); + return; + } - if (var2.tryLoadFileByNames("logo_deadman_mode", "")) { - ++var20; - } + Huffman.field2491 = Integer.parseInt(class268.otp); + class268.otp = ""; + WorldMapLabelSize.method235(true); + GrandExchangeOffer.setLoginResponseString("", "Connecting to server...", ""); + Tile.updateGameState(20); + return; + } - if (var2.tryLoadFileByNames("titlebox", "")) { - ++var20; - } + if (var9 && class268.otp.length() < 6) { + class268.otp = class268.otp + DevicePcmPlayerProvider.field395; + } + } + } + } else if (Login.loginIndex == 5) { + var27 = Login.loginBoxX + 180 - 80; + var8 = 321; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + ClientPacket.method3764(); + return; + } - if (var2.tryLoadFileByNames("titlebutton", "")) { - ++var20; - } + var27 = Login.loginBoxX + 180 + 80; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + UserComparator3.Login_promptCredentials(true); + } - if (var2.tryLoadFileByNames("runes", "")) { - ++var20; - } + var29 = 361; + if (WorldMapManager.field319 != null) { + var20 = WorldMapManager.field319.highX / 2; + if (var4 == 1 && var32 >= WorldMapManager.field319.lowX - var20 && var32 <= var20 + WorldMapManager.field319.lowX && var26 >= var29 - 15 && var26 < var29) { + class2.openURL(WorldMapElement.method4547("secure", true) + "m=weblogin/g=oldscape/cant_log_in", true, false); + } + } - if (var2.tryLoadFileByNames("title_mute", "")) { - ++var20; - } + while (class237.isKeyDown()) { + boolean var33 = false; - if (var2.tryLoadFileByNames("options_radio_buttons,0", "")) { - ++var20; - } + for (int var21 = 0; var21 < "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".length(); ++var21) { + if (DevicePcmPlayerProvider.field395 == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"£$%^&*()-_=+[{]};:'@#~,<.>/?\\| ".charAt(var21)) { + var33 = true; + break; + } + } - if (var2.tryLoadFileByNames("options_radio_buttons,2", "")) { - ++var20; - } + if (WorldMapLabel.field229 == 13) { + UserComparator3.Login_promptCredentials(true); + } else { + if (WorldMapLabel.field229 == 85 && Login.Login_username.length() > 0) { + Login.Login_username = Login.Login_username.substring(0, Login.Login_username.length() - 1); + } - if (var2.tryLoadFileByNames("options_radio_buttons,4", "")) { - ++var20; - } + if (WorldMapLabel.field229 == 84) { + ClientPacket.method3764(); + return; + } - if (var2.tryLoadFileByNames("options_radio_buttons,6", "")) { - ++var20; - } + if (var33 && Login.Login_username.length() < 320) { + Login.Login_username = Login.Login_username + DevicePcmPlayerProvider.field395; + } + } + } + } else if (Login.loginIndex != 6) { + if (Login.loginIndex == 7) { + var27 = Login.loginBoxX + 180 - 80; + var8 = 321; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + class2.openURL(WorldMapElement.method4547("secure", true) + "m=dob/set_dob.ws", true, false); + GrandExchangeOffer.setLoginResponseString("", "Page has opened in a new window.", "(Please check your popup blocker.)"); + Login.loginIndex = 6; + return; + } - var2.tryLoadFileByNames("sl_back", ""); - var2.tryLoadFileByNames("sl_flags", ""); - var2.tryLoadFileByNames("sl_arrows", ""); - var2.tryLoadFileByNames("sl_stars", ""); - var2.tryLoadFileByNames("sl_button", ""); - byte var29 = 11; - if (var20 < var29) { - Login.Login_loadingText = "Loading title screen - " + var20 * 100 / var29 + "%"; - Login.Login_loadingPercent = 50; - } else { - Login.Login_loadingText = "Loaded title screen"; - Login.Login_loadingPercent = 50; - MouseRecorder.updateGameState(5); - Client.titleLoadingStage = 70; - } - } else if (Client.titleLoadingStage == 70) { - if (!FaceNormal.archive2.isFullyLoaded()) { - Login.Login_loadingText = "Loading config - " + FaceNormal.archive2.loadPercent() + "%"; - Login.Login_loadingPercent = 60; - } else { - Archive var30 = FaceNormal.archive2; - FloorOverlayDefinition.FloorOverlayDefinition_archive = var30; - var1 = FaceNormal.archive2; - FloorUnderlayDefinition.FloorUnderlayDefinition_archive = var1; - var2 = FaceNormal.archive2; - var3 = Language.archive7; - KitDefinition.KitDefinition_archive = var2; - GrandExchangeOfferOwnWorldComparator.KitDefinition_modelsArchive = var3; - DevicePcmPlayerProvider.KitDefinition_fileCount = KitDefinition.KitDefinition_archive.getGroupFileCount(3); - var4 = FaceNormal.archive2; - Archive var23 = Language.archive7; - boolean var6 = Client.isLowDetail; - ObjectDefinition.ObjectDefinition_archive = var4; - ObjectDefinition.ObjectDefinition_modelsArchive = var23; - ObjectDefinition.ObjectDefinition_isLowDetail = var6; - Archive var7 = FaceNormal.archive2; - Archive var8 = Language.archive7; - NPCDefinition.NpcDefinition_archive = var7; - NPCDefinition.NpcDefinition_modelArchive = var8; - Archive var9 = FaceNormal.archive2; - StructDefinition.StructDefinition_archive = var9; - WorldMapSection1.method608(FaceNormal.archive2, Language.archive7, Client.isMembersWorld, GrandExchangeOfferOwnWorldComparator.fontPlain11); - ItemContainer.method1190(FaceNormal.archive2, class1.archive0, WorldMapLabelSize.archive1); - Archive var10 = FaceNormal.archive2; - Archive var11 = Language.archive7; - class14.SpotAnimationDefinition_archive = var10; - SpotAnimationDefinition.SpotAnimationDefinition_modelArchive = var11; - GrandExchangeOfferNameComparator.method153(FaceNormal.archive2); - Archive var12 = FaceNormal.archive2; - VarpDefinition.VarpDefinition_archive = var12; - VarpDefinition.VarpDefinition_fileCount = VarpDefinition.VarpDefinition_archive.getGroupFileCount(16); - MouseRecorder.Widget_setArchives(BoundaryObject.archive3, Language.archive7, GrandExchangeOfferAgeComparator.archive8, Tile.archive13); - KeyHandler.InvDefinition_setArchives(FaceNormal.archive2); - Archive var13 = FaceNormal.archive2; - EnumDefinition.EnumDefinition_archive = var13; - Archive var14 = FaceNormal.archive2; - VarcInt.VarcInt_archive = var14; - Archive var15 = FaceNormal.archive2; - ParamDefinition.ParamDefinition_archive = var15; - class197.varcs = new Varcs(); - WorldMapArea.method430(FaceNormal.archive2, GrandExchangeOfferAgeComparator.archive8, Tile.archive13); - ScriptFrame.method1157(FaceNormal.archive2, GrandExchangeOfferAgeComparator.archive8); - Archive var16 = FaceNormal.archive2; - Archive var17 = GrandExchangeOfferAgeComparator.archive8; - WorldMapElement.WorldMapElement_archive = var17; - if (var16.isFullyLoaded()) { - WorldMapElement.WorldMapElement_count = var16.getGroupFileCount(35); - WorldMapElement.WorldMapElement_cached = new WorldMapElement[WorldMapElement.WorldMapElement_count]; + var27 = Login.loginBoxX + 180 + 80; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + UserComparator3.Login_promptCredentials(true); + } + } else if (Login.loginIndex == 8) { + var27 = Login.loginBoxX + 180 - 80; + var8 = 321; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + class2.openURL("https://www.jagex.com/terms/privacy/#eight", true, false); + GrandExchangeOffer.setLoginResponseString("", "Page has opened in a new window.", "(Please check your popup blocker.)"); + Login.loginIndex = 6; + return; + } - for (int var18 = 0; var18 < WorldMapElement.WorldMapElement_count; ++var18) { - byte[] var19 = var16.takeFile(35, var18); - WorldMapElement.WorldMapElement_cached[var18] = new WorldMapElement(var18); - if (var19 != null) { - WorldMapElement.WorldMapElement_cached[var18].decode(new Buffer(var19)); - WorldMapElement.WorldMapElement_cached[var18].method4350(); + var27 = Login.loginBoxX + 180 + 80; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + UserComparator3.Login_promptCredentials(true); + } + } else if (Login.loginIndex == 12) { + String var22 = ""; + switch(Login.field1156) { + case 0: + var22 = "https://support.runescape.com/hc/en-gb/articles/115002238729-Account-Bans"; + break; + case 1: + var22 = "https://support.runescape.com/hc/en-gb/articles/206103939-My-account-is-locked"; + break; + default: + UserComparator3.Login_promptCredentials(false); + } + + var30 = Login.loginBoxX + 180; + var29 = 276; + if (var4 == 1 && var32 >= var30 - 75 && var32 <= var30 + 75 && var26 >= var29 - 20 && var26 <= var29 + 20) { + class2.openURL(var22, true, false); + GrandExchangeOffer.setLoginResponseString("", "Page has opened in a new window.", "(Please check your popup blocker.)"); + Login.loginIndex = 6; + return; + } + + var30 = Login.loginBoxX + 180; + var29 = 326; + if (var4 == 1 && var32 >= var30 - 75 && var32 <= var30 + 75 && var26 >= var29 - 20 && var26 <= var29 + 20) { + UserComparator3.Login_promptCredentials(false); + } + } else if (Login.loginIndex == 24) { + var27 = Login.loginBoxX + 180; + var8 = 301; + if (var4 == 1 && var32 >= var27 - 75 && var32 <= var27 + 75 && var26 >= var8 - 20 && var26 <= var8 + 20) { + UserComparator3.Login_promptCredentials(false); + } + } + } else { + while (true) { + do { + if (!class237.isKeyDown()) { + var28 = 321; + if (var4 == 1 && var26 >= var28 - 20 && var26 <= var28 + 20) { + UserComparator3.Login_promptCredentials(true); + } + + return; + } + } while(WorldMapLabel.field229 != 84 && WorldMapLabel.field229 != 13); + + UserComparator3.Login_promptCredentials(true); + } } } } - - Login.Login_loadingText = "Loaded config"; - Login.Login_loadingPercent = 60; - Client.titleLoadingStage = 80; - } - } else if (Client.titleLoadingStage == 80) { - var0 = 0; - if (AttackOption.compass == null) { - AttackOption.compass = NPCDefinition.SpriteBuffer_getSprite(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.compass, 0); - } else { - ++var0; } - if (PendingSpawn.redHintArrowSprite == null) { - PendingSpawn.redHintArrowSprite = NPCDefinition.SpriteBuffer_getSprite(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3797, 0); + } + } + } + } + + @ObfuscatedName("o") + @ObfuscatedSignature( + signature = "(Lkf;ILbj;IB)V", + garbageValue = "-76" + ) + static final void method3797(PacketBuffer var0, int var1, Player var2, int var3) { + byte var4 = -1; + int var5; + int var8; + int var9; + int var12; + if ((var3 & 128) != 0) { + var5 = var0.method5648(); + PlayerType var6 = (PlayerType)WorldMapIcon_1.findEnumerated(class51.PlayerType_values(), var0.method5639()); + boolean var7 = var0.readUnsignedByte() == 1; + var8 = var0.readUnsignedByte(); + var9 = var0.offset; + if (var2.username != null && var2.appearance != null) { + boolean var10 = false; + if (var6.isUser && PacketWriter.friendSystem.isIgnored(var2.username)) { + var10 = true; + } + + if (!var10 && Client.field745 == 0 && !var2.isHidden) { + Players.field1238.offset = 0; + var0.method5702(Players.field1238.array, 0, var8); + Players.field1238.offset = 0; + String var11 = AbstractFont.escapeBrackets(class222.method4274(class4.method90(Players.field1238))); + var2.overheadText = var11.trim(); + var2.overheadTextColor = var5 >> 8; + var2.overheadTextEffect = var5 & 255; + var2.overheadTextCyclesRemaining = 150; + var2.isAutoChatting = var7; + var2.field939 = var2 != class215.localPlayer && var6.isUser && "" != Client.field849 && var11.toLowerCase().indexOf(Client.field849) == -1; + if (var6.isPrivileged) { + var12 = var7 ? 91 : 1; } else { - ++var0; + var12 = var7 ? 90 : 2; } - if (class14.mapSceneSprites == null) { - class14.mapSceneSprites = class297.method5389(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.mapScenes, 0); + if (var6.modIcon != -1) { + class30.addGameMessage(var12, GrandExchangeEvent.method122(var6.modIcon) + var2.username.getName(), var11); } else { - ++var0; + class30.addGameMessage(var12, var2.username.getName(), var11); + } + } + } + + var0.offset = var9 + var8; + } + + int var13; + if ((var3 & 4) != 0) { + var5 = var0.readUnsignedShort(); + if (var5 == 65535) { + var5 = -1; + } + + var13 = var0.method5697(); + MouseRecorder.performPlayerAnimation(var2, var5, var13); + } + + if ((var3 & 16) != 0) { + var2.overheadText = var0.readStringCp1252NullTerminated(); + if (var2.overheadText.charAt(0) == '~') { + var2.overheadText = var2.overheadText.substring(1); + class30.addGameMessage(2, var2.username.getName(), var2.overheadText); + } else if (var2 == class215.localPlayer) { + class30.addGameMessage(2, var2.username.getName(), var2.overheadText); + } + + var2.isAutoChatting = false; + var2.overheadTextColor = 0; + var2.overheadTextEffect = 0; + var2.overheadTextCyclesRemaining = 150; + } + + if ((var3 & 2048) != 0) { + Players.field1228[var1] = var0.method5640(); + } + + if ((var3 & 32) != 0) { + var2.field934 = var0.method5648(); + if (var2.pathLength == 0) { + var2.orientation = var2.field934; + var2.field934 = -1; + } + } + + if ((var3 & 8) != 0) { + var5 = var0.method5622(); + byte[] var16 = new byte[var5]; + Buffer var14 = new Buffer(var16); + var0.readBytes(var16, 0, var5); + Players.field1229[var1] = var14; + var2.read(var14); + } + + if ((var3 & 256) != 0) { + var2.field966 = var0.method5640(); + var2.field979 = var0.method5640(); + var2.field967 = var0.method5640(); + var2.field969 = var0.method5671(); + var2.field925 = var0.readUnsignedShort() + Client.cycle; + var2.field971 = var0.method5647() + Client.cycle; + var2.field972 = var0.method5648(); + if (var2.field606) { + var2.field966 += var2.tileX; + var2.field979 += var2.tileY; + var2.field967 += var2.tileX; + var2.field969 += var2.tileY; + var2.pathLength = 0; + } else { + var2.field966 += var2.pathX[0]; + var2.field979 += var2.pathY[0]; + var2.field967 += var2.pathX[0]; + var2.field969 += var2.pathY[0]; + var2.pathLength = 1; + } + + var2.field983 = 0; + } + + if ((var3 & 512) != 0) { + var4 = var0.method5671(); + } + + if ((var3 & 64) != 0) { + var2.targetIndex = var0.readUnsignedShort(); + if (var2.targetIndex == 65535) { + var2.targetIndex = -1; + } + } + + if ((var3 & 1024) != 0) { + var2.spotAnimation = var0.method5648(); + var5 = var0.readInt(); + var2.field965 = var5 >> 16; + var2.field973 = (var5 & 65535) + Client.cycle; + var2.spotAnimationFrame = 0; + var2.spotAnimationFrameCycle = 0; + if (var2.field973 > Client.cycle) { + var2.spotAnimationFrame = -1; + } + + if (var2.spotAnimation == 65535) { + var2.spotAnimation = -1; + } + } + + if ((var3 & 1) != 0) { + var5 = var0.readUnsignedByte(); + int var15; + int var17; + int var19; + if (var5 > 0) { + for (var13 = 0; var13 < var5; ++var13) { + var8 = -1; + var9 = -1; + var19 = -1; + var17 = var0.readUShortSmart(); + if (var17 == 32767) { + var17 = var0.readUShortSmart(); + var9 = var0.readUShortSmart(); + var8 = var0.readUShortSmart(); + var19 = var0.readUShortSmart(); + } else if (var17 != 32766) { + var9 = var0.readUShortSmart(); + } else { + var17 = -1; } - if (StructDefinition.headIconPkSprites == null) { - StructDefinition.headIconPkSprites = Canvas.SpriteBuffer_getSpriteArray(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.headIconsPk, 0); - } else { - ++var0; - } + var15 = var0.readUShortSmart(); + var2.addHitSplat(var17, var9, var8, var19, Client.cycle, var15); + } + } - if (WorldMapRegion.headIconPrayerSprites == null) { - WorldMapRegion.headIconPrayerSprites = Canvas.SpriteBuffer_getSpriteArray(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3800, 0); + var13 = var0.method5697(); + if (var13 > 0) { + for (var17 = 0; var17 < var13; ++var17) { + var8 = var0.readUShortSmart(); + var9 = var0.readUShortSmart(); + if (var9 != 32767) { + var19 = var0.readUShortSmart(); + var15 = var0.method5622(); + var12 = var9 > 0 ? var0.method5697() : var15; + var2.addHealthBar(var8, Client.cycle, var9, var19, var15, var12); } else { - ++var0; + var2.removeHealthBar(var8); } + } + } + } - if (ReflectionCheck.headIconHintSprites == null) { - ReflectionCheck.headIconHintSprites = Canvas.SpriteBuffer_getSpriteArray(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3796, 0); - } else { - ++var0; - } + if ((var3 & 4096) != 0) { + for (var5 = 0; var5 < 3; ++var5) { + var2.actions[var5] = var0.readStringCp1252NullTerminated(); + } + } - if (GameObject.mapMarkerSprites == null) { - GameObject.mapMarkerSprites = Canvas.SpriteBuffer_getSpriteArray(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3802, 0); - } else { - ++var0; - } + if (var2.field606) { + if (var4 == 127) { + var2.resetPath(var2.tileX, var2.tileY); + } else { + byte var18; + if (var4 != -1) { + var18 = var4; + } else { + var18 = Players.field1228[var1]; + } - if (UrlRequest.crossSprites == null) { - UrlRequest.crossSprites = Canvas.SpriteBuffer_getSpriteArray(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3803, 0); - } else { - ++var0; - } + var2.method1334(var2.tileX, var2.tileY, var18); + } + } - if (class13.mapDotSprites == null) { - class13.mapDotSprites = Canvas.SpriteBuffer_getSpriteArray(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3804, 0); - } else { - ++var0; - } + } - if (class4.scrollBarSprites == null) { - class4.scrollBarSprites = class297.method5389(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3807, 0); - } else { - ++var0; - } + @ObfuscatedName("u") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "1197289797" + ) + static int method3796(int var0, Script var1, boolean var2) { + String var3; + if (var0 == ScriptOpcodes.MES) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + class30.addGameMessage(0, "", var3); + return 1; + } else if (var0 == ScriptOpcodes.ANIM) { + Interpreter.Interpreter_intStackSize -= 2; + MouseRecorder.performPlayerAnimation(class215.localPlayer, Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize], Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + return 1; + } else if (var0 == ScriptOpcodes.IF_CLOSE) { + if (!Interpreter.field1076) { + Interpreter.field1075 = true; + } - if (WorldMapData_0.modIconSprites == null) { - WorldMapData_0.modIconSprites = class297.method5389(GrandExchangeOfferAgeComparator.archive8, WorldMapData_0.spriteIds.field3806, 0); - } else { - ++var0; - } + return 1; + } else { + int var10; + if (var0 == ScriptOpcodes.RESUME_COUNTDIALOG) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var10 = 0; + if (AbstractWorldMapData.isNumber(var3)) { + var10 = ClientPreferences.parseInt(var3); + } - if (var0 < 11) { - Login.Login_loadingText = "Loading sprites - " + var0 * 100 / 12 + "%"; - Login.Login_loadingPercent = 70; - } else { - AbstractFont.AbstractFont_modIconSprites = WorldMapData_0.modIconSprites; - PendingSpawn.redHintArrowSprite.normalize(); - int var24 = (int)(Math.random() * 21.0D) - 10; - int var25 = (int)(Math.random() * 21.0D) - 10; - var20 = (int)(Math.random() * 21.0D) - 10; - int var21 = (int)(Math.random() * 41.0D) - 20; - class14.mapSceneSprites[0].shiftColors(var21 + var24, var21 + var25, var21 + var20); - Login.Login_loadingText = "Loaded sprites"; - Login.Login_loadingPercent = 70; - Client.titleLoadingStage = 90; - } - } else if (Client.titleLoadingStage == 90) { - if (!AttackOption.archive9.isFullyLoaded()) { - Login.Login_loadingText = "Loading textures - " + "0%"; - Login.Login_loadingPercent = 90; - } else { - Archive.textureProvider = new TextureProvider(AttackOption.archive9, GrandExchangeOfferAgeComparator.archive8, 20, 0.8D, Client.isLowDetail ? 64 : 128); - Rasterizer3D.Rasterizer3D_setTextureLoader(Archive.textureProvider); - Rasterizer3D.Rasterizer3D_setBrightness(0.8D); - Client.titleLoadingStage = 100; - } - } else if (Client.titleLoadingStage == 100) { - var0 = Archive.textureProvider.getLoadedPercentage(); - if (var0 < 100) { - Login.Login_loadingText = "Loading textures - " + var0 + "%"; - Login.Login_loadingPercent = 90; - } else { - Login.Login_loadingText = "Loaded textures"; - Login.Login_loadingPercent = 90; - Client.titleLoadingStage = 110; - } - } else if (Client.titleLoadingStage == 110) { - WorldMapLabel.mouseRecorder = new MouseRecorder(); - GameShell.taskHandler.newThreadTask(WorldMapLabel.mouseRecorder, 10); - Login.Login_loadingText = "Loaded input handler"; - Login.Login_loadingPercent = 92; - Client.titleLoadingStage = 120; - } else if (Client.titleLoadingStage == 120) { - if (!Client.archive10.tryLoadFileByNames("huffman", "")) { - Login.Login_loadingText = "Loading wordpack - " + 0 + "%"; - Login.Login_loadingPercent = 94; - } else { - Huffman var22 = new Huffman(Client.archive10.takeFileByNames("huffman", "")); - class210.huffman = var22; - Login.Login_loadingText = "Loaded wordpack"; - Login.Login_loadingPercent = 94; - Client.titleLoadingStage = 130; - } - } else if (Client.titleLoadingStage == 130) { - if (!BoundaryObject.archive3.isFullyLoaded()) { - Login.Login_loadingText = "Loading interfaces - " + BoundaryObject.archive3.loadPercent() * 4 / 5 + "%"; - Login.Login_loadingPercent = 96; - } else if (!GrandExchangeOfferOwnWorldComparator.archive12.isFullyLoaded()) { - Login.Login_loadingText = "Loading interfaces - " + (80 + GrandExchangeOfferOwnWorldComparator.archive12.loadPercent() / 6) + "%"; - Login.Login_loadingPercent = 96; - } else if (!Tile.archive13.isFullyLoaded()) { - Login.Login_loadingText = "Loading interfaces - " + (96 + Tile.archive13.loadPercent() / 50) + "%"; - Login.Login_loadingPercent = 96; - } else { - Login.Login_loadingText = "Loaded interfaces"; - Login.Login_loadingPercent = 98; - Client.titleLoadingStage = 140; - } - } else if (Client.titleLoadingStage == 140) { - Login.Login_loadingPercent = 100; - if (!WorldMapLabel.archive19.tryLoadGroupByName(WorldMapCacheName.field284.name)) { - Login.Login_loadingText = "Loading world map - " + WorldMapLabel.archive19.groupLoadPercentByName(WorldMapCacheName.field284.name) / 10 + "%"; - } else { - if (Tiles.worldMap == null) { - Tiles.worldMap = new WorldMap(); - Tiles.worldMap.init(WorldMapLabel.archive19, VarcInt.archive18, WorldMapEvent.archive20, class173.fontBold12, Client.fontsMap, class14.mapSceneSprites); + PacketBufferNode var12 = SoundSystem.getPacketBufferNode(ClientPacket.field2221, Client.packetWriter.isaacCipher); + var12.packetBuffer.writeInt(var10); + Client.packetWriter.addNode(var12); + return 1; + } else { + PacketBufferNode var14; + if (var0 == ScriptOpcodes.RESUME_NAMEDIALOG) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2199, Client.packetWriter.isaacCipher); + var14.packetBuffer.writeByte(var3.length() + 1); + var14.packetBuffer.writeStringCp1252NullTerminated(var3); + Client.packetWriter.addNode(var14); + return 1; + } else if (var0 == ScriptOpcodes.RESUME_STRINGDIALOG) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2255, Client.packetWriter.isaacCipher); + var14.packetBuffer.writeByte(var3.length() + 1); + var14.packetBuffer.writeStringCp1252NullTerminated(var3); + Client.packetWriter.addNode(var14); + return 1; + } else { + String var7; + int var15; + if (var0 == ScriptOpcodes.OPPLAYER) { + var15 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var7 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Canvas.method934(var15, var7); + return 1; + } else if (var0 == ScriptOpcodes.IF_DRAGPICKUP) { + Interpreter.Interpreter_intStackSize -= 3; + var15 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + int var9 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + Widget var13 = PacketBufferNode.getWidget(var9); + class4.clickWidget(var13, var15, var10); + return 1; + } else if (var0 == ScriptOpcodes.CC_DRAGPICKUP) { + Interpreter.Interpreter_intStackSize -= 2; + var15 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Widget var11 = var2 ? class96.field1301 : ReflectionCheck.field1310; + class4.clickWidget(var11, var15, var10); + return 1; + } else if (var0 == ScriptOpcodes.MOUSECAM) { + WorldMapLabelSize.mouseCam = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.GETREMOVEROOFS) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ScriptEvent.clientPreferences.roofsHidden ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.SETREMOVEROOFS) { + ScriptEvent.clientPreferences.roofsHidden = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + HitSplatDefinition.savePreferences(); + return 1; + } else if (var0 == ScriptOpcodes.OPENURL) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + boolean var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + class2.openURL(var3, var4, false); + return 1; + } else if (var0 == ScriptOpcodes.RESUME_OBJDIALOG) { + var15 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var14 = SoundSystem.getPacketBufferNode(ClientPacket.field2179, Client.packetWriter.isaacCipher); + var14.packetBuffer.writeShort(var15); + Client.packetWriter.addNode(var14); + return 1; + } else if (var0 == ScriptOpcodes.BUG_REPORT) { + var15 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + WorldMapDecoration.Interpreter_stringStackSize -= 2; + var7 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize]; + String var5 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1]; + if (var7.length() > 500) { + return 1; + } else if (var5.length() > 500) { + return 1; + } else { + PacketBufferNode var6 = SoundSystem.getPacketBufferNode(ClientPacket.field2230, Client.packetWriter.isaacCipher); + var6.packetBuffer.writeShort(1 + UserComparator6.stringCp1252NullTerminatedByteSize(var7) + UserComparator6.stringCp1252NullTerminatedByteSize(var5)); + var6.packetBuffer.writeStringCp1252NullTerminated(var7); + var6.packetBuffer.writeStringCp1252NullTerminated(var5); + var6.packetBuffer.method5635(var15); + Client.packetWriter.addNode(var6); + return 1; + } + } else if (var0 == ScriptOpcodes.SETSHIFTCLICKDROP) { + Client.shiftClickDrop = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.SETSHOWMOUSEOVERTEXT) { + Client.showMouseOverText = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.RENDERSELF) { + Client.renderSelf = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == 3120) { + if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { + Client.drawPlayerNames |= 1; + } else { + Client.drawPlayerNames &= -2; } - Login.Login_loadingText = "Loaded world map"; - Client.titleLoadingStage = 150; + return 1; + } else if (var0 == 3121) { + if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { + Client.drawPlayerNames |= 2; + } else { + Client.drawPlayerNames &= -3; + } + + return 1; + } else if (var0 == 3122) { + if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { + Client.drawPlayerNames |= 4; + } else { + Client.drawPlayerNames &= -5; + } + + return 1; + } else if (var0 == 3123) { + if (Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1) { + Client.drawPlayerNames |= 8; + } else { + Client.drawPlayerNames &= -9; + } + + return 1; + } else if (var0 == 3124) { + Client.drawPlayerNames = 0; + return 1; + } else if (var0 == ScriptOpcodes.SETSHOWMOUSECROSS) { + Client.showMouseCross = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.SETSHOWLOADINGMESSAGES) { + Client.showLoadingMessages = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + return 1; + } else if (var0 == ScriptOpcodes.SETTAPTODROP) { + ReflectionCheck.setTapToDrop(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1); + return 1; + } else if (var0 == ScriptOpcodes.GETTAPTODROP) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapData_1.getTapToDrop() ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.SETOCULUSORBSPEED) { + Interpreter.Interpreter_intStackSize -= 2; + Client.oculusOrbNormalSpeed = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + Client.oculusOrbSlowedSpeed = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + return 1; + } else if (var0 == 3130) { + Interpreter.Interpreter_intStackSize -= 2; + return 1; + } else if (var0 == 3131) { + --Interpreter.Interpreter_intStackSize; + return 1; + } else if (var0 == ScriptOpcodes.GETCANVASSIZE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class286.canvasWidth; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = FloorUnderlayDefinition.canvasHeight; + return 1; + } else if (var0 == ScriptOpcodes.MOBILE_SETFPS) { + --Interpreter.Interpreter_intStackSize; + return 1; + } else if (var0 == ScriptOpcodes.MOBILE_OPENSTORE) { + return 1; + } else if (var0 == ScriptOpcodes.MOBILE_OPENSTORECATEGORY) { + Interpreter.Interpreter_intStackSize -= 2; + return 1; + } else if (var0 == 3136) { + Client.field828 = 3; + Client.field794 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + return 1; + } else if (var0 == 3137) { + Client.field828 = 2; + Client.field794 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + return 1; + } else if (var0 == 3138) { + Client.field828 = 0; + return 1; + } else if (var0 == 3139) { + Client.field828 = 1; + return 1; + } else if (var0 == 3140) { + Client.field828 = 3; + Client.field794 = var2 ? class96.field1301.id : ReflectionCheck.field1310.id; + return 1; + } else { + boolean var8; + if (var0 == ScriptOpcodes.SETHIDEUSERNAME) { + var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + ScriptEvent.clientPreferences.hideUsername = var8; + HitSplatDefinition.savePreferences(); + return 1; + } else if (var0 == ScriptOpcodes.GETHIDEUSERNAME) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ScriptEvent.clientPreferences.hideUsername ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.SETREMEMBERUSERNAME) { + var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + Client.Login_isUsernameRemembered = var8; + if (!var8) { + ScriptEvent.clientPreferences.rememberedUsername = ""; + HitSplatDefinition.savePreferences(); + } + + return 1; + } else if (var0 == ScriptOpcodes.GETREMEMBERUSERNAME) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.Login_isUsernameRemembered ? 1 : 0; + return 1; + } else if (var0 == 3145) { + return 1; + } else if (var0 == ScriptOpcodes.SETTITLEMUSICENABLED) { + var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (var8 == ScriptEvent.clientPreferences.titleMusicDisabled) { + ScriptEvent.clientPreferences.titleMusicDisabled = !var8; + HitSplatDefinition.savePreferences(); + } + + return 1; + } else if (var0 == ScriptOpcodes.GETTITLEMUSICENABLED) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ScriptEvent.clientPreferences.titleMusicDisabled ? 0 : 1; + return 1; + } else if (var0 == 3148) { + return 1; + } else if (var0 == 3149) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3150) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3151) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3152) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3153) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Login.Login_loadingPercent; + return 1; + } else if (var0 == 3154) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class14.method203(); + return 1; + } else if (var0 == 3155) { + --WorldMapDecoration.Interpreter_stringStackSize; + return 1; + } else if (var0 == 3156) { + return 1; + } else if (var0 == 3157) { + Interpreter.Interpreter_intStackSize -= 2; + return 1; + } else if (var0 == 3158) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3159) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3160) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3161) { + --Interpreter.Interpreter_intStackSize; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3162) { + --Interpreter.Interpreter_intStackSize; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3163) { + --WorldMapDecoration.Interpreter_stringStackSize; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3164) { + --Interpreter.Interpreter_intStackSize; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + return 1; + } else if (var0 == 3165) { + --Interpreter.Interpreter_intStackSize; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3166) { + Interpreter.Interpreter_intStackSize -= 2; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3167) { + Interpreter.Interpreter_intStackSize -= 2; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3168) { + Interpreter.Interpreter_intStackSize -= 2; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + return 1; + } else if (var0 == 3169) { + return 1; + } else if (var0 == 3170) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3171) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3172) { + --Interpreter.Interpreter_intStackSize; + return 1; + } else if (var0 == 3173) { + --Interpreter.Interpreter_intStackSize; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3174) { + --Interpreter.Interpreter_intStackSize; + return 1; + } else if (var0 == 3175) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else if (var0 == 3176) { + return 1; + } else if (var0 == 3177) { + return 1; + } else if (var0 == 3178) { + --WorldMapDecoration.Interpreter_stringStackSize; + return 1; + } else if (var0 == 3179) { + return 1; + } else if (var0 == 3180) { + --WorldMapDecoration.Interpreter_stringStackSize; + return 1; + } else { + return 2; + } } - } else if (Client.titleLoadingStage == 150) { - MouseRecorder.updateGameState(10); } } } diff --git a/runescape-client/src/main/java/class191.java b/runescape-client/src/main/java/class191.java index 4a991ac441..d97262bbd4 100644 --- a/runescape-client/src/main/java/class191.java +++ b/runescape-client/src/main/java/class191.java @@ -1,59 +1,57 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gl") +@ObfuscatedName("gt") public class class191 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgl;" + signature = "Lgt;" ) - static final class191 field2344; + static final class191 field2333; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lgt;" + ) + static final class191 field2336; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lgl;" + signature = "Lgt;" ) - static final class191 field2345; - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lgl;" - ) - static final class191 field2346; + static final class191 field2335; static { - field2344 = new class191(); - field2345 = new class191(); - field2346 = new class191(); + field2333 = new class191(); + field2336 = new class191(); + field2335 = new class191(); } class191() { } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "1561368496" + signature = "([BI)V", + garbageValue = "200014911" ) - public static void method3640() { - if (KeyHandler.KeyHandler_instance != null) { - synchronized(KeyHandler.KeyHandler_instance) { - KeyHandler.KeyHandler_instance = null; + @Export("ByteArrayPool_release") + public static synchronized void ByteArrayPool_release(byte[] var0) { + if (var0.length == 100 && ByteArrayPool.ByteArrayPool_smallCount < 1000) { + ByteArrayPool.ByteArrayPool_small[++ByteArrayPool.ByteArrayPool_smallCount - 1] = var0; + } else if (var0.length == 5000 && ByteArrayPool.ByteArrayPool_mediumCount < 250) { + ByteArrayPool.ByteArrayPool_medium[++ByteArrayPool.ByteArrayPool_mediumCount - 1] = var0; + } else if (var0.length == 30000 && ByteArrayPool.ByteArrayPool_largeCount < 50) { + ByteArrayPool.ByteArrayPool_large[++ByteArrayPool.ByteArrayPool_largeCount - 1] = var0; + } else { + if (HorizontalAlignment.ByteArrayPool_arrays != null) { + for (int var1 = 0; var1 < ByteArrayPool.ByteArrayPool_alternativeSizes.length; ++var1) { + if (var0.length == ByteArrayPool.ByteArrayPool_alternativeSizes[var1] && class222.ByteArrayPool_altSizeArrayCounts[var1] < HorizontalAlignment.ByteArrayPool_arrays[var1].length) { + HorizontalAlignment.ByteArrayPool_arrays[var1][class222.ByteArrayPool_altSizeArrayCounts[var1]++] = var0; + return; + } + } } + } - - } - - @ObfuscatedName("fa") - @ObfuscatedSignature( - signature = "(Lby;I)V", - garbageValue = "616240991" - ) - static final void method3639(Actor var0) { - int var1 = var0.field948 - Client.cycle; - int var2 = var0.size * -527978816 + var0.field971 * 128; - int var3 = var0.size * -527978816 + var0.field973 * 128; - var0.x += (var2 - var0.x) / var1; - var0.y += (var3 - var0.y) / var1; - var0.field949 = 0; - var0.orientation = var0.field977; } } diff --git a/runescape-client/src/main/java/class192.java b/runescape-client/src/main/java/class192.java index ee76f6e32a..f537dff6cc 100644 --- a/runescape-client/src/main/java/class192.java +++ b/runescape-client/src/main/java/class192.java @@ -1,3 +1,6 @@ +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; import java.util.HashSet; import java.util.Set; import net.runelite.mapping.Export; @@ -5,389 +8,336 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gs") +@ObfuscatedName("gm") public enum class192 implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2362("", 0, new class191[]{class191.field2346}), + field2345("", 0, new class191[]{class191.field2335}), + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lgm;" + ) + field2338("", 1, new class191[]{class191.field2336, class191.field2335}), @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2351("", 1, new class191[]{class191.field2345, class191.field2346}), - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lgs;" - ) - field2352("", 2, new class191[]{class191.field2345, class191.field2344, class191.field2346}), - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lgs;" - ) - field2353("", 3, new class191[]{class191.field2345}), - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lgs;" - ) - field2354("", 4), - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lgs;" - ) - field2361("", 5, new class191[]{class191.field2345, class191.field2346}), + field2350("", 2, new class191[]{class191.field2336, class191.field2333, class191.field2335}), @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2356("", 6, new class191[]{class191.field2346}), - @ObfuscatedName("m") + field2341("", 3, new class191[]{class191.field2336}), + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2357("", 8, new class191[]{class191.field2345, class191.field2346}), - @ObfuscatedName("y") + field2342("", 4), + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2350("", 9, new class191[]{class191.field2345, class191.field2344}), - @ObfuscatedName("i") - @ObfuscatedSignature( - signature = "Lgs;" - ) - field2359("", 10, new class191[]{class191.field2345}), + field2339("", 5, new class191[]{class191.field2336, class191.field2335}), @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2360("", 11, new class191[]{class191.field2345}), - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Lgs;" - ) - field2355("", 12, new class191[]{class191.field2345, class191.field2346}), + field2344("", 6, new class191[]{class191.field2335}), @ObfuscatedName("o") @ObfuscatedSignature( - signature = "Lgs;" + signature = "Lgm;" ) - field2358("", 13, new class191[]{class191.field2345}); + field2340("", 8, new class191[]{class191.field2336, class191.field2335}), + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "Lgm;" + ) + field2346("", 9, new class191[]{class191.field2336, class191.field2333}), + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "Lgm;" + ) + field2347("", 10, new class191[]{class191.field2336}), + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "Lgm;" + ) + field2348("", 11, new class191[]{class191.field2336}), + @ObfuscatedName("p") + @ObfuscatedSignature( + signature = "Lgm;" + ) + field2349("", 12, new class191[]{class191.field2336, class191.field2335}), + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "Lgm;" + ) + field2343("", 13, new class191[]{class191.field2336}); - @ObfuscatedName("a") + @ObfuscatedName("z") @ObfuscatedGetter( - intValue = 1983326673 + intValue = 503596415 + ) + @Export("loginBoxCenter") + static int loginBoxCenter; + @ObfuscatedName("dh") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive14") + static Archive archive14; + @ObfuscatedName("ek") + @ObfuscatedSignature( + signature = "Lkb;" + ) + @Export("spriteIds") + static GraphicsDefaults spriteIds; + @ObfuscatedName("k") + @ObfuscatedGetter( + intValue = 2067874269 ) @Export("id") final int id; - @ObfuscatedName("e") - final Set field2364; + @ObfuscatedName("x") + final Set field2352; + + static { + method3812(); + } @ObfuscatedSignature( - signature = "(Ljava/lang/String;I[Lgl;)V" + signature = "(Ljava/lang/String;I[Lgt;)V" ) class192(String var3, int var4, class191[] var5) { - this.field2364 = new HashSet(); + this.field2352 = new HashSet(); this.id = var4; class191[] var6 = var5; for (int var7 = 0; var7 < var6.length; ++var7) { class191 var8 = var6[var7]; - this.field2364.add(var8); + this.field2352.add(var8); } } class192(String var3, int var4) { - this.field2364 = new HashSet(); + this.field2352 = new HashSet(); this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(I)[Lge;", - garbageValue = "-311102379" + signature = "(Ljava/lang/String;Ljava/lang/String;III)V", + garbageValue = "927636504" ) - static LoginPacket[] method3649() { - return new LoginPacket[]{LoginPacket.field2287, LoginPacket.field2288, LoginPacket.field2291, LoginPacket.field2290, LoginPacket.field2289}; - } + public static void method3814(String var0, String var1, int var2, int var3) throws IOException { + JagexCache.idxCount = var3; + class189.cacheGamebuild = var2; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(IIILfi;Lfa;Z[I[IB)I", - garbageValue = "-91" - ) - public static int method3646(int var0, int var1, int var2, RouteStrategy var3, CollisionMap var4, boolean var5, int[] var6, int[] var7) { - int var9; - for (int var8 = 0; var8 < 128; ++var8) { - for (var9 = 0; var9 < 128; ++var9) { - class173.directions[var8][var9] = 0; - class173.distances[var8][var9] = 99999999; - } + try { + class43.field363 = System.getProperty("os.name"); + } catch (Exception var17) { + class43.field363 = "Unknown"; } - boolean var27; - if (var2 == 1) { - var27 = method3641(var0, var1, var3, var4); - } else if (var2 == 2) { - var27 = RouteStrategy.method3561(var0, var1, var3, var4); - } else { - var27 = class14.method172(var0, var1, var2, var3, var4); + class96.field1299 = class43.field363.toLowerCase(); + + try { + class30.userHomeDirectory = System.getProperty("user.home"); + if (class30.userHomeDirectory != null) { + class30.userHomeDirectory = class30.userHomeDirectory + "/"; + } + } catch (Exception var16) { } - var9 = var0 - 64; - int var10 = var1 - 64; - int var11 = UserComparator10.field1956; - int var12 = class173.field2075; - int var13; - int var14; - int var16; - if (!var27) { - var13 = Integer.MAX_VALUE; - var14 = Integer.MAX_VALUE; - byte var15 = 10; - var16 = var3.approxDestinationX; - int var17 = var3.approxDestinationY; - int var18 = var3.approxDestinationSizeX; - int var19 = var3.approxDestinationSizeY; - - for (int var20 = var16 - var15; var20 <= var16 + var15; ++var20) { - for (int var21 = var17 - var15; var21 <= var15 + var17; ++var21) { - int var22 = var20 - var9; - int var23 = var21 - var10; - if (var22 >= 0 && var23 >= 0 && var22 < 128 && var23 < 128 && class173.distances[var22][var23] < 100) { - int var24 = 0; - if (var20 < var16) { - var24 = var16 - var20; - } else if (var20 > var16 + var18 - 1) { - var24 = var20 - (var18 + var16 - 1); - } - - int var25 = 0; - if (var21 < var17) { - var25 = var17 - var21; - } else if (var21 > var19 + var17 - 1) { - var25 = var21 - (var19 + var17 - 1); - } - - int var26 = var25 * var25 + var24 * var24; - if (var26 < var13 || var26 == var13 && class173.distances[var22][var23] < var14) { - var13 = var26; - var14 = class173.distances[var22][var23]; - var11 = var20; - var12 = var21; - } - } + try { + if (class96.field1299.startsWith("win")) { + if (class30.userHomeDirectory == null) { + class30.userHomeDirectory = System.getenv("USERPROFILE"); } + } else if (class30.userHomeDirectory == null) { + class30.userHomeDirectory = System.getenv("HOME"); } - if (var13 == Integer.MAX_VALUE) { - return -1; + if (class30.userHomeDirectory != null) { + class30.userHomeDirectory = class30.userHomeDirectory + "/"; } + } catch (Exception var15) { } - if (var0 == var11 && var12 == var1) { - return 0; - } else { - byte var28 = 0; - class173.bufferX[var28] = var11; - var13 = var28 + 1; - class173.bufferY[var28] = var12; + if (class30.userHomeDirectory == null) { + class30.userHomeDirectory = "~/"; + } - int var29; - for (var14 = var29 = class173.directions[var11 - var9][var12 - var10]; var0 != var11 || var12 != var1; var14 = class173.directions[var11 - var9][var12 - var10]) { - if (var29 != var14) { - var29 = var14; - class173.bufferX[var13] = var11; - class173.bufferY[var13++] = var12; + BoundaryObject.field1859 = new String[]{"c:/rscache/", "/rscache/", "c:/windows/", "c:/winnt/", "c:/", class30.userHomeDirectory, "/tmp/", ""}; + class312.field3803 = new String[]{".jagex_cache_" + class189.cacheGamebuild, ".file_store_" + class189.cacheGamebuild}; + int var12 = 0; + + label99: + while (var12 < 4) { + JagexCache.cacheDir = VertexNormal.getCacheDir(var0, var1, var12); + if (!JagexCache.cacheDir.exists()) { + JagexCache.cacheDir.mkdirs(); + } + + File[] var5 = JagexCache.cacheDir.listFiles(); + if (var5 == null) { + break; + } + + File[] var6 = var5; + int var7 = 0; + + while (true) { + if (var7 >= var6.length) { + break label99; } - if ((var14 & 2) != 0) { - ++var11; - } else if ((var14 & 8) != 0) { - --var11; + File var8 = var6[var7]; + + boolean var9; + try { + RandomAccessFile var10 = new RandomAccessFile(var8, "rw"); + int var11 = var10.read(); + var10.seek(0L); + var10.write(var11); + var10.seek(0L); + var10.close(); + var9 = true; + } catch (Exception var14) { + var9 = false; } - if ((var14 & 1) != 0) { + if (!var9) { ++var12; - } else if ((var14 & 4) != 0) { - --var12; - } - } - - var16 = 0; - - while (var13-- > 0) { - var6[var16] = class173.bufferX[var13]; - var7[var16++] = class173.bufferY[var13]; - if (var16 >= var6.length) { break; } - } - return var16; - } - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(IILfi;Lfa;I)Z", - garbageValue = "-1742878989" - ) - static final boolean method3641(int var0, int var1, RouteStrategy var2, CollisionMap var3) { - int var4 = var0; - int var5 = var1; - byte var6 = 64; - byte var7 = 64; - int var8 = var0 - var6; - int var9 = var1 - var7; - class173.directions[var6][var7] = 99; - class173.distances[var6][var7] = 0; - byte var10 = 0; - int var11 = 0; - class173.bufferX[var10] = var0; - byte var10001 = var10; - int var18 = var10 + 1; - class173.bufferY[var10001] = var1; - int[][] var12 = var3.flags; - - while (var11 != var18) { - var4 = class173.bufferX[var11]; - var5 = class173.bufferY[var11]; - var11 = var11 + 1 & 4095; - int var16 = var4 - var8; - int var17 = var5 - var9; - int var13 = var4 - var3.xInset; - int var14 = var5 - var3.yInset; - if (var2.hasArrived(1, var4, var5, var3)) { - UserComparator10.field1956 = var4; - class173.field2075 = var5; - return true; - } - - int var15 = class173.distances[var16][var17] + 1; - if (var16 > 0 && class173.directions[var16 - 1][var17] == 0 && (var12[var13 - 1][var14] & 19136776) == 0) { - class173.bufferX[var18] = var4 - 1; - class173.bufferY[var18] = var5; - var18 = var18 + 1 & 4095; - class173.directions[var16 - 1][var17] = 2; - class173.distances[var16 - 1][var17] = var15; - } - - if (var16 < 127 && class173.directions[var16 + 1][var17] == 0 && (var12[var13 + 1][var14] & 19136896) == 0) { - class173.bufferX[var18] = var4 + 1; - class173.bufferY[var18] = var5; - var18 = var18 + 1 & 4095; - class173.directions[var16 + 1][var17] = 8; - class173.distances[var16 + 1][var17] = var15; - } - - if (var17 > 0 && class173.directions[var16][var17 - 1] == 0 && (var12[var13][var14 - 1] & 19136770) == 0) { - class173.bufferX[var18] = var4; - class173.bufferY[var18] = var5 - 1; - var18 = var18 + 1 & 4095; - class173.directions[var16][var17 - 1] = 1; - class173.distances[var16][var17 - 1] = var15; - } - - if (var17 < 127 && class173.directions[var16][var17 + 1] == 0 && (var12[var13][var14 + 1] & 19136800) == 0) { - class173.bufferX[var18] = var4; - class173.bufferY[var18] = var5 + 1; - var18 = var18 + 1 & 4095; - class173.directions[var16][var17 + 1] = 4; - class173.distances[var16][var17 + 1] = var15; - } - - if (var16 > 0 && var17 > 0 && class173.directions[var16 - 1][var17 - 1] == 0 && (var12[var13 - 1][var14 - 1] & 19136782) == 0 && (var12[var13 - 1][var14] & 19136776) == 0 && (var12[var13][var14 - 1] & 19136770) == 0) { - class173.bufferX[var18] = var4 - 1; - class173.bufferY[var18] = var5 - 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 - 1][var17 - 1] = 3; - class173.distances[var16 - 1][var17 - 1] = var15; - } - - if (var16 < 127 && var17 > 0 && class173.directions[var16 + 1][var17 - 1] == 0 && (var12[var13 + 1][var14 - 1] & 19136899) == 0 && (var12[var13 + 1][var14] & 19136896) == 0 && (var12[var13][var14 - 1] & 19136770) == 0) { - class173.bufferX[var18] = var4 + 1; - class173.bufferY[var18] = var5 - 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 + 1][var17 - 1] = 9; - class173.distances[var16 + 1][var17 - 1] = var15; - } - - if (var16 > 0 && var17 < 127 && class173.directions[var16 - 1][var17 + 1] == 0 && (var12[var13 - 1][var14 + 1] & 19136824) == 0 && (var12[var13 - 1][var14] & 19136776) == 0 && (var12[var13][var14 + 1] & 19136800) == 0) { - class173.bufferX[var18] = var4 - 1; - class173.bufferY[var18] = var5 + 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 - 1][var17 + 1] = 6; - class173.distances[var16 - 1][var17 + 1] = var15; - } - - if (var16 < 127 && var17 < 127 && class173.directions[var16 + 1][var17 + 1] == 0 && (var12[var13 + 1][var14 + 1] & 19136992) == 0 && (var12[var13 + 1][var14] & 19136896) == 0 && (var12[var13][var14 + 1] & 19136800) == 0) { - class173.bufferX[var18] = var4 + 1; - class173.bufferY[var18] = var5 + 1; - var18 = var18 + 1 & 4095; - class173.directions[var16 + 1][var17 + 1] = 12; - class173.distances[var16 + 1][var17 + 1] = var15; + ++var7; } } - UserComparator10.field1956 = var4; - class173.field2075 = var5; - return false; - } + File var4 = JagexCache.cacheDir; + FileSystem.FileSystem_cacheDir = var4; + if (!FileSystem.FileSystem_cacheDir.exists()) { + throw new RuntimeException(""); + } else { + FileSystem.FileSystem_hasPermissions = true; + class14.method204(); + JagexCache.JagexCache_dat2File = new BufferedFile(new AccessFile(PendingSpawn.getFile("main_file_cache.dat2"), "rw", 1048576000L), 5200, 0); + JagexCache.JagexCache_idx255File = new BufferedFile(new AccessFile(PendingSpawn.getFile("main_file_cache.idx255"), "rw", 1048576L), 6000, 0); + ArchiveLoader.JagexCache_idxFiles = new BufferedFile[JagexCache.idxCount]; - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "1437512124" - ) - @Export("changeWorldSelectSorting") - static void changeWorldSelectSorting(int var0, int var1) { - int[] var2 = new int[4]; - int[] var3 = new int[4]; - var2[0] = var0; - var3[0] = var1; - int var4 = 1; - - for (int var5 = 0; var5 < 4; ++var5) { - if (World.World_sortOption1[var5] != var0) { - var2[var4] = World.World_sortOption1[var5]; - var3[var4] = World.World_sortOption2[var5]; - ++var4; + for (int var13 = 0; var13 < JagexCache.idxCount; ++var13) { + ArchiveLoader.JagexCache_idxFiles[var13] = new BufferedFile(new AccessFile(PendingSpawn.getFile("main_file_cache.idx" + var13), "rw", 1048576L), 6000, 0); } - } - World.World_sortOption1 = var2; - World.World_sortOption2 = var3; - WorldMapData_0.sortWorlds(World.World_worlds, 0, World.World_worlds.length - 1, World.World_sortOption1, World.World_sortOption2); + } } @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIS)I", - garbageValue = "5004" + signature = "(B)[Lgm;", + garbageValue = "14" ) - static final int method3648(int var0, int var1) { - if (var0 == -1) { - return 12345678; - } else { - var1 = (var0 & 127) * var1 / 128; - if (var1 < 2) { - var1 = 2; - } else if (var1 > 126) { - var1 = 126; + static class192[] method3812() { + return new class192[]{field2344, field2338, field2339, field2345, field2349, field2346, field2342, field2341, field2348, field2350, field2343, field2340, field2347}; + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(Ljava/lang/CharSequence;IZI)I", + garbageValue = "-1187268982" + ) + @Export("parseIntCustomRadix") + public static int parseIntCustomRadix(CharSequence var0, int var1, boolean var2) { + if (var1 >= 2 && var1 <= 36) { + boolean var3 = false; + boolean var4 = false; + int var5 = 0; + int var6 = var0.length(); + + for (int var7 = 0; var7 < var6; ++var7) { + char var8 = var0.charAt(var7); + if (var7 == 0) { + if (var8 == '-') { + var3 = true; + continue; + } + + if (var8 == '+') { + continue; + } + } + + int var10; + if (var8 >= '0' && var8 <= '9') { + var10 = var8 - '0'; + } else if (var8 >= 'A' && var8 <= 'Z') { + var10 = var8 - '7'; + } else { + if (var8 < 'a' || var8 > 'z') { + throw new NumberFormatException(); + } + + var10 = var8 - 'W'; + } + + if (var10 >= var1) { + throw new NumberFormatException(); + } + + if (var3) { + var10 = -var10; + } + + int var9 = var10 + var5 * var1; + if (var9 / var1 != var5) { + throw new NumberFormatException(); + } + + var5 = var9; + var4 = true; } - return (var0 & 65408) + var1; + if (!var4) { + throw new NumberFormatException(); + } else { + return var5; + } + } else { + throw new IllegalArgumentException("" + var1); } } + + @ObfuscatedName("fh") + @ObfuscatedSignature( + signature = "(IIB)V", + garbageValue = "11" + ) + static void method3813(int var0, int var1) { + int[] var2 = new int[9]; + + for (int var3 = 0; var3 < var2.length; ++var3) { + int var4 = var3 * 32 + 15 + 128; + int var5 = WorldMapSection0.method285(var4); + int var6 = Rasterizer3D.Rasterizer3D_sine[var4]; + var5 = PcmPlayer.method2637(var5, var1); + var2[var3] = var6 * var5 >> 16; + } + + Scene.Scene_buildVisiblityMap(var2, 500, 800, var0 * 334 / var1, 334); + } } diff --git a/runescape-client/src/main/java/class195.java b/runescape-client/src/main/java/class195.java index eaa85027d9..62f35dd217 100644 --- a/runescape-client/src/main/java/class195.java +++ b/runescape-client/src/main/java/class195.java @@ -1,39 +1,25 @@ import java.util.HashMap; -import java.util.Iterator; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("go") public class class195 { - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "Llp;" - ) - @Export("options_buttons_0Sprite") - static IndexedSprite options_buttons_0Sprite; + @ObfuscatedName("d") + public static short[][] field2359; static { new HashMap(); } - @ObfuscatedName("jz") + @ObfuscatedName("ll") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1399038807" + signature = "(Lhi;I)I", + garbageValue = "-906497174" ) - @Export("FriendSystem_invalidateIgnoreds") - static final void FriendSystem_invalidateIgnoreds() { - Iterator var0 = Messages.Messages_hashTable.iterator(); - - while (var0.hasNext()) { - Message var1 = (Message)var0.next(); - var1.clearIsFromIgnored(); - } - - if (Varps.clanChat != null) { - Varps.clanChat.invalidateIgnoreds(); - } - + @Export("getWidgetClickMask") + static int getWidgetClickMask(Widget var0) { + IntegerNode var1 = (IntegerNode)Client.widgetClickMasks.get(((long)var0.id << 32) + (long)var0.childIndex); + return var1 != null ? var1.integer : var0.clickMask; } } diff --git a/runescape-client/src/main/java/class197.java b/runescape-client/src/main/java/class197.java index 1a06c31d21..3992f0855e 100644 --- a/runescape-client/src/main/java/class197.java +++ b/runescape-client/src/main/java/class197.java @@ -3,50 +3,86 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("gr") +@ObfuscatedName("gh") public class class197 { - @ObfuscatedName("ok") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lct;" - ) - @Export("varcs") - static Varcs varcs; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" ) @Export("musicPatchesArchive") public static AbstractArchive musicPatchesArchive; - @ObfuscatedName("v") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lhp;" + signature = "Lhq;" + ) + @Export("musicSamplesArchive") + public static AbstractArchive musicSamplesArchive; + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "Lhq;" ) @Export("soundEffectsArchive") public static AbstractArchive soundEffectsArchive; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = 1857449183 + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "Lgg;" ) - public static int field2386; + @Export("midiPcmStream") + public static MidiPcmStream midiPcmStream; + @ObfuscatedName("v") + @ObfuscatedGetter( + intValue = -1610594971 + ) + public static int field2377; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 319435127 + ) + @Export("musicTrackFileId") + public static int musicTrackFileId; + @ObfuscatedName("i") + @ObfuscatedGetter( + intValue = -1006961815 + ) + public static int field2379; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = -1415687209 + ) + public static int field2384; @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Lhp;" - ) - @Export("musicTrackArchive") - public static AbstractArchive musicTrackArchive; - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Lgh;" + signature = "Lgb;" ) @Export("musicTrack") public static MusicTrack musicTrack; - @ObfuscatedName("ba") - static String field2390; - @ObfuscatedName("gw") - @Export("regionMapArchiveIds") - static int[] regionMapArchiveIds; static { - field2386 = 0; + field2377 = 0; + } + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;Lhq;Lhq;I)V", + garbageValue = "1749712810" + ) + public static void method3845(AbstractArchive var0, AbstractArchive var1, AbstractArchive var2) { + SequenceDefinition.SequenceDefinition_archive = var0; + DevicePcmPlayerProvider.SequenceDefinition_animationsArchive = var1; + SequenceDefinition.SequenceDefinition_skeletonsArchive = var2; + } + + @ObfuscatedName("lr") + @ObfuscatedSignature( + signature = "(II)V", + garbageValue = "-224459169" + ) + static void method3844(int var0) { + for (IntegerNode var1 = (IntegerNode)Client.widgetClickMasks.first(); var1 != null; var1 = (IntegerNode)Client.widgetClickMasks.next()) { + if ((long)var0 == (var1.key >> 48 & 65535L)) { + var1.remove(); + } + } + } } diff --git a/runescape-client/src/main/java/class2.java b/runescape-client/src/main/java/class2.java index 8e162e3413..911a643fb2 100644 --- a/runescape-client/src/main/java/class2.java +++ b/runescape-client/src/main/java/class2.java @@ -1,82 +1,220 @@ import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("v") +@ObfuscatedName("n") final class class2 implements class0 { - @ObfuscatedName("b") - @ObfuscatedSignature( - signature = "Lhp;" - ) - @Export("Widget_fontsArchive") - static AbstractArchive Widget_fontsArchive; - @ObfuscatedName("ix") - @ObfuscatedGetter( - intValue = 1489483619 - ) - @Export("selectedItemWidget") - static int selectedItemWidget; - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(Ljava/lang/Object;Lkl;B)V", - garbageValue = "0" - ) - public void vmethod64(Object var1, Buffer var2) { - this.method18((Long)var1, var2); - } - @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(Lkl;B)Ljava/lang/Object;", - garbageValue = "-93" + signature = "Lhq;" ) - public Object vmethod55(Buffer var1) { + @Export("HitSplatDefinition_fontsArchive") + static AbstractArchive HitSplatDefinition_fontsArchive; + + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Ljava/lang/Object;Lkc;B)V", + garbageValue = "25" + ) + public void vmethod89(Object var1, Buffer var2) { + this.method31((Long)var1, var2); + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Lkc;I)Ljava/lang/Object;", + garbageValue = "242985434" + ) + public Object vmethod74(Buffer var1) { return var1.readLong(); } @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(Ljava/lang/Long;Lkl;B)V", - garbageValue = "33" + signature = "(Ljava/lang/Long;Lkc;I)V", + garbageValue = "-1524476378" ) - void method18(Long var1, Buffer var2) { + void method31(Long var1, Buffer var2) { var2.writeLong(var1); } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "-620659228" + signature = "(Ljava/lang/String;ZZI)V", + garbageValue = "688165402" ) - public static int method30(int var0) { - return var0 >> 11 & 63; + @Export("openURL") + public static void openURL(String var0, boolean var1, boolean var2) { + PacketWriter.method2421(var0, var1, "openjs", var2); } - @ObfuscatedName("v") - @Export("ViewportMouse_unpackX") - public static int ViewportMouse_unpackX(long var0) { - return (int)(var0 >>> 0 & 127L); + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "([Lbk;II[I[II)V", + garbageValue = "2056344966" + ) + @Export("sortWorlds") + static void sortWorlds(World[] var0, int var1, int var2, int[] var3, int[] var4) { + if (var1 < var2) { + int var5 = var1 - 1; + int var6 = var2 + 1; + int var7 = (var2 + var1) / 2; + World var8 = var0[var7]; + var0[var7] = var0[var1]; + var0[var1] = var8; + + while (var5 < var6) { + boolean var9 = true; + + int var10; + int var11; + int var12; + do { + --var6; + + for (var10 = 0; var10 < 4; ++var10) { + if (var3[var10] == 2) { + var11 = var0[var6].index; + var12 = var8.index; + } else if (var3[var10] == 1) { + var11 = var0[var6].population; + var12 = var8.population; + if (var11 == -1 && var4[var10] == 1) { + var11 = 2001; + } + + if (var12 == -1 && var4[var10] == 1) { + var12 = 2001; + } + } else if (var3[var10] == 3) { + var11 = var0[var6].isMembersOnly() ? 1 : 0; + var12 = var8.isMembersOnly() ? 1 : 0; + } else { + var11 = var0[var6].id; + var12 = var8.id; + } + + if (var11 != var12) { + if ((var4[var10] != 1 || var11 <= var12) && (var4[var10] != 0 || var11 >= var12)) { + var9 = false; + } + break; + } + + if (var10 == 3) { + var9 = false; + } + } + } while(var9); + + var9 = true; + + do { + ++var5; + + for (var10 = 0; var10 < 4; ++var10) { + if (var3[var10] == 2) { + var11 = var0[var5].index; + var12 = var8.index; + } else if (var3[var10] == 1) { + var11 = var0[var5].population; + var12 = var8.population; + if (var11 == -1 && var4[var10] == 1) { + var11 = 2001; + } + + if (var12 == -1 && var4[var10] == 1) { + var12 = 2001; + } + } else if (var3[var10] == 3) { + var11 = var0[var5].isMembersOnly() ? 1 : 0; + var12 = var8.isMembersOnly() ? 1 : 0; + } else { + var11 = var0[var5].id; + var12 = var8.id; + } + + if (var11 != var12) { + if ((var4[var10] != 1 || var11 >= var12) && (var4[var10] != 0 || var11 <= var12)) { + var9 = false; + } + break; + } + + if (var10 == 3) { + var9 = false; + } + } + } while(var9); + + if (var5 < var6) { + World var13 = var0[var5]; + var0[var5] = var0[var6]; + var0[var6] = var13; + } + } + + sortWorlds(var0, var1, var6, var3, var4); + sortWorlds(var0, var6 + 1, var2, var3, var4); + } + } - @ObfuscatedName("r") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;II)I", - garbageValue = "-2101135652" + signature = "(Lkf;I)V", + garbageValue = "-1107196386" ) - public static int method29(CharSequence var0, int var1) { - return SoundCache.parseIntCustomRadix(var0, var1, true); + static final void method49(PacketBuffer var0) { + for (int var1 = 0; var1 < Players.Players_pendingUpdateCount; ++var1) { + int var2 = Players.Players_pendingUpdateIndices[var1]; + Player var3 = Client.players[var2]; + int var4 = var0.readUnsignedByte(); + if ((var4 & 2) != 0) { + var4 += var0.readUnsignedByte() << 8; + } + + class189.method3797(var0, var2, var3, var4); + } + } - @ObfuscatedName("kk") + @ObfuscatedName("b") @ObfuscatedSignature( - signature = "(Lho;I)I", - garbageValue = "425196182" + signature = "(ILcj;ZB)I", + garbageValue = "59" ) - @Export("getWidgetClickMask") - static int getWidgetClickMask(Widget var0) { - IntegerNode var1 = (IntegerNode)Client.widgetClickMasks.get(((long)var0.id << 32) + (long)var0.childIndex); - return var1 != null ? var1.integer : var0.clickMask; + static int method32(int var0, Script var1, boolean var2) { + Widget var3; + if (var0 == ScriptOpcodes.IF_GETINVOBJECT) { + var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemId; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETINVCOUNT) { + var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + if (var3.itemId != -1) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.itemQuantity; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.IF_HASSUB) { + int var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + InterfaceParent var4 = (InterfaceParent)Client.interfaceParents.get((long)var5); + if (var4 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.IF_GETTOP) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.rootInterface; + return 1; + } else { + return 2; + } } } diff --git a/runescape-client/src/main/java/class208.java b/runescape-client/src/main/java/class208.java index 1fcb14eae2..f4afd5d922 100644 --- a/runescape-client/src/main/java/class208.java +++ b/runescape-client/src/main/java/class208.java @@ -2,66 +2,12 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hh") +@ObfuscatedName("hg") public class class208 { - @ObfuscatedName("gd") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(B)I", - garbageValue = "15" + signature = "[Llw;" ) - @Export("getHighestVisiblePlane") - static final int getHighestVisiblePlane() { - if (AbstractArchive.clientPreferences.roofsHidden) { - return WorldMapRectangle.plane; - } else { - int var0 = MusicPatchPcmStream.getTileHeight(GrandExchangeOfferOwnWorldComparator.cameraX, WorldMapIcon_1.cameraZ, WorldMapRectangle.plane); - return var0 - Varcs.cameraY < 800 && (Tiles.Tiles_renderFlags[WorldMapRectangle.plane][GrandExchangeOfferOwnWorldComparator.cameraX >> 7][WorldMapIcon_1.cameraZ >> 7] & 4) != 0 ? WorldMapRectangle.plane : 3; - } - } - - @ObfuscatedName("hx") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "73357396" - ) - @Export("Widget_runOnTargetLeave") - static void Widget_runOnTargetLeave() { - if (Client.isSpellSelected) { - Widget var0 = GrandExchangeOfferWorldComparator.getWidgetChild(AttackOption.selectedSpellWidget, Client.selectedSpellChildIndex); - if (var0 != null && var0.onTargetLeave != null) { - ScriptEvent var1 = new ScriptEvent(); - var1.widget = var0; - var1.args = var0.onTargetLeave; - ParamDefinition.runScriptEvent(var1); - } - - Client.isSpellSelected = false; - WorldMapSectionType.invalidateWidget(var0); - } - } - - @ObfuscatedName("ju") - @ObfuscatedSignature( - signature = "(IIIILlf;Lhz;I)V", - garbageValue = "1204804321" - ) - @Export("drawSpriteOnMinimap") - static final void drawSpriteOnMinimap(int var0, int var1, int var2, int var3, Sprite var4, SpriteMask var5) { - if (var4 != null) { - int var6 = Client.camAngleY & 2047; - int var7 = var3 * var3 + var2 * var2; - if (var7 <= 6400) { - int var8 = Rasterizer3D.Rasterizer3D_sine[var6]; - int var9 = Rasterizer3D.Rasterizer3D_cosine[var6]; - int var10 = var9 * var2 + var3 * var8 >> 16; - int var11 = var3 * var9 - var8 * var2 >> 16; - if (var7 > 2500) { - var4.method6088(var10 + var5.width / 2 - var4.width / 2, var5.height / 2 - var11 - var4.height / 2, var0, var1, var5.width, var5.height, var5.xStarts, var5.xWidths); - } else { - var4.drawTransBgAt(var0 + var10 + var5.width / 2 - var4.width / 2, var5.height / 2 + var1 - var11 - var4.height / 2); - } - - } - } - } + @Export("runesSprite") + static IndexedSprite[] runesSprite; } diff --git a/runescape-client/src/main/java/class210.java b/runescape-client/src/main/java/class210.java index a3ff465787..3c16418b82 100644 --- a/runescape-client/src/main/java/class210.java +++ b/runescape-client/src/main/java/class210.java @@ -2,35 +2,12 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hk") +@ObfuscatedName("hw") public class class210 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lht;" + signature = "Lhx;" ) @Export("huffman") - public static Huffman huffman; - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(ILjava/lang/String;Ljava/lang/String;B)V", - garbageValue = "-65" - ) - @Export("addGameMessage") - static void addGameMessage(int var0, String var1, String var2) { - WorldMapData_1.addChatMessage(var0, var1, var2, (String)null); - } - - @ObfuscatedName("fl") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2143242016" - ) - static void method3948() { - PacketBufferNode var0 = InterfaceParent.getPacketBufferNode(ClientPacket.field2256, Client.packetWriter.isaacCipher); - var0.packetBuffer.writeByte(class247.getWindowedMode()); - var0.packetBuffer.writeShort(FloorDecoration.canvasWidth); - var0.packetBuffer.writeShort(WallDecoration.canvasHeight); - Client.packetWriter.addNode(var0); - } + static Huffman huffman; } diff --git a/runescape-client/src/main/java/class215.java b/runescape-client/src/main/java/class215.java index d8e48a088b..2453f203bc 100644 --- a/runescape-client/src/main/java/class215.java +++ b/runescape-client/src/main/java/class215.java @@ -1,20 +1,31 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("he") +@ObfuscatedName("hh") public class class215 { - @ObfuscatedName("z") - public static final short[] field2531; + @ObfuscatedName("a") + public static final short[] field2524; + @ObfuscatedName("t") + public static final short[][] field2527; @ObfuscatedName("n") - public static final short[][] field2530; - @ObfuscatedName("v") - public static final short[] field2532; - @ObfuscatedName("u") - public static final short[][] field2529; + public static final short[] field2526; + @ObfuscatedName("q") + public static final short[][] field2525; + @ObfuscatedName("o") + @Export("Widget_loadedInterfaces") + static boolean[] Widget_loadedInterfaces; + @ObfuscatedName("jp") + @ObfuscatedSignature( + signature = "Lbj;" + ) + @Export("localPlayer") + static Player localPlayer; static { - field2531 = new short[]{6798, 8741, 25238, 4626, 4550}; - field2530 = new short[][]{{6798, 107, 10283, 16, 4797, 7744, 5799, 4634, -31839, 22433, 2983, -11343, 8, 5281, 10438, 3650, -27322, -21845, 200, 571, 908, 21830, 28946, -15701, -14010}, {8741, 12, -1506, -22374, 7735, 8404, 1701, -27106, 24094, 10153, -8915, 4783, 1341, 16578, -30533, 25239, 8, 5281, 10438, 3650, -27322, -21845, 200, 571, 908, 21830, 28946, -15701, -14010}, {25238, 8742, 12, -1506, -22374, 7735, 8404, 1701, -27106, 24094, 10153, -8915, 4783, 1341, 16578, -30533, 8, 5281, 10438, 3650, -27322, -21845, 200, 571, 908, 21830, 28946, -15701, -14010}, {4626, 11146, 6439, 12, 4758, 10270}, {4550, 4537, 5681, 5673, 5790, 6806, 8076, 4574, 17050, 0, 127, -31821, -17991}}; - field2532 = new short[]{-10304, 9104, -1, -1, -1}; - field2529 = new short[][]{{6554, 115, 10304, 28, 5702, 7756, 5681, 4510, -31835, 22437, 2859, -11339, 16, 5157, 10446, 3658, -27314, -21965, 472, 580, 784, 21966, 28950, -15697, -14002}, {9104, 10275, 7595, 3610, 7975, 8526, 918, -26734, 24466, 10145, -6882, 5027, 1457, 16565, -30545, 25486, 24, 5392, 10429, 3673, -27335, -21957, 192, 687, 412, 21821, 28835, -15460, -14019}, new short[0], new short[0], new short[0]}; + field2524 = new short[]{6798, 8741, 25238, 4626, 4550}; + field2527 = new short[][]{{6798, 107, 10283, 16, 4797, 7744, 5799, 4634, -31839, 22433, 2983, -11343, 8, 5281, 10438, 3650, -27322, -21845, 200, 571, 908, 21830, 28946, -15701, -14010}, {8741, 12, -1506, -22374, 7735, 8404, 1701, -27106, 24094, 10153, -8915, 4783, 1341, 16578, -30533, 25239, 8, 5281, 10438, 3650, -27322, -21845, 200, 571, 908, 21830, 28946, -15701, -14010}, {25238, 8742, 12, -1506, -22374, 7735, 8404, 1701, -27106, 24094, 10153, -8915, 4783, 1341, 16578, -30533, 8, 5281, 10438, 3650, -27322, -21845, 200, 571, 908, 21830, 28946, -15701, -14010}, {4626, 11146, 6439, 12, 4758, 10270}, {4550, 4537, 5681, 5673, 5790, 6806, 8076, 4574, 17050, 0, 127, -31821, -17991}}; + field2526 = new short[]{-10304, 9104, -1, -1, -1}; + field2525 = new short[][]{{6554, 115, 10304, 28, 5702, 7756, 5681, 4510, -31835, 22437, 2859, -11339, 16, 5157, 10446, 3658, -27314, -21965, 472, 580, 784, 21966, 28950, -15697, -14002}, {9104, 10275, 7595, 3610, 7975, 8526, 918, -26734, 24466, 10145, -6882, 5027, 1457, 16565, -30545, 25486, 24, 5392, 10429, 3673, -27335, -21957, 192, 687, 412, 21821, 28835, -15460, -14019}, new short[0], new short[0], new short[0]}; } } diff --git a/runescape-client/src/main/java/class216.java b/runescape-client/src/main/java/class216.java index 15eab8db4b..57b653960d 100644 --- a/runescape-client/src/main/java/class216.java +++ b/runescape-client/src/main/java/class216.java @@ -1,191 +1,166 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("hq") +@ObfuscatedName("hb") public class class216 { - @ObfuscatedName("z") + @ObfuscatedName("sd") @ObfuscatedSignature( - signature = "(II)Liy;", - garbageValue = "1314955897" + signature = "Llk;" ) - @Export("KitDefinition_get") - public static KitDefinition KitDefinition_get(int var0) { - KitDefinition var1 = (KitDefinition)KitDefinition.KitDefinition_cached.get((long)var0); - if (var1 != null) { - return var1; + @Export("platformInfo") + static PlatformInfo platformInfo; + @ObfuscatedName("dg") + @ObfuscatedSignature( + signature = "Lij;" + ) + @Export("archive6") + static Archive archive6; + + @ObfuscatedName("am") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-855506422" + ) + static int method4196(int var0, Script var1, boolean var2) { + int var3; + if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERTYPE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].type(); + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERITEM) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].id; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERPRICE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].unitPrice; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERCOUNT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].totalQuantity; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERCOMPLETEDCOUNT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentQuantity; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_GETOFFERCOMPLETEDGOLD) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.grandExchangeOffers[var3].currentPrice; + return 1; } else { - byte[] var2 = KitDefinition.KitDefinition_archive.takeFile(3, var0); - var1 = new KitDefinition(); - if (var2 != null) { - var1.decode(new Buffer(var2)); - } - - KitDefinition.KitDefinition_cached.put(var1, (long)var0); - return var1; - } - } - - @ObfuscatedName("ia") - @ObfuscatedSignature( - signature = "(Lho;IB)I", - garbageValue = "25" - ) - static final int method4015(Widget var0, int var1) { - if (var0.cs1Instructions != null && var1 < var0.cs1Instructions.length) { - try { - int[] var2 = var0.cs1Instructions[var1]; - int var3 = 0; - int var4 = 0; - byte var5 = 0; - - while (true) { - int var6 = var2[var4++]; - int var7 = 0; - byte var8 = 0; - if (var6 == 0) { - return var3; + int var12; + if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFEREMPTY) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var12 = Client.grandExchangeOffers[var3].status(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 0 ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFERSTABLE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var12 = Client.grandExchangeOffers[var3].status(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 2 ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFERFINISHED) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var12 = Client.grandExchangeOffers[var3].status(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 5 ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.STOCKMARKET_ISOFFERADDING) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var12 = Client.grandExchangeOffers[var3].status(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var12 == 1 ? 1 : 0; + return 1; + } else { + boolean var13; + if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_NAME) { + var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (WorldMapData_1.grandExchangeEvents != null) { + WorldMapData_1.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_nameComparator, var13); } - if (var6 == 1) { - var7 = Client.currentLevels[var2[var4++]]; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_PRICE) { + var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (WorldMapData_1.grandExchangeEvents != null) { + WorldMapData_1.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_priceComparator, var13); } - if (var6 == 2) { - var7 = Client.levels[var2[var4++]]; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTFILTERBY_WORLD) { + Interpreter.Interpreter_intStackSize -= 2; + var13 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] == 1; + boolean var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; + if (WorldMapData_1.grandExchangeEvents != null) { + Client.GrandExchangeEvents_worldComparator.filterWorlds = var4; + WorldMapData_1.grandExchangeEvents.sort(Client.GrandExchangeEvents_worldComparator, var13); } - if (var6 == 3) { - var7 = Client.experience[var2[var4++]]; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_AGE) { + var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (WorldMapData_1.grandExchangeEvents != null) { + WorldMapData_1.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_ageComparator, var13); } - int var9; - Widget var10; - int var11; - int var12; - if (var6 == 4) { - var9 = var2[var4++] << 16; - var9 += var2[var4++]; - var10 = Canvas.getWidget(var9); - var11 = var2[var4++]; - if (var11 != -1 && (!Occluder.ItemDefinition_get(var11).isMembersOnly || Client.isMembersWorld)) { - for (var12 = 0; var12 < var10.itemIds.length; ++var12) { - if (var11 + 1 == var10.itemIds[var12]) { - var7 += var10.itemQuantities[var12]; - } - } - } + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_SORTBY_COUNT) { + var13 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (WorldMapData_1.grandExchangeEvents != null) { + WorldMapData_1.grandExchangeEvents.sort(GrandExchangeEvents.GrandExchangeEvents_quantityComparator, var13); } - if (var6 == 5) { - var7 = Varps.Varps_main[var2[var4++]]; - } - - if (var6 == 6) { - var7 = Skills.Skills_experienceTable[Client.levels[var2[var4++]] - 1]; - } - - if (var6 == 7) { - var7 = Varps.Varps_main[var2[var4++]] * 100 / 46875; - } - - if (var6 == 8) { - var7 = class223.localPlayer.combatLevel; - } - - if (var6 == 9) { - for (var9 = 0; var9 < 25; ++var9) { - if (Skills.Skills_enabled[var9]) { - var7 += Client.levels[var9]; - } - } - } - - if (var6 == 10) { - var9 = var2[var4++] << 16; - var9 += var2[var4++]; - var10 = Canvas.getWidget(var9); - var11 = var2[var4++]; - if (var11 != -1 && (!Occluder.ItemDefinition_get(var11).isMembersOnly || Client.isMembersWorld)) { - for (var12 = 0; var12 < var10.itemIds.length; ++var12) { - if (var11 + 1 == var10.itemIds[var12]) { - var7 = 999999999; - break; - } - } - } - } - - if (var6 == 11) { - var7 = Client.runEnergy; - } - - if (var6 == 12) { - var7 = Client.weight; - } - - if (var6 == 13) { - var9 = Varps.Varps_main[var2[var4++]]; - int var13 = var2[var4++]; - var7 = (var9 & 1 << var13) != 0 ? 1 : 0; - } - - if (var6 == 14) { - var9 = var2[var4++]; - var7 = WorldMapSprite.getVarbit(var9); - } - - if (var6 == 15) { - var8 = 1; - } - - if (var6 == 16) { - var8 = 2; - } - - if (var6 == 17) { - var8 = 3; - } - - if (var6 == 18) { - var7 = class223.baseX * 64 + (class223.localPlayer.x >> 7); - } - - if (var6 == 19) { - var7 = class286.baseY * 64 + (class223.localPlayer.y >> 7); - } - - if (var6 == 20) { - var7 = var2[var4++]; - } - - if (var8 == 0) { - if (var5 == 0) { - var3 += var7; - } - - if (var5 == 1) { - var3 -= var7; - } - - if (var5 == 2 && var7 != 0) { - var3 /= var7; - } - - if (var5 == 3) { - var3 *= var7; - } - - var5 = 0; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETTOTALOFFERS) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapData_1.grandExchangeEvents == null ? 0 : WorldMapData_1.grandExchangeEvents.events.size(); + return 1; + } else { + GrandExchangeEvent var11; + if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERWORLD) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.world; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERNAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var11.getOfferName(); + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERPREVIOUSNAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var11.getPreviousOfferName(); + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERAGE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + long var5 = PlayerAppearance.currentTimeMillis() - Message.field584 - var11.age; + int var7 = (int)(var5 / 3600000L); + int var8 = (int)((var5 - (long)(var7 * 3600000)) / 60000L); + int var9 = (int)((var5 - (long)(var7 * 3600000) - (long)(var8 * 60000)) / 1000L); + String var10 = var7 + ":" + var8 / 10 + var8 % 10 + ":" + var9 / 10 + var9 % 10; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var10; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERCOUNT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.totalQuantity; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERPRICE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.unitPrice; + return 1; + } else if (var0 == ScriptOpcodes.TRADINGPOST_GETOFFERITEM) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var11 = (GrandExchangeEvent)WorldMapData_1.grandExchangeEvents.events.get(var3); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.grandExchangeOffer.id; + return 1; } else { - var5 = var8; + return 2; } } - } catch (Exception var14) { - return -1; } - } else { - return -2; } } } diff --git a/runescape-client/src/main/java/class218.java b/runescape-client/src/main/java/class218.java new file mode 100644 index 0000000000..bad34195d2 --- /dev/null +++ b/runescape-client/src/main/java/class218.java @@ -0,0 +1,100 @@ +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("hk") +public class class218 { + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-975900209" + ) + public static void method4255() { + synchronized(ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock) { + if (ArchiveDiskActionHandler.field3132 != 0) { + ArchiveDiskActionHandler.field3132 = 1; + + try { + ArchiveDiskActionHandler.ArchiveDiskActionHandler_lock.wait(); + } catch (InterruptedException var3) { + } + } + + } + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "([BIIIIIIILek;[Lfm;I)V", + garbageValue = "538821166" + ) + static final void method4263(byte[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, Scene var8, CollisionMap[] var9) { + Buffer var10 = new Buffer(var0); + int var11 = -1; + + while (true) { + int var12 = var10.method5623(); + if (var12 == 0) { + return; + } + + var11 += var12; + int var13 = 0; + + while (true) { + int var14 = var10.readUShortSmart(); + if (var14 == 0) { + break; + } + + var13 += var14 - 1; + int var15 = var13 & 63; + int var16 = var13 >> 6 & 63; + int var17 = var13 >> 12; + int var18 = var10.readUnsignedByte(); + int var19 = var18 >> 2; + int var20 = var18 & 3; + if (var17 == var4 && var16 >= var5 && var16 < var5 + 8 && var15 >= var6 && var15 < var6 + 8) { + ObjectDefinition var21 = WorldMapDecorationType.getObjectDefinition(var11); + int var22 = var2 + FloorDecoration.method3010(var16 & 7, var15 & 7, var7, var21.sizeX, var21.sizeY, var20); + int var25 = var16 & 7; + int var26 = var15 & 7; + int var28 = var21.sizeX; + int var29 = var21.sizeY; + int var30; + if ((var20 & 1) == 1) { + var30 = var28; + var28 = var29; + var29 = var30; + } + + int var27 = var7 & 3; + int var24; + if (var27 == 0) { + var24 = var26; + } else if (var27 == 1) { + var24 = 7 - var25 - (var28 - 1); + } else if (var27 == 2) { + var24 = 7 - var26 - (var29 - 1); + } else { + var24 = var25; + } + + var30 = var24 + var3; + if (var22 > 0 && var30 > 0 && var22 < 103 && var30 < 103) { + int var31 = var1; + if ((Tiles.Tiles_renderFlags[1][var22][var30] & 2) == 2) { + var31 = var1 - 1; + } + + CollisionMap var32 = null; + if (var31 >= 0) { + var32 = var9[var31]; + } + + class247.method4637(var1, var22, var30, var11, var20 + var7 & 3, var19, var8, var32); + } + } + } + } + } +} diff --git a/runescape-client/src/main/java/class219.java b/runescape-client/src/main/java/class219.java deleted file mode 100644 index 1c35c70c41..0000000000 --- a/runescape-client/src/main/java/class219.java +++ /dev/null @@ -1,239 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; - -@ObfuscatedName("hg") -public class class219 { - @ObfuscatedName("qe") - @ObfuscatedSignature( - signature = "Ldv;" - ) - @Export("pcmPlayer0") - static PcmPlayer pcmPlayer0; - @ObfuscatedName("pe") - @ObfuscatedSignature( - signature = "Lkc;" - ) - @Export("privateChatMode") - static PrivateChatMode privateChatMode; - - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "689014870" - ) - public static void method4079() { - SpotAnimationDefinition.SpotAnimationDefinition_cached.clear(); - SpotAnimationDefinition.SpotAnimationDefinition_cachedModels.clear(); - } - - @ObfuscatedName("ak") - @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "412788434" - ) - static int method4081(int var0) { - return (int)((Math.log((double)var0) / Interpreter.field1077 - 7.0D) * 256.0D); - } - - @ObfuscatedName("am") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1490314370" - ) - static int method4080(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.WORLDLIST_FETCH) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = BufferedNetSocket.loadWorlds() ? 1 : 0; - return 1; - } else { - World var3; - if (var0 == ScriptOpcodes.WORLDLIST_START) { - var3 = ModelData0.worldListStart(); - if (var3 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.id; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.properties; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.activity; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.location; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.population; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.host; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDLIST_NEXT) { - var3 = AbstractByteArrayCopier.getNextWorldListWorld(); - if (var3 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.id; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.properties; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.activity; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.location; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.population; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.host; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else { - World var4; - int var5; - int var7; - if (var0 == ScriptOpcodes.WORLDLIST_SPECIFIC) { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var4 = null; - - for (var5 = 0; var5 < World.World_count; ++var5) { - if (var7 == World.World_worlds[var5].id) { - var4 = World.World_worlds[var5]; - break; - } - } - - if (var4 != null) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.id; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.properties; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.activity; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.location; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.population; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.host; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } else if (var0 == ScriptOpcodes.WORLDLIST_SORT) { - Interpreter.Interpreter_intStackSize -= 4; - var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - boolean var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; - var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - boolean var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3] == 1; - class49.sortWorldList(var7, var10, var5, var6); - return 1; - } else if (var0 != ScriptOpcodes.GETWORLDINFO) { - if (var0 == ScriptOpcodes.SETFOLLOWEROPSLOWPRIORITY) { - Client.followerOpsLowPriority = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else { - int var8; - ParamDefinition var9; - if (var0 == ScriptOpcodes.NC_PARAM) { - Interpreter.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var9 = WallDecoration.getParamDefinition(var8); - if (var9.isString()) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = PacketBufferNode.getNpcDefinition(var7).getStringParam(var8, var9.defaultStr); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = PacketBufferNode.getNpcDefinition(var7).getIntParam(var8, var9.defaultInt); - } - - return 1; - } else if (var0 == ScriptOpcodes.LC_PARAM) { - Interpreter.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var9 = WallDecoration.getParamDefinition(var8); - if (var9.isString()) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var7).getStringParam(var8, var9.defaultStr); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var7).getIntParam(var8, var9.defaultInt); - } - - return 1; - } else if (var0 == ScriptOpcodes.OC_PARAM) { - Interpreter.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var9 = WallDecoration.getParamDefinition(var8); - if (var9.isString()) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Occluder.ItemDefinition_get(var7).getStringParam(var8, var9.defaultStr); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Occluder.ItemDefinition_get(var7).getIntParam(var8, var9.defaultInt); - } - - return 1; - } else if (var0 == ScriptOpcodes.STRUCT_PARAM) { - Interpreter.Interpreter_intStackSize -= 2; - var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var8 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var9 = WallDecoration.getParamDefinition(var8); - if (var9.isString()) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = JagexCache.StructDefinition_getStructDefinition(var7).getStringParam(var8, var9.defaultStr); - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = JagexCache.StructDefinition_getStructDefinition(var7).getIntParam(var8, var9.defaultInt); - } - - return 1; - } else if (var0 == ScriptOpcodes.ON_MOBILE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.onMobile ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.CLIENTTYPE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.clientType & 3; - return 1; - } else if (var0 == 6520) { - return 1; - } else if (var0 == ScriptOpcodes.MOBILE_KEYBOARDHIDE) { - return 1; - } else if (var0 == 6522) { - --Interpreter.Interpreter_stringStackSize; - --Interpreter.Interpreter_intStackSize; - return 1; - } else if (var0 == 6523) { - --Interpreter.Interpreter_stringStackSize; - --Interpreter.Interpreter_intStackSize; - return 1; - } else if (var0 == ScriptOpcodes.BATTERYLEVEL) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - return 1; - } else if (var0 == ScriptOpcodes.BATTERYCHARGING) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - return 1; - } else if (var0 == ScriptOpcodes.WIFIAVAILABLE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; - return 1; - } else { - return 2; - } - } - } else { - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var7 >= 0 && var7 < World.World_count) { - var4 = World.World_worlds[var7]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.id; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.properties; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.activity; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.location; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var4.population; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var4.host; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } - - return 1; - } - } - } - } -} diff --git a/runescape-client/src/main/java/class222.java b/runescape-client/src/main/java/class222.java index 2e2fd5f505..b37182dfc7 100644 --- a/runescape-client/src/main/java/class222.java +++ b/runescape-client/src/main/java/class222.java @@ -1,145 +1,125 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("hu") +@ObfuscatedName("hz") public class class222 { - @ObfuscatedName("c") + @ObfuscatedName("o") + @Export("ByteArrayPool_altSizeArrayCounts") + static int[] ByteArrayPool_altSizeArrayCounts; + @ObfuscatedName("eh") @ObfuscatedGetter( - intValue = -1634764861 + intValue = -1324768135 ) - static int field2729; + @Export("port1") + static int port1; - @ObfuscatedName("as") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1931429415" + signature = "(II)Liw;", + garbageValue = "779944842" ) - static int method4090(int var0, Script var1, boolean var2) { - int var3; - if (var0 == ScriptOpcodes.OC_NAME) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = Occluder.ItemDefinition_get(var3).name; - return 1; + @Export("ItemDefinition_get") + public static ItemDefinition ItemDefinition_get(int var0) { + ItemDefinition var1 = (ItemDefinition)ItemDefinition.ItemDefinition_cached.get((long)var0); + if (var1 != null) { + return var1; } else { - int var4; - ItemDefinition var5; - if (var0 == ScriptOpcodes.OC_OP) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var5 = Occluder.ItemDefinition_get(var3); - if (var4 >= 1 && var4 <= 5 && var5.groundActions[var4 - 1] != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var5.groundActions[var4 - 1]; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } + byte[] var2 = ItemDefinition.ItemDefinition_archive.takeFile(10, var0); + var1 = new ItemDefinition(); + var1.id = var0; + if (var2 != null) { + var1.decode(new Buffer(var2)); + } - return 1; - } else if (var0 == ScriptOpcodes.OC_IOP) { - Interpreter.Interpreter_intStackSize -= 2; - var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var5 = Occluder.ItemDefinition_get(var3); - if (var4 >= 1 && var4 <= 5 && var5.inventoryActions[var4 - 1] != null) { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var5.inventoryActions[var4 - 1]; - } else { - Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = ""; - } + var1.post(); + if (var1.noteTemplate != -1) { + var1.genCert(ItemDefinition_get(var1.noteTemplate), ItemDefinition_get(var1.note)); + } - return 1; - } else if (var0 == ScriptOpcodes.OC_COST) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Occluder.ItemDefinition_get(var3).price; - return 1; - } else if (var0 == ScriptOpcodes.OC_STACKABLE) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Occluder.ItemDefinition_get(var3).isStackable == 1 ? 1 : 0; - return 1; - } else { - ItemDefinition var6; - if (var0 == ScriptOpcodes.OC_CERT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Occluder.ItemDefinition_get(var3); - if (var6.noteTemplate == -1 && var6.note >= 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.note; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + if (var1.notedId != -1) { + var1.genBought(ItemDefinition_get(var1.notedId), ItemDefinition_get(var1.unnotedId)); + } + + if (var1.placeholderTemplate != -1) { + var1.genPlaceholder(ItemDefinition_get(var1.placeholderTemplate), ItemDefinition_get(var1.placeholder)); + } + + if (!ItemDefinition.ItemDefinition_inMembersWorld && var1.isMembersOnly) { + var1.name = "Members object"; + var1.isTradable = false; + var1.groundActions = null; + var1.inventoryActions = null; + var1.shiftClickIndex = -1; + var1.team = 0; + if (var1.params != null) { + boolean var3 = false; + + for (Node var4 = var1.params.first(); var4 != null; var4 = var1.params.next()) { + ParamDefinition var5 = class162.getParamDefinition((int)var4.key); + if (var5.autoDisable) { + var4.remove(); + } else { + var3 = true; + } } - return 1; - } else if (var0 == ScriptOpcodes.OC_UNCERT) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Occluder.ItemDefinition_get(var3); - if (var6.noteTemplate >= 0 && var6.note >= 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.note; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; + if (!var3) { + var1.params = null; } - - return 1; - } else if (var0 == ScriptOpcodes.OC_MEMBERS) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Occluder.ItemDefinition_get(var3).isMembersOnly ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.OC_PLACEHOLDER) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Occluder.ItemDefinition_get(var3); - if (var6.placeholderTemplate == -1 && var6.placeholder >= 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.placeholder; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; - } - - return 1; - } else if (var0 == ScriptOpcodes.OC_UNPLACEHOLDER) { - var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var6 = Occluder.ItemDefinition_get(var3); - if (var6.placeholderTemplate >= 0 && var6.placeholder >= 0) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.placeholder; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3; - } - - return 1; - } else if (var0 == ScriptOpcodes.OC_FIND) { - String var7 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - Canvas.findItemDefinitions(var7, var4 == 1); - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = DevicePcmPlayerProvider.foundItemIdCount; - return 1; - } else if (var0 != ScriptOpcodes.OC_FINDNEXT) { - if (var0 == ScriptOpcodes.OC_FINDRESET) { - ReflectionCheck.foundItemIndex = 0; - return 1; - } else { - return 2; - } - } else { - if (WorldMapIcon_0.foundItemIds != null && ReflectionCheck.foundItemIndex < DevicePcmPlayerProvider.foundItemIdCount) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapIcon_0.foundItemIds[++ReflectionCheck.foundItemIndex - 1] & '\uffff'; - } else { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; - } - - return 1; } } + + ItemDefinition.ItemDefinition_cached.put(var1, (long)var0); + return var1; } } - @ObfuscatedName("an") + @ObfuscatedName("m") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "1936251414" + signature = "(Ljava/lang/String;I)Ljava/lang/String;", + garbageValue = "-1844662442" ) - static int method4089(int var0, Script var1, boolean var2) { - if (var0 == ScriptOpcodes.LOGOUT) { - Client.logoutTimer = 250; - return 1; - } else { - return 2; + public static String method4274(String var0) { + int var1 = var0.length(); + char[] var2 = new char[var1]; + byte var3 = 2; + + for (int var4 = 0; var4 < var1; ++var4) { + char var5 = var0.charAt(var4); + if (var3 == 0) { + var5 = Character.toLowerCase(var5); + } else if (var3 == 2 || Character.isUpperCase(var5)) { + var5 = class173.method3720(var5); + } + + if (Character.isLetter(var5)) { + var3 = 0; + } else if (var5 != '.' && var5 != '?' && var5 != '!') { + if (Character.isSpaceChar(var5)) { + if (var3 != 2) { + var3 = 1; + } + } else { + var3 = 1; + } + } else { + var3 = 2; + } + + var2[var4] = var5; } + + return new String(var2); + } + + @ObfuscatedName("jh") + @ObfuscatedSignature( + signature = "(B)Z", + garbageValue = "-8" + ) + static boolean method4272() { + return Client.tapToDrop || KeyHandler.KeyHandler_pressedKeys[81]; } } diff --git a/runescape-client/src/main/java/class223.java b/runescape-client/src/main/java/class223.java deleted file mode 100644 index 40f1066693..0000000000 --- a/runescape-client/src/main/java/class223.java +++ /dev/null @@ -1,20 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("hi") -public class class223 { - @ObfuscatedName("fw") - @ObfuscatedGetter( - intValue = -369406041 - ) - @Export("baseX") - static int baseX; - @ObfuscatedName("jk") - @ObfuscatedSignature( - signature = "Lbi;" - ) - @Export("localPlayer") - static Player localPlayer; -} diff --git a/runescape-client/src/main/java/class225.java b/runescape-client/src/main/java/class225.java deleted file mode 100644 index e3de3884bb..0000000000 --- a/runescape-client/src/main/java/class225.java +++ /dev/null @@ -1,19 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("hf") -public class class225 { - @ObfuscatedName("qy") - @ObfuscatedGetter( - intValue = 666180224 - ) - static int field3045; - @ObfuscatedName("dx") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive6") - static Archive archive6; -} diff --git a/runescape-client/src/main/java/class226.java b/runescape-client/src/main/java/class226.java index fe289b321f..c405feef84 100644 --- a/runescape-client/src/main/java/class226.java +++ b/runescape-client/src/main/java/class226.java @@ -1,64 +1,68 @@ -import net.runelite.mapping.Export; +import java.applet.Applet; +import java.net.URL; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import netscape.javascript.JSObject; -@ObfuscatedName("hd") +@ObfuscatedName("hc") public class class226 { - @ObfuscatedName("z") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(I)[Lhj;", - garbageValue = "133309082" + signature = "(Ljava/lang/String;ILjava/lang/String;I)Z", + garbageValue = "-1976934272" ) - @Export("PlayerType_values") - public static PlayerType[] PlayerType_values() { - return new PlayerType[]{PlayerType.PlayerType_jagexModerator, PlayerType.PlayerType_normal, PlayerType.PlayerType_playerModerator, PlayerType.PlayerType_ironman, PlayerType.PlayerType_hardcoreIronman, PlayerType.PlayerType_ultimateIronman}; - } - - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "(II)Lep;", - garbageValue = "1928253690" - ) - @Export("getFrames") - static Frames getFrames(int var0) { - Frames var1 = (Frames)SequenceDefinition.SequenceDefinition_cachedFrames.get((long)var0); - if (var1 != null) { - return var1; - } else { - AbstractArchive var3 = SequenceDefinition.SequenceDefinition_animationsArchive; - AbstractArchive var4 = class188.SequenceDefinition_skeletonsArchive; - boolean var5 = true; - int[] var6 = var3.getGroupFileIds(var0); - - for (int var7 = 0; var7 < var6.length; ++var7) { - byte[] var8 = var3.getFile(var0, var6[var7]); - if (var8 == null) { - var5 = false; + static boolean method4275(String var0, int var1, String var2) { + if (var1 == 0) { + try { + if (!class51.field416.startsWith("win")) { + throw new Exception(); + } else if (!var0.startsWith("http://") && !var0.startsWith("https://")) { + throw new Exception(); } else { - int var9 = (var8[0] & 255) << 8 | var8[1] & 255; - byte[] var10 = var4.getFile(var9, 0); - if (var10 == null) { - var5 = false; + String var13 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789?&=,.%+-_#:/*"; + + for (int var4 = 0; var4 < var0.length(); ++var4) { + if (var13.indexOf(var0.charAt(var4)) == -1) { + throw new Exception(); + } } + + Runtime.getRuntime().exec("cmd /c start \"j\" \"" + var0 + "\""); + return true; } + } catch (Throwable var8) { + return false; + } + } else if (var1 == 1) { + try { + Applet var7 = class51.applet; + Object[] var5 = new Object[]{(new URL(class51.applet.getCodeBase(), var0)).toString()}; + Object var3 = JSObject.getWindow(var7).call(var2, var5); + return var3 != null; + } catch (Throwable var9) { + return false; + } + } else if (var1 == 2) { + try { + class51.applet.getAppletContext().showDocument(new URL(class51.applet.getCodeBase(), var0), "_blank"); + return true; + } catch (Exception var10) { + return false; + } + } else if (var1 == 3) { + try { + class47.method923(class51.applet, "loggedout"); + } catch (Throwable var12) { } - Frames var2; - if (!var5) { - var2 = null; - } else { - try { - var2 = new Frames(var3, var4, var0, false); - } catch (Exception var12) { - var2 = null; - } + try { + class51.applet.getAppletContext().showDocument(new URL(class51.applet.getCodeBase(), var0), "_top"); + return true; + } catch (Exception var11) { + return false; } - - if (var2 != null) { - SequenceDefinition.SequenceDefinition_cachedFrames.put(var2, (long)var0); - } - - return var2; + } else { + throw new IllegalArgumentException(); } } } diff --git a/runescape-client/src/main/java/class227.java b/runescape-client/src/main/java/class227.java index 11d2f2cf0f..2e88e3b2fd 100644 --- a/runescape-client/src/main/java/class227.java +++ b/runescape-client/src/main/java/class227.java @@ -1,51 +1,17 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("hw") +@ObfuscatedName("hl") public final class class227 { - @ObfuscatedName("ny") - @ObfuscatedGetter( - intValue = 130681721 - ) - static int field3061; - - @ObfuscatedName("je") + @ObfuscatedName("gl") @ObfuscatedSignature( - signature = "(Lho;IIS)V", - garbageValue = "16256" + signature = "(I)V", + garbageValue = "401085216" ) - @Export("clickWidget") - static final void clickWidget(Widget var0, int var1, int var2) { - if (Client.clickedWidget == null && !Client.isMenuOpen) { - if (var0 != null) { - Widget var4 = GrandExchangeEvents.method81(var0); - if (var4 == null) { - var4 = var0.parent; - } - - if (var4 != null) { - Client.clickedWidget = var0; - var4 = GrandExchangeEvents.method81(var0); - if (var4 == null) { - var4 = var0.parent; - } - - Client.clickedWidgetParent = var4; - Client.widgetClickX = var1; - Client.widgetClickY = var2; - ViewportMouse.widgetDragDuration = 0; - Client.isDraggingWidget = false; - int var5 = BuddyRankComparator.getNewestMenuIdx(); - if (var5 != -1) { - ChatChannel.method2229(var5); - } - - return; - } - } - + static void method4276() { + if (Client.renderSelf) { + Player.addPlayerToScene(class215.localPlayer, false); } + } } diff --git a/runescape-client/src/main/java/class237.java b/runescape-client/src/main/java/class237.java index 0c52963886..581ffdbfc6 100644 --- a/runescape-client/src/main/java/class237.java +++ b/runescape-client/src/main/java/class237.java @@ -4,71 +4,53 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ib") +@ObfuscatedName("if") public class class237 { - @ObfuscatedName("z") + @ObfuscatedName("i") + static int[] field3174; + @ObfuscatedName("a") @Export("spriteMap") final HashMap spriteMap; - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lll;" + signature = "Lls;" ) @Export("bounds") Bounds bounds; + @ObfuscatedName("n") + int[] field3178; + @ObfuscatedName("q") + int[] field3172; @ObfuscatedName("v") - int[] field3163; - @ObfuscatedName("u") - int[] field3161; - @ObfuscatedName("r") @ObfuscatedGetter( - intValue = 459040833 + intValue = -82085665 ) - int field3165; + int field3169; public class237() { this.spriteMap = new HashMap(); this.bounds = new Bounds(0, 0); - this.field3163 = new int[2048]; - this.field3161 = new int[2048]; - this.field3165 = 0; - class267.field3540 = new int[2000]; - int var1 = 0; - int var2 = 240; - - int var4; - for (byte var3 = 12; var1 < 16; var2 -= var3) { - var4 = ScriptFrame.method1158((double)((float)var2 / 360.0F), 0.9998999834060669D, (double)(0.075F + 0.425F * (float)var1 / 16.0F)); - class267.field3540[var1] = var4; - ++var1; - } - - var2 = 48; - - for (int var6 = var2 / 6; var1 < class267.field3540.length; var2 -= var6) { - var4 = var1 * 2; - - for (int var5 = ScriptFrame.method1158((double)((float)var2 / 360.0F), 0.9998999834060669D, 0.5D); var1 < var4 && var1 < class267.field3540.length; ++var1) { - class267.field3540[var1] = var5; - } - } - + this.field3178 = new int[2048]; + this.field3172 = new int[2048]; + this.field3169 = 0; + MusicPatchNode2.method3829(); } - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(II)V", - garbageValue = "1811962046" + garbageValue = "-324807595" ) - void method4299(int var1) { + void method4474(int var1) { int var2 = var1 * 2 + 1; - double[] var3 = class287.method5221(0.0D, (double)((float)var1 / 3.0F), var1); + double[] var3 = GrandExchangeEvent.method123(0.0D, (double)((float)var1 / 3.0F), var1); double var4 = var3[var1] * var3[var1]; int[] var6 = new int[var2 * var2]; boolean var7 = false; for (int var8 = 0; var8 < var2; ++var8) { for (int var9 = 0; var9 < var2; ++var9) { - int var10 = var6[var9 + var8 * var2] = (int)(256.0D * (var3[var8] * var3[var9] / var4)); + int var10 = var6[var9 + var2 * var8] = (int)(var3[var9] * var3[var8] / var4 * 256.0D); if (!var7 && var10 > 0) { var7 = true; } @@ -81,47 +63,47 @@ public class class237 { @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IB)Llf;", - garbageValue = "-125" + signature = "(II)Llx;", + garbageValue = "165886637" ) - Sprite method4298(int var1) { + Sprite method4475(int var1) { if (!this.spriteMap.containsKey(var1)) { - this.method4299(var1); + this.method4474(var1); } return (Sprite)this.spriteMap.get(var1); } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIB)V", - garbageValue = "-43" + garbageValue = "0" ) - public final void method4301(int var1, int var2) { - if (this.field3165 < this.field3163.length) { - this.field3163[this.field3165] = var1; - this.field3161[this.field3165] = var2; - ++this.field3165; + public final void method4476(int var1, int var2) { + if (this.field3169 < this.field3178.length) { + this.field3178[this.field3169] = var1; + this.field3172[this.field3169] = var2; + ++this.field3169; } } - @ObfuscatedName("u") + @ObfuscatedName("v") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1335191014" + garbageValue = "-1020689105" ) - public final void method4300() { - this.field3165 = 0; + public final void method4482() { + this.field3169 = 0; } - @ObfuscatedName("r") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(IILlf;FI)V", - garbageValue = "-177737442" + signature = "(IILlx;FI)V", + garbageValue = "1589672394" ) - public final void method4303(int var1, int var2, Sprite var3, float var4) { - int var5 = (int)(var4 * 18.0F); - Sprite var6 = this.method4298(var5); + public final void method4478(int var1, int var2, Sprite var3, float var4) { + int var5 = (int)(18.0F * var4); + Sprite var6 = this.method4475(var5); int var7 = var5 * 2 + 1; Bounds var8 = new Bounds(0, 0, var3.subWidth, var3.subHeight); Bounds var9 = new Bounds(0, 0); @@ -131,14 +113,14 @@ public class class237 { int var10; int var11; int var12; - for (var10 = 0; var10 < this.field3165; ++var10) { - var11 = this.field3163[var10]; - var12 = this.field3161[var10]; - int var13 = (int)((float)(var11 - var1) * var4) - var5; - int var14 = (int)((float)var3.subHeight - var4 * (float)(var12 - var2)) - var5; + for (var10 = 0; var10 < this.field3169; ++var10) { + var11 = this.field3178[var10]; + var12 = this.field3172[var10]; + int var13 = (int)(var4 * (float)(var11 - var1)) - var5; + int var14 = (int)((float)var3.subHeight - (float)(var12 - var2) * var4) - var5; this.bounds.setLow(var13, var14); - this.bounds.method5913(var8, var9); - this.method4304(var6, var3, var9); + this.bounds.method6081(var8, var9); + this.method4481(var6, var3, var9); } System.nanoTime(); @@ -152,11 +134,11 @@ public class class237 { if (var11 <= 0) { var3.pixels[var10] = -16777216; } else { - if (var11 > class267.field3540.length) { - var11 = class267.field3540.length; + if (var11 > field3174.length) { + var11 = field3174.length; } - var12 = class267.field3540[var11 - 1]; + var12 = field3174[var11 - 1]; var3.pixels[var10] = -16777216 | var12; } } @@ -165,12 +147,12 @@ public class class237 { System.nanoTime(); } - @ObfuscatedName("p") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Llf;Llf;Lll;I)V", - garbageValue = "-1255792875" + signature = "(Llx;Llx;Lls;B)V", + garbageValue = "-75" ) - void method4304(Sprite var1, Sprite var2, Bounds var3) { + void method4481(Sprite var1, Sprite var2, Bounds var3) { if (var3.highX != 0 && var3.highY != 0) { int var4 = 0; int var5 = 0; @@ -183,7 +165,7 @@ public class class237 { } int var6 = var4 + var5 * var1.subWidth; - int var7 = var3.lowX + var2.subWidth * var3.lowY; + int var7 = var2.subWidth * var3.lowY + var3.lowX; for (int var8 = 0; var8 < var3.highY; ++var8) { for (int var9 = 0; var9 < var3.highX; ++var9) { @@ -198,4 +180,23 @@ public class class237 { } } + + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(I)Z", + garbageValue = "1735465507" + ) + @Export("isKeyDown") + public static final boolean isKeyDown() { + synchronized(KeyHandler.KeyHandler_instance) { + if (KeyHandler.field385 == KeyHandler.field370) { + return false; + } else { + WorldMapLabel.field229 = KeyHandler.field382[KeyHandler.field385]; + DevicePcmPlayerProvider.field395 = KeyHandler.field381[KeyHandler.field385]; + KeyHandler.field385 = KeyHandler.field385 + 1 & 127; + return true; + } + } + } } diff --git a/runescape-client/src/main/java/class247.java b/runescape-client/src/main/java/class247.java index 8a66fd6ea0..a907464567 100644 --- a/runescape-client/src/main/java/class247.java +++ b/runescape-client/src/main/java/class247.java @@ -1,37 +1,511 @@ import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("iw") +@ObfuscatedName("ic") public class class247 { - @ObfuscatedName("z") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(II)Ljava/lang/String;", - garbageValue = "1617248140" + signature = "Lhq;" ) - static String method4455(int var0) { - return ""; - } + @Export("musicTrackArchive") + public static AbstractArchive musicTrackArchive; + @ObfuscatedName("ha") + @ObfuscatedGetter( + intValue = -896528309 + ) + @Export("cameraPitch") + static int cameraPitch; - @ObfuscatedName("fw") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "1170068749" + signature = "(Lkf;IB)Z", + garbageValue = "-45" ) - @Export("getWindowedMode") - static int getWindowedMode() { - return Client.isResizable ? 2 : 1; - } + @Export("updateExternalPlayer") + static boolean updateExternalPlayer(PacketBuffer var0, int var1) { + int var2 = var0.readBits(2); + int var3; + int var4; + int var7; + int var8; + int var9; + int var10; + if (var2 == 0) { + if (var0.readBits(1) != 0) { + updateExternalPlayer(var0, var1); + } - @ObfuscatedName("iu") - @ObfuscatedSignature( - signature = "(IIIZB)V", - garbageValue = "-73" - ) - @Export("resizeComponents") - static final void resizeComponents(int var0, int var1, int var2, boolean var3) { - if (WorldMapData_0.loadInterface(var0)) { - FaceNormal.resizeInterface(UserComparator5.Widget_interfaceComponents[var0], -1, var1, var2, var3); + var3 = var0.readBits(13); + var4 = var0.readBits(13); + boolean var12 = var0.readBits(1) == 1; + if (var12) { + Players.Players_pendingUpdateIndices[++Players.Players_pendingUpdateCount - 1] = var1; + } + + if (Client.players[var1] != null) { + throw new RuntimeException(); + } else { + Player var6 = Client.players[var1] = new Player(); + var6.index = var1; + if (Players.field1229[var1] != null) { + var6.read(Players.field1229[var1]); + } + + var6.orientation = Players.Players_orientations[var1]; + var6.targetIndex = Players.Players_targetIndices[var1]; + var7 = Players.Players_regions[var1]; + var8 = var7 >> 28; + var9 = var7 >> 14 & 255; + var10 = var7 & 255; + var6.pathTraversed[0] = Players.field1228[var1]; + var6.plane = (byte)var8; + var6.resetPath((var9 << 13) + var3 - UserComparator8.baseX * 64, (var10 << 13) + var4 - HealthBar.baseY * 64); + var6.field606 = false; + return true; + } + } else if (var2 == 1) { + var3 = var0.readBits(2); + var4 = Players.Players_regions[var1]; + Players.Players_regions[var1] = (var4 & 268435455) + (((var4 >> 28) + var3 & 3) << 28); + return false; + } else { + int var5; + int var11; + if (var2 == 2) { + var3 = var0.readBits(5); + var4 = var3 >> 3; + var5 = var3 & 7; + var11 = Players.Players_regions[var1]; + var7 = (var11 >> 28) + var4 & 3; + var8 = var11 >> 14 & 255; + var9 = var11 & 255; + if (var5 == 0) { + --var8; + --var9; + } + + if (var5 == 1) { + --var9; + } + + if (var5 == 2) { + ++var8; + --var9; + } + + if (var5 == 3) { + --var8; + } + + if (var5 == 4) { + ++var8; + } + + if (var5 == 5) { + --var8; + ++var9; + } + + if (var5 == 6) { + ++var9; + } + + if (var5 == 7) { + ++var8; + ++var9; + } + + Players.Players_regions[var1] = (var8 << 14) + var9 + (var7 << 28); + return false; + } else { + var3 = var0.readBits(18); + var4 = var3 >> 16; + var5 = var3 >> 8 & 255; + var11 = var3 & 255; + var7 = Players.Players_regions[var1]; + var8 = (var7 >> 28) + var4 & 3; + var9 = var5 + (var7 >> 14) & 255; + var10 = var7 + var11 & 255; + Players.Players_regions[var1] = (var9 << 14) + var10 + (var8 << 28); + return false; + } } } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(IIIIIILek;Lfm;B)V", + garbageValue = "-74" + ) + static final void method4637(int var0, int var1, int var2, int var3, int var4, int var5, Scene var6, CollisionMap var7) { + if (!Client.isLowDetail || (Tiles.Tiles_renderFlags[0][var1][var2] & 2) != 0 || (Tiles.Tiles_renderFlags[var0][var1][var2] & 16) == 0) { + if (var0 < Tiles.Tiles_minPlane) { + Tiles.Tiles_minPlane = var0; + } + + ObjectDefinition var8 = WorldMapDecorationType.getObjectDefinition(var3); + int var9; + int var10; + if (var4 != 1 && var4 != 3) { + var9 = var8.sizeX; + var10 = var8.sizeY; + } else { + var9 = var8.sizeY; + var10 = var8.sizeX; + } + + int var11; + int var12; + if (var9 + var1 <= 104) { + var11 = (var9 >> 1) + var1; + var12 = (var9 + 1 >> 1) + var1; + } else { + var11 = var1; + var12 = var1 + 1; + } + + int var13; + int var14; + if (var10 + var2 <= 104) { + var13 = (var10 >> 1) + var2; + var14 = var2 + (var10 + 1 >> 1); + } else { + var13 = var2; + var14 = var2 + 1; + } + + int[][] var15 = Tiles.Tiles_heights[var0]; + int var16 = var15[var11][var14] + var15[var12][var13] + var15[var11][var13] + var15[var12][var14] >> 2; + int var17 = (var1 << 7) + (var9 << 6); + int var18 = (var2 << 7) + (var10 << 6); + long var19 = class160.calculateTag(var1, var2, 2, var8.int1 == 0, var3); + int var21 = var5 + (var4 << 6); + if (var8.int3 == 1) { + var21 += 256; + } + + if (var8.hasSound()) { + ScriptEvent.method1274(var0, var1, var2, var8, var4); + } + + Object var22; + if (var5 == 22) { + if (!Client.isLowDetail || var8.int1 != 0 || var8.interactType == 1 || var8.boolean2) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(22, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 22, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newFloorDecoration(var0, var1, var2, var16, (Entity)var22, var19, var21); + if (var8.interactType == 1 && var7 != null) { + var7.setBlockedByFloorDec(var1, var2); + } + + } + } else { + int var23; + if (var5 != 10 && var5 != 11) { + int[] var10000; + if (var5 >= 12) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(var5, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, var5, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.method3213(var0, var1, var2, var16, 1, 1, (Entity)var22, 0, var19, var21); + if (var5 >= 12 && var5 <= 17 && var5 != 13 && var0 > 0) { + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 2340; + } + + if (var8.interactType != 0 && var7 != null) { + var7.addGameObject(var1, var2, var9, var10, var8.boolean1); + } + + } else if (var5 == 0) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(0, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 0, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var22, (Entity)null, Tiles.field489[var4], 0, var19, var21); + if (var4 == 0) { + if (var8.clipped) { + class96.field1300[var0][var1][var2] = 50; + class96.field1300[var0][var1][var2 + 1] = 50; + } + + if (var8.modelClipped) { + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 585; + } + } else if (var4 == 1) { + if (var8.clipped) { + class96.field1300[var0][var1][var2 + 1] = 50; + class96.field1300[var0][var1 + 1][var2 + 1] = 50; + } + + if (var8.modelClipped) { + var10000 = Tiles.field488[var0][var1]; + var10000[1 + var2] |= 1170; + } + } else if (var4 == 2) { + if (var8.clipped) { + class96.field1300[var0][var1 + 1][var2] = 50; + class96.field1300[var0][var1 + 1][var2 + 1] = 50; + } + + if (var8.modelClipped) { + var10000 = Tiles.field488[var0][var1 + 1]; + var10000[var2] |= 585; + } + } else if (var4 == 3) { + if (var8.clipped) { + class96.field1300[var0][var1][var2] = 50; + class96.field1300[var0][var1 + 1][var2] = 50; + } + + if (var8.modelClipped) { + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 1170; + } + } + + if (var8.interactType != 0 && var7 != null) { + var7.method3685(var1, var2, var5, var4, var8.boolean1); + } + + if (var8.int2 != 16) { + var6.method3327(var0, var1, var2, var8.int2); + } + + } else if (var5 == 1) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(1, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 1, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var22, (Entity)null, Tiles.field490[var4], 0, var19, var21); + if (var8.clipped) { + if (var4 == 0) { + class96.field1300[var0][var1][var2 + 1] = 50; + } else if (var4 == 1) { + class96.field1300[var0][var1 + 1][var2 + 1] = 50; + } else if (var4 == 2) { + class96.field1300[var0][var1 + 1][var2] = 50; + } else if (var4 == 3) { + class96.field1300[var0][var1][var2] = 50; + } + } + + if (var8.interactType != 0 && var7 != null) { + var7.method3685(var1, var2, var5, var4, var8.boolean1); + } + + } else { + int var28; + if (var5 == 2) { + var28 = var4 + 1 & 3; + Object var29; + Object var30; + if (var8.animationId == -1 && var8.transforms == null) { + var29 = var8.getEntity(2, var4 + 4, var15, var17, var16, var18); + var30 = var8.getEntity(2, var28, var15, var17, var16, var18); + } else { + var29 = new DynamicObject(var3, 2, var4 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); + var30 = new DynamicObject(var3, 2, var28, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var29, (Entity)var30, Tiles.field489[var4], Tiles.field489[var28], var19, var21); + if (var8.modelClipped) { + if (var4 == 0) { + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 585; + var10000 = Tiles.field488[var0][var1]; + var10000[1 + var2] |= 1170; + } else if (var4 == 1) { + var10000 = Tiles.field488[var0][var1]; + var10000[1 + var2] |= 1170; + var10000 = Tiles.field488[var0][var1 + 1]; + var10000[var2] |= 585; + } else if (var4 == 2) { + var10000 = Tiles.field488[var0][var1 + 1]; + var10000[var2] |= 585; + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 1170; + } else if (var4 == 3) { + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 1170; + var10000 = Tiles.field488[var0][var1]; + var10000[var2] |= 585; + } + } + + if (var8.interactType != 0 && var7 != null) { + var7.method3685(var1, var2, var5, var4, var8.boolean1); + } + + if (var8.int2 != 16) { + var6.method3327(var0, var1, var2, var8.int2); + } + + } else if (var5 == 3) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(3, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 3, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newBoundaryObject(var0, var1, var2, var16, (Entity)var22, (Entity)null, Tiles.field490[var4], 0, var19, var21); + if (var8.clipped) { + if (var4 == 0) { + class96.field1300[var0][var1][var2 + 1] = 50; + } else if (var4 == 1) { + class96.field1300[var0][var1 + 1][var2 + 1] = 50; + } else if (var4 == 2) { + class96.field1300[var0][var1 + 1][var2] = 50; + } else if (var4 == 3) { + class96.field1300[var0][var1][var2] = 50; + } + } + + if (var8.interactType != 0 && var7 != null) { + var7.method3685(var1, var2, var5, var4, var8.boolean1); + } + + } else if (var5 == 9) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(var5, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, var5, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.method3213(var0, var1, var2, var16, 1, 1, (Entity)var22, 0, var19, var21); + if (var8.interactType != 0 && var7 != null) { + var7.addGameObject(var1, var2, var9, var10, var8.boolean1); + } + + if (var8.int2 != 16) { + var6.method3327(var0, var1, var2, var8.int2); + } + + } else if (var5 == 4) { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(4, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 4, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newWallDecoration(var0, var1, var2, var16, (Entity)var22, (Entity)null, Tiles.field489[var4], 0, 0, 0, var19, var21); + } else { + long var31; + Object var33; + if (var5 == 5) { + var28 = 16; + var31 = var6.getBoundaryObjectTag(var0, var1, var2); + if (0L != var31) { + var28 = WorldMapDecorationType.getObjectDefinition(UserComparator8.Entity_unpackID(var31)).int2; + } + + if (var8.animationId == -1 && var8.transforms == null) { + var33 = var8.getEntity(4, var4, var15, var17, var16, var18); + } else { + var33 = new DynamicObject(var3, 4, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newWallDecoration(var0, var1, var2, var16, (Entity)var33, (Entity)null, Tiles.field489[var4], 0, var28 * Tiles.field491[var4], var28 * Tiles.field498[var4], var19, var21); + } else if (var5 == 6) { + var28 = 8; + var31 = var6.getBoundaryObjectTag(var0, var1, var2); + if (var31 != 0L) { + var28 = WorldMapDecorationType.getObjectDefinition(UserComparator8.Entity_unpackID(var31)).int2 / 2; + } + + if (var8.animationId == -1 && var8.transforms == null) { + var33 = var8.getEntity(4, var4 + 4, var15, var17, var16, var18); + } else { + var33 = new DynamicObject(var3, 4, var4 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newWallDecoration(var0, var1, var2, var16, (Entity)var33, (Entity)null, 256, var4, var28 * Tiles.field493[var4], var28 * Tiles.field494[var4], var19, var21); + } else if (var5 == 7) { + var23 = var4 + 2 & 3; + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(4, var23 + 4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 4, var23 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newWallDecoration(var0, var1, var2, var16, (Entity)var22, (Entity)null, 256, var23, 0, 0, var19, var21); + } else if (var5 == 8) { + var28 = 8; + var31 = var6.getBoundaryObjectTag(var0, var1, var2); + if (var31 != 0L) { + var28 = WorldMapDecorationType.getObjectDefinition(UserComparator8.Entity_unpackID(var31)).int2 / 2; + } + + int var27 = var4 + 2 & 3; + Object var26; + if (var8.animationId == -1 && var8.transforms == null) { + var33 = var8.getEntity(4, var4 + 4, var15, var17, var16, var18); + var26 = var8.getEntity(4, var27 + 4, var15, var17, var16, var18); + } else { + var33 = new DynamicObject(var3, 4, var4 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); + var26 = new DynamicObject(var3, 4, var27 + 4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + var6.newWallDecoration(var0, var1, var2, var16, (Entity)var33, (Entity)var26, 256, var4, var28 * Tiles.field493[var4], var28 * Tiles.field494[var4], var19, var21); + } + } + } + } else { + if (var8.animationId == -1 && var8.transforms == null) { + var22 = var8.getEntity(10, var4, var15, var17, var16, var18); + } else { + var22 = new DynamicObject(var3, 10, var4, var0, var1, var2, var8.animationId, true, (Entity)null); + } + + if (var22 != null && var6.method3213(var0, var1, var2, var16, var9, var10, (Entity)var22, var5 == 11 ? 256 : 0, var19, var21) && var8.clipped) { + var23 = 15; + if (var22 instanceof Model) { + var23 = ((Model)var22).method3027() / 4; + if (var23 > 30) { + var23 = 30; + } + } + + for (int var24 = 0; var24 <= var9; ++var24) { + for (int var25 = 0; var25 <= var10; ++var25) { + if (var23 > class96.field1300[var0][var24 + var1][var25 + var2]) { + class96.field1300[var0][var24 + var1][var25 + var2] = (byte)var23; + } + } + } + } + + if (var8.interactType != 0 && var7 != null) { + var7.addGameObject(var1, var2, var9, var10, var8.boolean1); + } + + } + } + } + } + + @ObfuscatedName("r") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "1946170477" + ) + static final void method4642() { + Object var10000 = null; + String var0 = "You can't add yourself to your own ignore list"; + class30.addGameMessage(30, "", var0); + } } diff --git a/runescape-client/src/main/java/class266.java b/runescape-client/src/main/java/class266.java index acc618eb71..25d3fbe94e 100644 --- a/runescape-client/src/main/java/class266.java +++ b/runescape-client/src/main/java/class266.java @@ -1,7 +1,18 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jf") +@ObfuscatedName("jy") public class class266 { - @ObfuscatedName("g") - public static String[] field3537; + @ObfuscatedName("lq") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "69" + ) + @Export("Clan_leaveChat") + static final void Clan_leaveChat() { + PacketBufferNode var0 = SoundSystem.getPacketBufferNode(ClientPacket.field2267, Client.packetWriter.isaacCipher); + var0.packetBuffer.writeByte(0); + Client.packetWriter.addNode(var0); + } } diff --git a/runescape-client/src/main/java/class267.java b/runescape-client/src/main/java/class267.java deleted file mode 100644 index e1565c72b9..0000000000 --- a/runescape-client/src/main/java/class267.java +++ /dev/null @@ -1,24 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("jc") -public class class267 { - @ObfuscatedName("y") - static int[] field3540; - - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "(IIIZII)J", - garbageValue = "1752014522" - ) - @Export("calculateTag") - public static long calculateTag(int var0, int var1, int var2, boolean var3, int var4) { - long var5 = (long)((var0 & 127) << 0 | (var1 & 127) << 7 | (var2 & 3) << 14) | ((long)var4 & 4294967295L) << 17; - if (var3) { - var5 |= 65536L; - } - - return var5; - } -} diff --git a/runescape-client/src/main/java/class268.java b/runescape-client/src/main/java/class268.java index 75e885132c..6c3762dc39 100644 --- a/runescape-client/src/main/java/class268.java +++ b/runescape-client/src/main/java/class268.java @@ -1,16 +1,9 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("jg") +@ObfuscatedName("jo") public class class268 { - @ObfuscatedName("ay") - @ObfuscatedSignature( - signature = "(Ljava/lang/String;I)I", - garbageValue = "-456041774" - ) - @Export("stringCp1252NullTerminatedByteSize") - public static int stringCp1252NullTerminatedByteSize(String var0) { - return var0.length() + 1; - } + @ObfuscatedName("ba") + @Export("otp") + static String otp; } diff --git a/runescape-client/src/main/java/class269.java b/runescape-client/src/main/java/class269.java index 83aefd4541..fb9510adf5 100644 --- a/runescape-client/src/main/java/class269.java +++ b/runescape-client/src/main/java/class269.java @@ -1,13 +1,14 @@ -import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ja") +@ObfuscatedName("jz") public class class269 { - @ObfuscatedName("sq") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Llt;" + signature = "(Lhq;Lhq;III)Lks;", + garbageValue = "1409785665" ) - @Export("platformInfo") - static PlatformInfo platformInfo; + public static Font method5114(AbstractArchive var0, AbstractArchive var1, int var2, int var3) { + return !class32.method618(var0, var2, var3) ? null : RouteStrategy.method3738(var1.takeFile(var2, var3)); + } } diff --git a/runescape-client/src/main/java/class286.java b/runescape-client/src/main/java/class286.java index 0a1463de15..95667d1a08 100644 --- a/runescape-client/src/main/java/class286.java +++ b/runescape-client/src/main/java/class286.java @@ -2,12 +2,12 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("kq") +@ObfuscatedName("kv") public class class286 { - @ObfuscatedName("fn") + @ObfuscatedName("f") @ObfuscatedGetter( - intValue = -2101282847 + intValue = 678872033 ) - @Export("baseY") - static int baseY; + @Export("canvasWidth") + public static int canvasWidth; } diff --git a/runescape-client/src/main/java/class287.java b/runescape-client/src/main/java/class287.java index f118c2264e..d05b6eab83 100644 --- a/runescape-client/src/main/java/class287.java +++ b/runescape-client/src/main/java/class287.java @@ -4,45 +4,122 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("kk") public class class287 { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("cp1252AsciiExtension") - static final char[] cp1252AsciiExtension; - @ObfuscatedName("q") - static byte[][][] field3634; + public static final char[] cp1252AsciiExtension; static { cp1252AsciiExtension = new char[]{'€', '\u0000', '‚', 'ƒ', '„', '…', '†', '‡', 'ˆ', '‰', 'Š', '‹', 'Œ', '\u0000', 'Ž', '\u0000', '\u0000', '‘', '’', '“', '”', '•', '–', '—', '˜', '™', 'š', '›', 'œ', '\u0000', 'ž', 'Ÿ'}; } - @ObfuscatedName("n") + @ObfuscatedName("id") @ObfuscatedSignature( - signature = "(DDII)[D", - garbageValue = "-1793531075" + signature = "(IIIILjava/lang/String;I)V", + garbageValue = "643605546" ) - public static double[] method5221(double var0, double var2, int var4) { - int var5 = var4 * 2 + 1; - double[] var6 = new double[var5]; - int var7 = -var4; + @Export("widgetDefaultMenuAction") + static void widgetDefaultMenuAction(int var0, int var1, int var2, int var3, String var4) { + Widget var5 = ArchiveLoader.getWidgetChild(var1, var2); + if (var5 != null) { + if (var5.onOp != null) { + ScriptEvent var6 = new ScriptEvent(); + var6.widget = var5; + var6.opIndex = var0; + var6.targetName = var4; + var6.args = var5.onOp; + GrandExchangeOfferAgeComparator.runScriptEvent(var6); + } - for (int var8 = 0; var7 <= var4; ++var8) { - var6[var8] = TaskHandler.method3429((double)var7, var0, var2); - ++var7; + boolean var8 = true; + if (var5.contentType > 0) { + var8 = WorldMapIcon_0.method237(var5); + } + + if (var8) { + if (ModelData0.method3379(class195.getWidgetClickMask(var5), var0 - 1)) { + PacketBufferNode var7; + if (var0 == 1) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2185, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 2) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2218, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 3) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2248, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 4) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2250, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 5) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2273, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 6) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2263, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 7) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2276, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 8) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2191, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 9) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2186, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + if (var0 == 10) { + var7 = SoundSystem.getPacketBufferNode(ClientPacket.field2259, Client.packetWriter.isaacCipher); + var7.packetBuffer.writeInt(var1); + var7.packetBuffer.writeShort(var2); + var7.packetBuffer.writeShort(var3); + Client.packetWriter.addNode(var7); + } + + } + } } - - return var6; - } - - @ObfuscatedName("kf") - @ObfuscatedSignature( - signature = "(IIIZI)V", - garbageValue = "326242369" - ) - public static void method5220(int var0, int var1, int var2, boolean var3) { - PacketBufferNode var4 = InterfaceParent.getPacketBufferNode(ClientPacket.field2191, Client.packetWriter.isaacCipher); - var4.packetBuffer.method5461(var2); - var4.packetBuffer.writeIntLE16(var3 ? Client.field718 : 0); - var4.packetBuffer.writeShort(var1); - var4.packetBuffer.writeShortLE(var0); - Client.packetWriter.addNode(var4); } } diff --git a/runescape-client/src/main/java/class288.java b/runescape-client/src/main/java/class288.java index 5a513aa3d3..62c31ec85e 100644 --- a/runescape-client/src/main/java/class288.java +++ b/runescape-client/src/main/java/class288.java @@ -2,37 +2,27 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ke") +@ObfuscatedName("kr") public final class class288 { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("base37Table") - public static final char[] base37Table; - @ObfuscatedName("n") - static long[] field3638; + static final char[] base37Table; + @ObfuscatedName("t") + static long[] field3633; + @ObfuscatedName("bt") + @ObfuscatedSignature( + signature = "Llw;" + ) + @Export("worldSelectLeftSprite") + static IndexedSprite worldSelectLeftSprite; static { base37Table = new char[]{'_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; - field3638 = new long[12]; + field3633 = new long[12]; - for (int var0 = 0; var0 < field3638.length; ++var0) { - field3638[var0] = (long)Math.pow(37.0D, (double)var0); + for (int var0 = 0; var0 < field3633.length; ++var0) { + field3633[var0] = (long)Math.pow(37.0D, (double)var0); } } - - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "(Ljava/lang/CharSequence;I)I", - garbageValue = "757556043" - ) - public static int method5224(CharSequence var0) { - int var1 = var0.length(); - int var2 = 0; - - for (int var3 = 0; var3 < var1; ++var3) { - var2 = (var2 << 5) - var2 + var0.charAt(var3); - } - - return var2; - } } diff --git a/runescape-client/src/main/java/class289.java b/runescape-client/src/main/java/class289.java index 016c84787a..2bd1e8d1d4 100644 --- a/runescape-client/src/main/java/class289.java +++ b/runescape-client/src/main/java/class289.java @@ -1,207 +1,89 @@ import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("ks") +@ObfuscatedName("kh") public class class289 { - @ObfuscatedName("z") - static char[] field3641; + @ObfuscatedName("a") + static char[] field3636; + @ObfuscatedName("t") + static char[] field3635; @ObfuscatedName("n") - static char[] field3643; - @ObfuscatedName("v") - static char[] field3642; - @ObfuscatedName("u") - static int[] field3640; + static char[] field3637; + @ObfuscatedName("q") + static int[] field3638; static { - field3641 = new char[64]; + field3636 = new char[64]; int var0; for (var0 = 0; var0 < 26; ++var0) { - field3641[var0] = (char)(var0 + 65); + field3636[var0] = (char)(var0 + 65); } for (var0 = 26; var0 < 52; ++var0) { - field3641[var0] = (char)(var0 + 97 - 26); + field3636[var0] = (char)(var0 + 97 - 26); } for (var0 = 52; var0 < 62; ++var0) { - field3641[var0] = (char)(var0 + 48 - 52); + field3636[var0] = (char)(var0 + 48 - 52); } - field3641[62] = '+'; - field3641[63] = '/'; - field3643 = new char[64]; + field3636[62] = '+'; + field3636[63] = '/'; + field3635 = new char[64]; for (var0 = 0; var0 < 26; ++var0) { - field3643[var0] = (char)(var0 + 65); + field3635[var0] = (char)(var0 + 65); } for (var0 = 26; var0 < 52; ++var0) { - field3643[var0] = (char)(var0 + 97 - 26); + field3635[var0] = (char)(var0 + 97 - 26); } for (var0 = 52; var0 < 62; ++var0) { - field3643[var0] = (char)(var0 + 48 - 52); + field3635[var0] = (char)(var0 + 48 - 52); } - field3643[62] = '*'; - field3643[63] = '-'; - field3642 = new char[64]; + field3635[62] = '*'; + field3635[63] = '-'; + field3637 = new char[64]; for (var0 = 0; var0 < 26; ++var0) { - field3642[var0] = (char)(var0 + 65); + field3637[var0] = (char)(var0 + 65); } for (var0 = 26; var0 < 52; ++var0) { - field3642[var0] = (char)(var0 + 97 - 26); + field3637[var0] = (char)(var0 + 97 - 26); } for (var0 = 52; var0 < 62; ++var0) { - field3642[var0] = (char)(var0 + 48 - 52); + field3637[var0] = (char)(var0 + 48 - 52); } - field3642[62] = '-'; - field3642[63] = '_'; - field3640 = new int[128]; + field3637[62] = '-'; + field3637[63] = '_'; + field3638 = new int[128]; - for (var0 = 0; var0 < field3640.length; ++var0) { - field3640[var0] = -1; + for (var0 = 0; var0 < field3638.length; ++var0) { + field3638[var0] = -1; } for (var0 = 65; var0 <= 90; ++var0) { - field3640[var0] = var0 - 65; + field3638[var0] = var0 - 65; } for (var0 = 97; var0 <= 122; ++var0) { - field3640[var0] = var0 - 97 + 26; + field3638[var0] = var0 - 97 + 26; } for (var0 = 48; var0 <= 57; ++var0) { - field3640[var0] = var0 - 48 + 52; + field3638[var0] = var0 - 48 + 52; } - int[] var2 = field3640; - field3640[43] = 62; + int[] var2 = field3638; + field3638[43] = 62; var2[42] = 62; - int[] var1 = field3640; - field3640[47] = 63; + int[] var1 = field3638; + field3638[47] = 63; var1[45] = 63; } - - @ObfuscatedName("gu") - @ObfuscatedSignature( - signature = "(IIZI)V", - garbageValue = "-1781394642" - ) - static final void method5228(int var0, int var1, boolean var2) { - if (!var2 || var0 != ServerPacket.field2131 || MusicPatchNode.field2422 != var1) { - ServerPacket.field2131 = var0; - MusicPatchNode.field2422 = var1; - MouseRecorder.updateGameState(25); - WorldMapSprite.drawLoadingMessage("Loading - please wait.", true); - int var3 = class223.baseX * 64; - int var4 = class286.baseY * 64; - class223.baseX = (var0 - 6) * 8; - class286.baseY = (var1 - 6) * 8; - int var5 = class223.baseX * 64 - var3; - int var6 = class286.baseY * 64 - var4; - var3 = class223.baseX * 64; - var4 = class286.baseY * 64; - - int var7; - int var9; - int[] var10000; - for (var7 = 0; var7 < 32768; ++var7) { - NPC var8 = Client.npcs[var7]; - if (var8 != null) { - for (var9 = 0; var9 < 10; ++var9) { - var10000 = var8.pathX; - var10000[var9] -= var5; - var10000 = var8.pathY; - var10000[var9] -= var6; - } - - var8.x -= var5 * 128; - var8.y -= var6 * 128; - } - } - - for (var7 = 0; var7 < 2048; ++var7) { - Player var21 = Client.players[var7]; - if (var21 != null) { - for (var9 = 0; var9 < 10; ++var9) { - var10000 = var21.pathX; - var10000[var9] -= var5; - var10000 = var21.pathY; - var10000[var9] -= var6; - } - - var21.x -= var5 * 128; - var21.y -= var6 * 128; - } - } - - byte var20 = 0; - byte var18 = 104; - byte var22 = 1; - if (var5 < 0) { - var20 = 103; - var18 = -1; - var22 = -1; - } - - byte var10 = 0; - byte var11 = 104; - byte var12 = 1; - if (var6 < 0) { - var10 = 103; - var11 = -1; - var12 = -1; - } - - int var14; - for (int var13 = var20; var13 != var18; var13 += var22) { - for (var14 = var10; var14 != var11; var14 += var12) { - int var15 = var5 + var13; - int var16 = var6 + var14; - - for (int var17 = 0; var17 < 4; ++var17) { - if (var15 >= 0 && var16 >= 0 && var15 < 104 && var16 < 104) { - Client.groundItems[var17][var13][var14] = Client.groundItems[var17][var15][var16]; - } else { - Client.groundItems[var17][var13][var14] = null; - } - } - } - } - - for (PendingSpawn var19 = (PendingSpawn)Client.pendingSpawns.last(); var19 != null; var19 = (PendingSpawn)Client.pendingSpawns.previous()) { - var19.x -= var5; - var19.y -= var6; - if (var19.x < 0 || var19.y < 0 || var19.x >= 104 || var19.y >= 104) { - var19.remove(); - } - } - - if (Client.destinationX != 0) { - Client.destinationX -= var5; - Client.destinationY -= var6; - } - - Client.soundEffectCount = 0; - Client.isCameraLocked = false; - GrandExchangeOfferOwnWorldComparator.cameraX -= var5 << 7; - WorldMapIcon_1.cameraZ -= var6 << 7; - ObjectSound.oculusOrbFocalPointX -= var5 << 7; - class14.oculusOrbFocalPointY -= var6 << 7; - Client.field643 = -1; - Client.graphicsObjects.clear(); - Client.projectiles.clear(); - - for (var14 = 0; var14 < 4; ++var14) { - Client.collisionMaps[var14].clear(); - } - - } - } } diff --git a/runescape-client/src/main/java/class290.java b/runescape-client/src/main/java/class290.java deleted file mode 100644 index 1755735ebf..0000000000 --- a/runescape-client/src/main/java/class290.java +++ /dev/null @@ -1,122 +0,0 @@ -import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; - -@ObfuscatedName("ki") -public final class class290 { - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(Lkf;IB)Z", - garbageValue = "14" - ) - @Export("updateExternalPlayer") - static boolean updateExternalPlayer(PacketBuffer var0, int var1) { - int var2 = var0.readBits(2); - int var3; - int var4; - int var7; - int var8; - int var9; - int var10; - if (var2 == 0) { - if (var0.readBits(1) != 0) { - updateExternalPlayer(var0, var1); - } - - var3 = var0.readBits(13); - var4 = var0.readBits(13); - boolean var12 = var0.readBits(1) == 1; - if (var12) { - Players.Players_pendingUpdateIndices[++Players.Players_pendingUpdateCount - 1] = var1; - } - - if (Client.players[var1] != null) { - throw new RuntimeException(); - } else { - Player var6 = Client.players[var1] = new Player(); - var6.index = var1; - if (Players.field1236[var1] != null) { - var6.read(Players.field1236[var1]); - } - - var6.orientation = Players.Players_orientations[var1]; - var6.targetIndex = Players.Players_targetIndices[var1]; - var7 = Players.Players_regions[var1]; - var8 = var7 >> 28; - var9 = var7 >> 14 & 255; - var10 = var7 & 255; - var6.pathTraversed[0] = Players.field1235[var1]; - var6.plane = (byte)var8; - var6.resetPath((var9 << 13) + var3 - class223.baseX * 64, (var10 << 13) + var4 - class286.baseY * 64); - var6.field621 = false; - return true; - } - } else if (var2 == 1) { - var3 = var0.readBits(2); - var4 = Players.Players_regions[var1]; - Players.Players_regions[var1] = (var4 & 268435455) + (((var4 >> 28) + var3 & 3) << 28); - return false; - } else { - int var5; - int var11; - if (var2 == 2) { - var3 = var0.readBits(5); - var4 = var3 >> 3; - var5 = var3 & 7; - var11 = Players.Players_regions[var1]; - var7 = (var11 >> 28) + var4 & 3; - var8 = var11 >> 14 & 255; - var9 = var11 & 255; - if (var5 == 0) { - --var8; - --var9; - } - - if (var5 == 1) { - --var9; - } - - if (var5 == 2) { - ++var8; - --var9; - } - - if (var5 == 3) { - --var8; - } - - if (var5 == 4) { - ++var8; - } - - if (var5 == 5) { - --var8; - ++var9; - } - - if (var5 == 6) { - ++var9; - } - - if (var5 == 7) { - ++var8; - ++var9; - } - - Players.Players_regions[var1] = (var8 << 14) + var9 + (var7 << 28); - return false; - } else { - var3 = var0.readBits(18); - var4 = var3 >> 16; - var5 = var3 >> 8 & 255; - var11 = var3 & 255; - var7 = Players.Players_regions[var1]; - var8 = (var7 >> 28) + var4 & 3; - var9 = var5 + (var7 >> 14) & 255; - var10 = var11 + var7 & 255; - Players.Players_regions[var1] = (var9 << 14) + var10 + (var8 << 28); - return false; - } - } - } -} diff --git a/runescape-client/src/main/java/class296.java b/runescape-client/src/main/java/class296.java index 9d149815db..f1a00e35d2 100644 --- a/runescape-client/src/main/java/class296.java +++ b/runescape-client/src/main/java/class296.java @@ -1,20 +1,35 @@ -import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kb") +@ObfuscatedName("ka") public final class class296 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - longValue = 3603656264460916993L + longValue = 2084337511336446697L ) - static long field3688; - @ObfuscatedName("n") + static long field3684; + @ObfuscatedName("t") @ObfuscatedGetter( - longValue = 3509104245048020795L + longValue = 1232556563702335995L ) - static long field3689; - @ObfuscatedName("gn") - @Export("xteaKeys") - static int[][] xteaKeys; + static long field3683; + + @ObfuscatedName("j") + @ObfuscatedSignature( + signature = "(IIB)Z", + garbageValue = "1" + ) + static final boolean method5547(int var0, int var1) { + ObjectDefinition var2 = WorldMapDecorationType.getObjectDefinition(var0); + if (var1 == 11) { + var1 = 10; + } + + if (var1 >= 5 && var1 <= 8) { + var1 = 4; + } + + return var2.method4737(var1); + } } diff --git a/runescape-client/src/main/java/class297.java b/runescape-client/src/main/java/class297.java index 1ab84bcaf1..a27af99e4b 100644 --- a/runescape-client/src/main/java/class297.java +++ b/runescape-client/src/main/java/class297.java @@ -1,38 +1,14 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("kz") +@ObfuscatedName("kj") public class class297 { - @ObfuscatedName("z") + @ObfuscatedName("ag") @ObfuscatedSignature( - signature = "(Lhp;IIB)[Llp;", - garbageValue = "0" + signature = "(Lcc;B)V", + garbageValue = "23" ) - public static IndexedSprite[] method5389(AbstractArchive var0, int var1, int var2) { - if (!VertexNormal.method2962(var0, var1, var2)) { - return null; - } else { - IndexedSprite[] var4 = new IndexedSprite[class325.SpriteBuffer_spriteCount]; - - for (int var5 = 0; var5 < class325.SpriteBuffer_spriteCount; ++var5) { - IndexedSprite var6 = var4[var5] = new IndexedSprite(); - var6.width = class325.SpriteBuffer_spriteWidth; - var6.height = Frames.SpriteBuffer_spriteHeight; - var6.xOffset = class325.SpriteBuffer_xOffsets[var5]; - var6.yOffset = MusicPatchPcmStream.SpriteBuffer_yOffsets[var5]; - var6.subWidth = class325.SpriteBuffer_spriteWidths[var5]; - var6.subHeight = RunException.SpriteBuffer_spriteHeights[var5]; - var6.palette = class325.SpriteBuffer_spritePalette; - var6.pixels = PacketBufferNode.SpriteBuffer_pixels[var5]; - } - - class325.SpriteBuffer_xOffsets = null; - MusicPatchPcmStream.SpriteBuffer_yOffsets = null; - class325.SpriteBuffer_spriteWidths = null; - RunException.SpriteBuffer_spriteHeights = null; - class325.SpriteBuffer_spritePalette = null; - PacketBufferNode.SpriteBuffer_pixels = null; - return var4; - } + public static final void method5550(class99 var0) { + class188.pcmPlayerProvider = var0; } } diff --git a/runescape-client/src/main/java/class3.java b/runescape-client/src/main/java/class3.java index 0b53609bd4..5e22893650 100644 --- a/runescape-client/src/main/java/class3.java +++ b/runescape-client/src/main/java/class3.java @@ -3,529 +3,158 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("u") +@ObfuscatedName("q") public class class3 implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("pc") @ObfuscatedSignature( - signature = "Lu;" + signature = "Lkt;" ) - static final class3 field7; + @Export("privateChatMode") + static PrivateChatMode privateChatMode; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "Lq;" + ) + public static final class3 field18; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lq;" + ) + public static final class3 field17; @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lu;" + signature = "Lq;" ) - static final class3 field15; - @ObfuscatedName("v") + public static final class3 field13; + @ObfuscatedName("cl") @ObfuscatedSignature( - signature = "Lu;" + signature = "Lbe;" ) - static final class3 field8; - @ObfuscatedName("ax") - static String field18; - @ObfuscatedName("dk") - @ObfuscatedSignature( - signature = "Lie;" - ) - @Export("archive5") - static Archive archive5; - @ObfuscatedName("u") + @Export("mouseRecorder") + static MouseRecorder mouseRecorder; + @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1838246195 + intValue = 1740494527 ) final int field12; - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 689062233 + intValue = 1144447827 ) - public final int field9; - @ObfuscatedName("p") - final Class field11; - @ObfuscatedName("q") + public final int field14; + @ObfuscatedName("l") + final Class field16; + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "Lz;" + signature = "La;" ) - public final class0 field13; + final class0 field11; static { - field7 = new class3(1, 0, Integer.class, new class1()); - field15 = new class3(0, 1, Long.class, new class2()); - field8 = new class3(2, 2, String.class, new class4()); + field18 = new class3(0, 0, Integer.class, new class1()); + field17 = new class3(1, 1, Long.class, new class2()); + field13 = new class3(2, 2, String.class, new class4()); } @ObfuscatedSignature( - signature = "(IILjava/lang/Class;Lz;)V" + signature = "(IILjava/lang/Class;La;)V" ) class3(int var1, int var2, Class var3, class0 var4) { this.field12 = var1; - this.field9 = var2; - this.field11 = var3; - this.field13 = var4; + this.field14 = var2; + this.field16 = var3; + this.field11 = var4; + } + + @ObfuscatedName("q") + @ObfuscatedSignature( + signature = "(I)I", + garbageValue = "-1993081102" + ) + @Export("rsOrdinal") + public int rsOrdinal() { + return this.field14; } @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(Lkc;I)Ljava/lang/Object;", + garbageValue = "2039832756" ) - @Export("rsOrdinal") - public int rsOrdinal() { - return this.field9; + public Object method55(Buffer var1) { + return this.field11.vmethod74(var1); } - @ObfuscatedName("u") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lkl;I)Ljava/lang/Object;", - garbageValue = "-1513659890" + signature = "(Ljava/lang/Class;I)Lq;", + garbageValue = "-1626082833" ) - public Object method35(Buffer var1) { - return this.field13.vmethod55(var1); - } + public static class3 method51(Class var0) { + class3[] var1 = new class3[]{field13, field18, field17}; + class3[] var2 = var1; - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(I)[Lu;", - garbageValue = "-1521919568" - ) - public static class3[] method41() { - return new class3[]{field8, field15, field7}; - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "([BIII)Ljava/lang/String;", - garbageValue = "1159986112" - ) - public static String method52(byte[] var0, int var1, int var2) { - StringBuilder var3 = new StringBuilder(); - - for (int var4 = var1; var4 < var2 + var1; var4 += 3) { - int var5 = var0[var4] & 255; - var3.append(class289.field3641[var5 >>> 2]); - if (var4 < var2 - 1) { - int var6 = var0[var4 + 1] & 255; - var3.append(class289.field3641[(var5 & 3) << 4 | var6 >>> 4]); - if (var4 < var2 - 2) { - int var7 = var0[var4 + 2] & 255; - var3.append(class289.field3641[(var6 & 15) << 2 | var7 >>> 6]).append(class289.field3641[var7 & 63]); - } else { - var3.append(class289.field3641[(var6 & 15) << 2]).append("="); - } - } else { - var3.append(class289.field3641[(var5 & 3) << 4]).append("=="); - } - } - - return var3.toString(); - } - - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(Ljava/lang/Class;B)Lu;", - garbageValue = "-104" - ) - public static class3 method33(Class var0) { - class3[] var1 = method41(); - - for (int var2 = 0; var2 < var1.length; ++var2) { - class3 var3 = var1[var2]; - if (var3.field11 == var0) { - return var3; + for (int var3 = 0; var3 < var2.length; ++var3) { + class3 var4 = var2[var3]; + if (var4.field16 == var0) { + return var4; } } return null; } + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(III)I", + garbageValue = "-1591617746" + ) + static int method68(int var0, int var1) { + ItemContainer var2 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); + if (var2 == null) { + return -1; + } else { + return var1 >= 0 && var1 < var2.ids.length ? var2.ids[var1] : -1; + } + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Ljava/lang/Object;Lkc;I)V", + garbageValue = "240271857" + ) + public static void method52(Object var0, Buffer var1) { + class0 var2 = method59(var0.getClass()); + var2.vmethod89(var0, var1); + } + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-2040711536" + signature = "(Ljava/lang/Class;I)La;", + garbageValue = "1094436481" ) - @Export("WorldMapRegion_clearCachedSprites") - static void WorldMapRegion_clearCachedSprites() { - WorldMapRegion.WorldMapRegion_cachedSprites.clear(); - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(IIIII)V", - garbageValue = "1231494139" - ) - static void method51(int var0, int var1, int var2, int var3) { - for (ObjectSound var4 = (ObjectSound)ObjectSound.objectSounds.last(); var4 != null; var4 = (ObjectSound)ObjectSound.objectSounds.previous()) { - if (var4.soundEffectId != -1 || var4.soundEffectIds != null) { - int var5 = 0; - if (var1 > var4.field1059 * 128) { - var5 += var1 - var4.field1059 * 128; - } else if (var1 < var4.x * 16384) { - var5 += var4.x * 16384 - var1; - } - - if (var2 > var4.field1060 * 128) { - var5 += var2 - var4.field1060 * 128; - } else if (var2 < var4.y * 128) { - var5 += var4.y * 128 - var2; - } - - if (var5 - 64 <= var4.field1061 && Client.field868 != 0 && var0 == var4.plane) { - var5 -= 64; - if (var5 < 0) { - var5 = 0; - } - - int var6 = (var4.field1061 - var5) * Client.field868 / var4.field1061; - if (var4.stream1 == null) { - if (var4.soundEffectId >= 0) { - SoundEffect var7 = SoundEffect.readSoundEffect(GrandExchangeOfferAgeComparator.archive4, var4.soundEffectId, 0); - if (var7 != null) { - RawSound var8 = var7.toRawSound().resample(Interpreter.decimator); - RawPcmStream var9 = RawPcmStream.createRawPcmStream(var8, 100, var6); - var9.setNumLoops(-1); - WorldMapLabelSize.pcmStreamMixer.addSubStream(var9); - var4.stream1 = var9; - } - } - } else { - var4.stream1.method2519(var6); - } - - if (var4.stream2 == null) { - if (var4.soundEffectIds != null && (var4.field1067 -= var3) <= 0) { - int var11 = (int)(Math.random() * (double)var4.soundEffectIds.length); - SoundEffect var12 = SoundEffect.readSoundEffect(GrandExchangeOfferAgeComparator.archive4, var4.soundEffectIds[var11], 0); - if (var12 != null) { - RawSound var13 = var12.toRawSound().resample(Interpreter.decimator); - RawPcmStream var10 = RawPcmStream.createRawPcmStream(var13, 100, var6); - var10.setNumLoops(0); - WorldMapLabelSize.pcmStreamMixer.addSubStream(var10); - var4.stream2 = var10; - var4.field1067 = var4.field1064 + (int)(Math.random() * (double)(var4.field1070 - var4.field1064)); - } - } - } else { - var4.stream2.method2519(var6); - if (!var4.stream2.hasNext()) { - var4.stream2 = null; - } - } - } else { - if (var4.stream1 != null) { - WorldMapLabelSize.pcmStreamMixer.removeSubStream(var4.stream1); - var4.stream1 = null; - } - - if (var4.stream2 != null) { - WorldMapLabelSize.pcmStreamMixer.removeSubStream(var4.stream2); - var4.stream2 = null; - } - } - } - } - - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "([BB)Lcu;", - garbageValue = "-44" - ) - @Export("newScript") - static Script newScript(byte[] var0) { - Script var1 = new Script(); - Buffer var2 = new Buffer(var0); - var2.offset = var2.array.length - 2; - int var3 = var2.readUnsignedShort(); - int var4 = var2.array.length - 2 - var3 - 12; - var2.offset = var4; - int var5 = var2.readInt(); - var1.localIntCount = var2.readUnsignedShort(); - var1.localStringCount = var2.readUnsignedShort(); - var1.intArgumentCount = var2.readUnsignedShort(); - var1.stringArgumentCount = var2.readUnsignedShort(); - int var6 = var2.readUnsignedByte(); - int var7; - int var8; - if (var6 > 0) { - var1.switches = var1.newIterableNodeHashTable(var6); - - for (var7 = 0; var7 < var6; ++var7) { - var8 = var2.readUnsignedShort(); - IterableNodeHashTable var9 = new IterableNodeHashTable(var8 > 0 ? Timer.method4935(var8) : 1); - var1.switches[var7] = var9; - - while (var8-- > 0) { - int var10 = var2.readInt(); - int var11 = var2.readInt(); - var9.put(new IntegerNode(var11), (long)var10); - } - } - } - - var2.offset = 0; - var2.readStringCp1252NullTerminatedOrNull(); - var1.opcodes = new int[var5]; - var1.intOperands = new int[var5]; - var1.stringOperands = new String[var5]; - - for (var7 = 0; var2.offset < var4; var1.opcodes[var7++] = var8) { - var8 = var2.readUnsignedShort(); - if (var8 == 3) { - var1.stringOperands[var7] = var2.readStringCp1252NullTerminated(); - } else if (var8 < 100 && var8 != 21 && var8 != 38 && var8 != 39) { - var1.intOperands[var7] = var2.readInt(); - } else { - var1.intOperands[var7] = var2.readUnsignedByte(); - } - } - - return var1; - } - - @ObfuscatedName("c") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-537744176" - ) - static void method48() { - Login.loginIndex = 24; - PlayerType.setLoginResponseString("The game servers are currently being updated.", "Please wait a few minutes and try again.", ""); - } - - @ObfuscatedName("h") - @ObfuscatedSignature( - signature = "(IIIIIIILex;Lfa;S)V", - garbageValue = "23648" - ) - static final void method50(int var0, int var1, int var2, int var3, int var4, int var5, int var6, Scene var7, CollisionMap var8) { - ObjectDefinition var9 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var4); - int var10; - int var11; - if (var5 != 1 && var5 != 3) { - var10 = var9.sizeX; - var11 = var9.sizeY; + static class0 method59(Class var0) { + class3 var1 = method51(var0); + if (var1 == null) { + throw new IllegalArgumentException(); } else { - var10 = var9.sizeY; - var11 = var9.sizeX; - } - - int var12; - int var13; - if (var10 + var2 <= 104) { - var12 = (var10 >> 1) + var2; - var13 = var2 + (var10 + 1 >> 1); - } else { - var12 = var2; - var13 = var2 + 1; - } - - int var14; - int var15; - if (var3 + var11 <= 104) { - var14 = var3 + (var11 >> 1); - var15 = var3 + (var11 + 1 >> 1); - } else { - var14 = var3; - var15 = var3 + 1; - } - - int[][] var16 = Tiles.Tiles_heights[var1]; - int var17 = var16[var13][var15] + var16[var12][var14] + var16[var13][var14] + var16[var12][var15] >> 2; - int var18 = (var2 << 7) + (var10 << 6); - int var19 = (var3 << 7) + (var11 << 6); - long var20 = class267.calculateTag(var2, var3, 2, var9.int1 == 0, var4); - int var22 = (var5 << 6) + var6; - if (var9.int3 == 1) { - var22 += 256; - } - - Object var23; - if (var6 == 22) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(22, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 22, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newFloorDecoration(var0, var2, var3, var17, (Entity)var23, var20, var22); - if (var9.interactType == 1) { - var8.setBlockedByFloorDec(var2, var3); - } - - } else if (var6 != 10 && var6 != 11) { - if (var6 >= 12) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(var6, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, var6, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.method3056(var0, var2, var3, var17, 1, 1, (Entity)var23, 0, var20, var22); - if (var9.interactType != 0) { - var8.addGameObject(var2, var3, var10, var11, var9.boolean1); - } - - } else if (var6 == 0) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(0, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 0, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newBoundaryObject(var0, var2, var3, var17, (Entity)var23, (Entity)null, Tiles.field489[var5], 0, var20, var22); - if (var9.interactType != 0) { - var8.method3508(var2, var3, var6, var5, var9.boolean1); - } - - } else if (var6 == 1) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(1, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 1, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newBoundaryObject(var0, var2, var3, var17, (Entity)var23, (Entity)null, Tiles.field493[var5], 0, var20, var22); - if (var9.interactType != 0) { - var8.method3508(var2, var3, var6, var5, var9.boolean1); - } - - } else { - int var29; - if (var6 == 2) { - var29 = var5 + 1 & 3; - Object var24; - Object var25; - if (var9.animationId == -1 && var9.transforms == null) { - var24 = var9.getModel(2, var5 + 4, var16, var18, var17, var19); - var25 = var9.getModel(2, var29, var16, var18, var17, var19); - } else { - var24 = new DynamicObject(var4, 2, var5 + 4, var1, var2, var3, var9.animationId, true, (Entity)null); - var25 = new DynamicObject(var4, 2, var29, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newBoundaryObject(var0, var2, var3, var17, (Entity)var24, (Entity)var25, Tiles.field489[var5], Tiles.field489[var29], var20, var22); - if (var9.interactType != 0) { - var8.method3508(var2, var3, var6, var5, var9.boolean1); - } - - } else if (var6 == 3) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(3, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 3, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newBoundaryObject(var0, var2, var3, var17, (Entity)var23, (Entity)null, Tiles.field493[var5], 0, var20, var22); - if (var9.interactType != 0) { - var8.method3508(var2, var3, var6, var5, var9.boolean1); - } - - } else if (var6 == 9) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(var6, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, var6, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.method3056(var0, var2, var3, var17, 1, 1, (Entity)var23, 0, var20, var22); - if (var9.interactType != 0) { - var8.addGameObject(var2, var3, var10, var11, var9.boolean1); - } - - } else if (var6 == 4) { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(4, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 4, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newWallDecoration(var0, var2, var3, var17, (Entity)var23, (Entity)null, Tiles.field489[var5], 0, 0, 0, var20, var22); - } else { - Object var26; - long var30; - if (var6 == 5) { - var29 = 16; - var30 = var7.getBoundaryObjectTag(var0, var2, var3); - if (var30 != 0L) { - var29 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(class81.Entity_unpackID(var30)).int2; - } - - if (var9.animationId == -1 && var9.transforms == null) { - var26 = var9.getModel(4, var5, var16, var18, var17, var19); - } else { - var26 = new DynamicObject(var4, 4, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newWallDecoration(var0, var2, var3, var17, (Entity)var26, (Entity)null, Tiles.field489[var5], 0, var29 * Tiles.field491[var5], var29 * Tiles.field492[var5], var20, var22); - } else if (var6 == 6) { - var29 = 8; - var30 = var7.getBoundaryObjectTag(var0, var2, var3); - if (var30 != 0L) { - var29 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(class81.Entity_unpackID(var30)).int2 / 2; - } - - if (var9.animationId == -1 && var9.transforms == null) { - var26 = var9.getModel(4, var5 + 4, var16, var18, var17, var19); - } else { - var26 = new DynamicObject(var4, 4, var5 + 4, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newWallDecoration(var0, var2, var3, var17, (Entity)var26, (Entity)null, 256, var5, var29 * Tiles.field484[var5], var29 * Tiles.field494[var5], var20, var22); - } else if (var6 == 7) { - int var32 = var5 + 2 & 3; - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(4, var32 + 4, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 4, var32 + 4, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newWallDecoration(var0, var2, var3, var17, (Entity)var23, (Entity)null, 256, var32, 0, 0, var20, var22); - } else if (var6 == 8) { - var29 = 8; - var30 = var7.getBoundaryObjectTag(var0, var2, var3); - if (var30 != 0L) { - var29 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(class81.Entity_unpackID(var30)).int2 / 2; - } - - int var28 = var5 + 2 & 3; - Object var27; - if (var9.animationId == -1 && var9.transforms == null) { - var26 = var9.getModel(4, var5 + 4, var16, var18, var17, var19); - var27 = var9.getModel(4, var28 + 4, var16, var18, var17, var19); - } else { - var26 = new DynamicObject(var4, 4, var5 + 4, var1, var2, var3, var9.animationId, true, (Entity)null); - var27 = new DynamicObject(var4, 4, var28 + 4, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - var7.newWallDecoration(var0, var2, var3, var17, (Entity)var26, (Entity)var27, 256, var5, var29 * Tiles.field484[var5], var29 * Tiles.field494[var5], var20, var22); - } - } - } - } else { - if (var9.animationId == -1 && var9.transforms == null) { - var23 = var9.getModel(10, var5, var16, var18, var17, var19); - } else { - var23 = new DynamicObject(var4, 10, var5, var1, var2, var3, var9.animationId, true, (Entity)null); - } - - if (var23 != null) { - var7.method3056(var0, var2, var3, var17, var10, var11, (Entity)var23, var6 == 11 ? 256 : 0, var20, var22); - } - - if (var9.interactType != 0) { - var8.addGameObject(var2, var3, var10, var11, var9.boolean1); - } - + return var1.field11; } } - @ObfuscatedName("ji") + @ObfuscatedName("ao") @ObfuscatedSignature( - signature = "(III)V", - garbageValue = "323283253" + signature = "([BIIS)I", + garbageValue = "31533" ) - static void method47(int var0, int var1) { - MenuAction var2 = ParamDefinition.tempMenuAction; - InvDefinition.menuAction(var2.argument1, var2.argument2, var2.opcode, var2.argument0, var2.action, var2.action, var0, var1); - ParamDefinition.tempMenuAction = null; + public static int method50(byte[] var0, int var1, int var2) { + int var3 = -1; + + for (int var4 = var1; var4 < var2; ++var4) { + var3 = var3 >>> 8 ^ Buffer.crc32Table[(var3 ^ var0[var4]) & 255]; + } + + var3 = ~var3; + return var3; } } diff --git a/runescape-client/src/main/java/class30.java b/runescape-client/src/main/java/class30.java index 32c030e4b6..973856c5a9 100644 --- a/runescape-client/src/main/java/class30.java +++ b/runescape-client/src/main/java/class30.java @@ -1,104 +1,114 @@ +import java.awt.FontMetrics; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ap") +@ObfuscatedName("ad") public class class30 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lap;" + signature = "Lad;" ) - static final class30 field253; + static final class30 field251; + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Lad;" + ) + static final class30 field249; + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "Lks;" + ) + @Export("ItemDefinition_fontPlain11") + public static Font ItemDefinition_fontPlain11; + @ObfuscatedName("g") + @Export("userHomeDirectory") + static String userHomeDirectory; + @ObfuscatedName("ad") + @Export("loginScreenFontMetrics") + static FontMetrics loginScreenFontMetrics; + @ObfuscatedName("ay") + @Export("hasFocus") + protected static boolean hasFocus; @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "Lap;" - ) - static final class30 field250; - @ObfuscatedName("fk") - @ObfuscatedSignature( - signature = "Lky;" - ) - static AbstractSocket field251; - @ObfuscatedName("v") @ObfuscatedGetter( - intValue = -2108473881 + intValue = -2143019859 ) @Export("value") final int value; static { - field253 = new class30(0); - field250 = new class30(1); + field251 = new class30(0); + field249 = new class30(1); } class30(int var1) { this.value = var1; } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(I)J", - garbageValue = "1399044967" - ) - @Export("currentTimeMillis") - public static final synchronized long currentTimeMillis() { - long var0 = System.currentTimeMillis(); - if (var0 < class296.field3688) { - class296.field3689 += class296.field3688 - var0; - } + @ObfuscatedName("a") + public static String method602(long var0) { + if (var0 > 0L && var0 < 6582952005840035281L) { + if (var0 % 37L == 0L) { + return null; + } else { + int var2 = 0; - class296.field3688 = var0; - return var0 + class296.field3689; - } + for (long var3 = var0; var3 != 0L; var3 /= 37L) { + ++var2; + } - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(III)I", - garbageValue = "-476922485" - ) - public static int method563(int var0, int var1) { - int var2; - for (var2 = 1; var1 > 1; var1 >>= 1) { - if ((var1 & 1) != 0) { - var2 = var0 * var2; + StringBuilder var5 = new StringBuilder(var2); + + while (var0 != 0L) { + long var6 = var0; + var0 /= 37L; + var5.append(class288.base37Table[(int)(var6 - 37L * var0)]); + } + + return var5.reverse().toString(); } - - var0 *= var0; - } - - if (var1 == 1) { - return var0 * var2; } else { - return var2; + return null; } } - @ObfuscatedName("n") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)[B", - garbageValue = "-2057426461" + signature = "(ILjava/lang/String;Ljava/lang/String;I)V", + garbageValue = "422689867" ) - @Export("ByteArrayPool_getArray") - public static synchronized byte[] ByteArrayPool_getArray(int var0) { - return ByteArrayPool.ByteArrayPool_getArrayBool(var0, false); + @Export("addGameMessage") + static void addGameMessage(int var0, String var1, String var2) { + WorldMapLabel.addChatMessage(var0, var1, var2, (String)null); } - @ObfuscatedName("v") + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(Lhq;I)V", + garbageValue = "-156819162" + ) + public static void method607(AbstractArchive var0) { + EnumDefinition.EnumDefinition_archive = var0; + } + + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIIIB)V", - garbageValue = "44" + garbageValue = "-22" ) - static final void method561(int var0, int var1, int var2, int var3) { + static final void method609(int var0, int var1, int var2, int var3) { for (int var4 = var1; var4 <= var3 + var1; ++var4) { for (int var5 = var0; var5 <= var0 + var2; ++var5) { if (var5 >= 0 && var5 < 104 && var4 >= 0 && var4 < 104) { - Tiles.field486[0][var5][var4] = 127; + class96.field1300[0][var5][var4] = 127; if (var0 == var5 && var5 > 0) { Tiles.Tiles_heights[0][var5][var4] = Tiles.Tiles_heights[0][var5 - 1][var4]; } - if (var0 + var2 == var5 && var5 < 103) { + if (var5 == var0 + var2 && var5 < 103) { Tiles.Tiles_heights[0][var5][var4] = Tiles.Tiles_heights[0][var5 + 1][var4]; } @@ -115,67 +125,463 @@ public class class30 { } - @ObfuscatedName("fo") + @ObfuscatedName("av") @ObfuscatedSignature( - signature = "(Lix;IIII)V", - garbageValue = "1243298159" + signature = "(ILcj;ZI)I", + garbageValue = "-151601010" ) - @Export("addSequenceSoundEffect") - static void addSequenceSoundEffect(SequenceDefinition var0, int var1, int var2, int var3) { - if (Client.soundEffectCount < 50 && Client.field868 != 0) { - if (var0.soundEffects != null && var1 < var0.soundEffects.length) { - int var4 = var0.soundEffects[var1]; - if (var4 != 0) { - int var5 = var4 >> 8; - int var6 = var4 >> 4 & 7; - int var7 = var4 & 15; - Client.soundEffectIds[Client.soundEffectCount] = var5; - Client.queuedSoundEffectLoops[Client.soundEffectCount] = var6; - Client.queuedSoundEffectDelays[Client.soundEffectCount] = 0; - Client.soundEffects[Client.soundEffectCount] = null; - int var8 = (var2 - 64) / 128; - int var9 = (var3 - 64) / 128; - Client.soundLocations[Client.soundEffectCount] = var7 + (var9 << 8) + (var8 << 16); - ++Client.soundEffectCount; + static int method605(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.FRIEND_COUNT) { + if (PacketWriter.friendSystem.field1044 == 0) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -2; + } else if (PacketWriter.friendSystem.field1044 == 1) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = PacketWriter.friendSystem.friendsList.getSize(); + } + + return 1; + } else { + int var3; + if (var0 == ScriptOpcodes.FRIEND_GETNAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (PacketWriter.friendSystem.method1973() && var3 >= 0 && var3 < PacketWriter.friendSystem.friendsList.getSize()) { + Friend var8 = (Friend)PacketWriter.friendSystem.friendsList.get(var3); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var8.getName(); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var8.getPreviousName(); + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.FRIEND_GETWORLD) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (PacketWriter.friendSystem.method1973() && var3 >= 0 && var3 < PacketWriter.friendSystem.friendsList.getSize()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)PacketWriter.friendSystem.friendsList.get(var3)).world; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.FRIEND_GETRANK) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (PacketWriter.friendSystem.method1973() && var3 >= 0 && var3 < PacketWriter.friendSystem.friendsList.getSize()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)PacketWriter.friendSystem.friendsList.get(var3)).rank; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else { + String var5; + if (var0 == ScriptOpcodes.FRIEND_SETRANK) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + int var6 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + ArchiveLoader.method1242(var5, var6); + return 1; + } else if (var0 == ScriptOpcodes.FRIEND_ADD) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + PacketWriter.friendSystem.addFriend(var5); + return 1; + } else if (var0 == ScriptOpcodes.FRIEND_DEL) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + PacketWriter.friendSystem.removeFriend(var5); + return 1; + } else if (var0 == ScriptOpcodes.IGNORE_ADD) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + PacketWriter.friendSystem.addIgnore(var5); + return 1; + } else if (var0 == ScriptOpcodes.IGNORE_DEL) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + PacketWriter.friendSystem.removeIgnore(var5); + return 1; + } else if (var0 == ScriptOpcodes.FRIEND_TEST) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var5 = class186.method3776(var5); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = PacketWriter.friendSystem.isFriended(new Username(var5, class60.loginType), false) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATDISPLAYNAME) { + if (class4.clanChat != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = class4.clanChat.name; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATCOUNT) { + if (class4.clanChat != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class4.clanChat.getSize(); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATUSERNAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (class4.clanChat != null && var3 < class4.clanChat.getSize()) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = class4.clanChat.get(var3).getUsername().getName(); + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATUSERWORLD) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (class4.clanChat != null && var3 < class4.clanChat.getSize()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)class4.clanChat.get(var3)).getWorld(); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATUSERRANK) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (class4.clanChat != null && var3 < class4.clanChat.getSize()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = ((Buddy)class4.clanChat.get(var3)).rank; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATMINKICK) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class4.clanChat != null ? class4.clanChat.minKick : 0; + return 1; + } else if (var0 == ScriptOpcodes.CLAN_KICKUSER) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + UserComparator9.clanKickUser(var5); + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATRANK) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class4.clanChat != null ? class4.clanChat.rank : 0; + return 1; + } else if (var0 == ScriptOpcodes.CLAN_JOINCHAT) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + Entity.Clan_joinChat(var5); + return 1; + } else if (var0 == ScriptOpcodes.CLAN_LEAVECHAT) { + class266.Clan_leaveChat(); + return 1; + } else if (var0 == ScriptOpcodes.IGNORE_COUNT) { + if (!PacketWriter.friendSystem.method1973()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = PacketWriter.friendSystem.ignoreList.getSize(); + } + + return 1; + } else if (var0 == ScriptOpcodes.IGNORE_GETNAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (PacketWriter.friendSystem.method1973() && var3 >= 0 && var3 < PacketWriter.friendSystem.ignoreList.getSize()) { + Ignored var4 = (Ignored)PacketWriter.friendSystem.ignoreList.get(var3); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var4.getName(); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var4.getPreviousName(); + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.IGNORE_TEST) { + var5 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var5 = class186.method3776(var5); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = PacketWriter.friendSystem.isIgnored(new Username(var5, class60.loginType)) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.CLAN_ISSELF) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (class4.clanChat != null && var3 < class4.clanChat.getSize() && class4.clanChat.get(var3).getUsername().equals(class215.localPlayer.username)) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_GETCHATOWNERNAME) { + if (class4.clanChat != null && class4.clanChat.owner != null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = class4.clanChat.owner; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } + + return 1; + } else if (var0 == ScriptOpcodes.CLAN_ISFRIEND) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (class4.clanChat != null && var3 < class4.clanChat.getSize() && ((ClanMate)class4.clanChat.get(var3)).isFriend()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 != ScriptOpcodes.CLAN_ISIGNORE) { + if (var0 == 3628) { + PacketWriter.friendSystem.friendsList.removeComparator(); + return 1; + } else { + boolean var7; + if (var0 == 3629) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator1(var7)); + return 1; + } else if (var0 == 3630) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator2(var7)); + return 1; + } else if (var0 == 3631) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator3(var7)); + return 1; + } else if (var0 == 3632) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator4(var7)); + return 1; + } else if (var0 == 3633) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator5(var7)); + return 1; + } else if (var0 == 3634) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator6(var7)); + return 1; + } else if (var0 == 3635) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator7(var7)); + return 1; + } else if (var0 == 3636) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator8(var7)); + return 1; + } else if (var0 == 3637) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator9(var7)); + return 1; + } else if (var0 == 3638) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new UserComparator10(var7)); + return 1; + } else if (var0 == 3639) { + PacketWriter.friendSystem.friendsList.sort(); + return 1; + } else if (var0 == 3640) { + PacketWriter.friendSystem.ignoreList.removeComparator(); + return 1; + } else if (var0 == 3641) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.ignoreList.addComparator(new UserComparator1(var7)); + return 1; + } else if (var0 == 3642) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.ignoreList.addComparator(new UserComparator2(var7)); + return 1; + } else if (var0 == 3643) { + PacketWriter.friendSystem.ignoreList.sort(); + return 1; + } else if (var0 == 3644) { + if (class4.clanChat != null) { + class4.clanChat.removeComparator(); + } + + return 1; + } else if (var0 == 3645) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator1(var7)); + } + + return 1; + } else if (var0 == 3646) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator2(var7)); + } + + return 1; + } else if (var0 == 3647) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator3(var7)); + } + + return 1; + } else if (var0 == 3648) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator4(var7)); + } + + return 1; + } else if (var0 == 3649) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator5(var7)); + } + + return 1; + } else if (var0 == 3650) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator6(var7)); + } + + return 1; + } else if (var0 == 3651) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator7(var7)); + } + + return 1; + } else if (var0 == 3652) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator8(var7)); + } + + return 1; + } else if (var0 == 3653) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator9(var7)); + } + + return 1; + } else if (var0 == 3654) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new UserComparator10(var7)); + } + + return 1; + } else if (var0 == 3655) { + if (class4.clanChat != null) { + class4.clanChat.sort(); + } + + return 1; + } else if (var0 == 3656) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + PacketWriter.friendSystem.friendsList.addComparator(new BuddyRankComparator(var7)); + return 1; + } else if (var0 == 3657) { + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + if (class4.clanChat != null) { + class4.clanChat.addComparator(new BuddyRankComparator(var7)); + } + + return 1; + } else { + return 2; + } + } + } else { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (class4.clanChat != null && var3 < class4.clanChat.getSize() && ((ClanMate)class4.clanChat.get(var3)).isIgnored()) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; } } } } - @ObfuscatedName("iw") + @ObfuscatedName("an") @ObfuscatedSignature( - signature = "(Lho;III)V", - garbageValue = "-1445345740" + signature = "(II)I", + garbageValue = "1497989871" ) - @Export("alignWidgetPosition") - static void alignWidgetPosition(Widget var0, int var1, int var2) { - if (var0.xAlignment == 0) { - var0.x = var0.rawX; - } else if (var0.xAlignment == 1) { - var0.x = var0.rawX + (var1 - var0.width) / 2; - } else if (var0.xAlignment == 2) { - var0.x = var1 - var0.width - var0.rawX; - } else if (var0.xAlignment == 3) { - var0.x = var0.rawX * var1 >> 14; - } else if (var0.xAlignment == 4) { - var0.x = (var1 - var0.width) / 2 + (var0.rawX * var1 >> 14); - } else { - var0.x = var1 - var0.width - (var0.rawX * var1 >> 14); + static int method608(int var0) { + return (int)((Math.log((double)var0) / Interpreter.field1078 - 7.0D) * 256.0D); + } + + @ObfuscatedName("hs") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "95" + ) + static final void method606() { + PacketBuffer var0 = Client.packetWriter.packetBuffer; + var0.importIndex(); + int var1 = var0.readBits(8); + int var2; + if (var1 < Client.npcCount) { + for (var2 = var1; var2 < Client.npcCount; ++var2) { + Client.field870[++Client.field752 - 1] = Client.npcIndices[var2]; + } } - if (var0.yAlignment == 0) { - var0.y = var0.rawY; - } else if (var0.yAlignment == 1) { - var0.y = (var2 - var0.height) / 2 + var0.rawY; - } else if (var0.yAlignment == 2) { - var0.y = var2 - var0.height - var0.rawY; - } else if (var0.yAlignment == 3) { - var0.y = var2 * var0.rawY >> 14; - } else if (var0.yAlignment == 4) { - var0.y = (var2 * var0.rawY >> 14) + (var2 - var0.height) / 2; + if (var1 > Client.npcCount) { + throw new RuntimeException(""); } else { - var0.y = var2 - var0.height - (var2 * var0.rawY >> 14); + Client.npcCount = 0; + + for (var2 = 0; var2 < var1; ++var2) { + int var3 = Client.npcIndices[var2]; + NPC var4 = Client.npcs[var3]; + int var5 = var0.readBits(1); + if (var5 == 0) { + Client.npcIndices[++Client.npcCount - 1] = var3; + var4.npcCycle = Client.cycle; + } else { + int var6 = var0.readBits(2); + if (var6 == 0) { + Client.npcIndices[++Client.npcCount - 1] = var3; + var4.npcCycle = Client.cycle; + Client.field677[++Client.field676 - 1] = var3; + } else { + int var7; + int var8; + if (var6 == 1) { + Client.npcIndices[++Client.npcCount - 1] = var3; + var4.npcCycle = Client.cycle; + var7 = var0.readBits(3); + var4.method2174(var7, (byte)1); + var8 = var0.readBits(1); + if (var8 == 1) { + Client.field677[++Client.field676 - 1] = var3; + } + } else if (var6 == 2) { + Client.npcIndices[++Client.npcCount - 1] = var3; + var4.npcCycle = Client.cycle; + var7 = var0.readBits(3); + var4.method2174(var7, (byte)2); + var8 = var0.readBits(3); + var4.method2174(var8, (byte)2); + int var9 = var0.readBits(1); + if (var9 == 1) { + Client.field677[++Client.field676 - 1] = var3; + } + } else if (var6 == 3) { + Client.field870[++Client.field752 - 1] = var3; + } + } + } + } + + } + } + + @ObfuscatedName("iz") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "125" + ) + static void method603() { + Decimator.calculateMenuBounds(KeyHandler.menuWidth / 2 + MusicPatchNode.menuX, TextureProvider.menuY); + } + + @ObfuscatedName("kp") + @ObfuscatedSignature( + signature = "(Lhi;B)Lhi;", + garbageValue = "1" + ) + static Widget method604(Widget var0) { + Widget var1 = TextureProvider.method2909(var0); + if (var1 == null) { + var1 = var0.parent; } + return var1; } } diff --git a/runescape-client/src/main/java/class300.java b/runescape-client/src/main/java/class300.java index a4d7bb1e42..9408388bc2 100644 --- a/runescape-client/src/main/java/class300.java +++ b/runescape-client/src/main/java/class300.java @@ -1,9 +1,9 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("ka") +@ObfuscatedName("ki") public class class300 { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("writeRandomDat") public static void writeRandomDat(byte[] var0, int var1, byte[] var2, int var3, int var4) { if (var2 == var0) { @@ -51,7 +51,7 @@ public class class300 { } - @ObfuscatedName("i") + @ObfuscatedName("d") @Export("clearIntArray") public static void clearIntArray(int[] var0, int var1, int var2) { for (var2 = var2 + var1 - 7; var1 < var2; var0[var1++] = 0) { diff --git a/runescape-client/src/main/java/class312.java b/runescape-client/src/main/java/class312.java index ada3fbf739..85add9d4ca 100644 --- a/runescape-client/src/main/java/class312.java +++ b/runescape-client/src/main/java/class312.java @@ -3,707 +3,170 @@ import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("le") +@ObfuscatedName("lc") public enum class312 implements Enumerated { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Lle;" + signature = "Llc;" ) - field3818(4, 0), + field3799(0, 0), + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "Llc;" + ) + field3798(4, 2), @ObfuscatedName("n") @ObfuscatedSignature( - signature = "Lle;" + signature = "Llc;" ) - field3809(1, 1), - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "Lle;" - ) - field3816(8, 2), - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lle;" - ) - field3811(2, 3), - @ObfuscatedName("r") - @ObfuscatedSignature( - signature = "Lle;" - ) - field3808(6, 4), - @ObfuscatedName("p") - @ObfuscatedSignature( - signature = "Lle;" - ) - field3813(5, 5), + field3800(3, 5), @ObfuscatedName("q") @ObfuscatedSignature( - signature = "Lle;" + signature = "Llc;" ) - field3815(0, 6), - @ObfuscatedName("m") + field3801(2, 6), + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "Lle;" + signature = "Llc;" ) - field3812(7, 7), - @ObfuscatedName("y") + field3805(5, 7), + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "Lle;" + signature = "Llc;" ) - field3814(3, 8); + field3802(1, 8); - @ObfuscatedName("i") - @ObfuscatedGetter( - intValue = -504561675 - ) - final int field3817; + @ObfuscatedName("e") + static String[] field3803; @ObfuscatedName("c") @ObfuscatedGetter( - intValue = -2131314821 + intValue = 710760119 + ) + final int field3797; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = 1869652173 ) @Export("id") final int id; class312(int var3, int var4) { - this.field3817 = var3; + this.field3797 = var3; this.id = var4; } - @ObfuscatedName("v") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)I", - garbageValue = "221" + signature = "(I)I", + garbageValue = "-1993081102" ) @Export("rsOrdinal") public int rsOrdinal() { return this.id; } - @ObfuscatedName("gs") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lby;IIIIII)V", - garbageValue = "2106384053" + signature = "(Ljava/lang/CharSequence;I)Ljava/lang/String;", + garbageValue = "-911741396" ) - @Export("drawActor2d") - static final void drawActor2d(Actor var0, int var1, int var2, int var3, int var4, int var5) { - if (var0 != null && var0.isVisible()) { - if (var0 instanceof NPC) { - NPCDefinition var6 = ((NPC)var0).definition; - if (var6.transforms != null) { - var6 = var6.transform(); - } + public static String method6014(CharSequence var0) { + int var1 = var0.length(); + StringBuilder var2 = new StringBuilder(var1); - if (var6 == null) { - return; - } - } - - int var75 = Players.Players_count; - int[] var7 = Players.Players_indices; - byte var8 = 0; - if (var1 < var75 && var0.playerCycle == Client.cycle && GrandExchangeOfferUnitPriceComparator.method134((Player)var0)) { - Player var9 = (Player)var0; - if (var1 < var75) { - World.getActorScreenLocation(var0, var0.defaultHeight + 15); - AbstractFont var10 = (AbstractFont)Client.fontsMap.get(FontName.FontName_plain12); - byte var11 = 9; - var10.drawCentered(var9.username.getName(), var2 + Client.viewportTempX, var3 + Client.viewportTempY - var11, 16777215, 0); - var8 = 18; - } - } - - int var76 = -2; - int var15; - int var16; - int var22; - int var23; - if (!var0.healthBars.method4775()) { - World.getActorScreenLocation(var0, var0.defaultHeight + 15); - - for (HealthBar var89 = (HealthBar)var0.healthBars.last(); var89 != null; var89 = (HealthBar)var0.healthBars.previous()) { - HealthBarUpdate var77 = var89.get(Client.cycle); - if (var77 == null) { - if (var89.isEmpty()) { - var89.remove(); - } + for (int var3 = 0; var3 < var1; ++var3) { + char var4 = var0.charAt(var3); + if ((var4 < 'a' || var4 > 'z') && (var4 < 'A' || var4 > 'Z') && (var4 < '0' || var4 > '9') && var4 != '.' && var4 != '-' && var4 != '*' && var4 != '_') { + if (var4 == ' ') { + var2.append('+'); + } else { + byte var5 = WorldMapData_1.charToByteCp1252(var4); + var2.append('%'); + int var6 = var5 >> 4 & 15; + if (var6 >= 10) { + var2.append((char)(var6 + 55)); } else { - HealthBarDefinition var12 = var89.definition; - Sprite var13 = var12.getBackSprite(); - Sprite var14 = var12.getFrontSprite(); - var16 = 0; - if (var13 != null && var14 != null) { - if (var12.widthPadding * 2 < var14.subWidth) { - var16 = var12.widthPadding; - } - - var15 = var14.subWidth - var16 * 2; - } else { - var15 = var12.width; - } - - int var17 = 255; - boolean var18 = true; - int var19 = Client.cycle - var77.cycle; - int var20 = var15 * var77.health2 / var12.width; - int var21; - int var94; - if (var77.cycleOffset > var19) { - var21 = var12.int4 == 0 ? 0 : var12.int4 * (var19 / var12.int4); - var22 = var15 * var77.health / var12.width; - var94 = var21 * (var20 - var22) / var77.cycleOffset + var22; - } else { - var94 = var20; - var21 = var12.int5 + var77.cycleOffset - var19; - if (var12.int3 >= 0) { - var17 = (var21 << 8) / (var12.int5 - var12.int3); - } - } - - if (var77.health2 > 0 && var94 < 1) { - var94 = 1; - } - - if (var13 != null && var14 != null) { - if (var15 == var94) { - var94 += var16 * 2; - } else { - var94 += var16; - } - - var21 = var13.subHeight; - var76 += var21; - var22 = var2 + Client.viewportTempX - (var15 >> 1); - var23 = var3 + Client.viewportTempY - var76; - var22 -= var16; - if (var17 >= 0 && var17 < 255) { - var13.drawTransAt(var22, var23, var17); - Rasterizer2D.Rasterizer2D_expandClip(var22, var23, var22 + var94, var23 + var21); - var14.drawTransAt(var22, var23, var17); - } else { - var13.drawTransBgAt(var22, var23); - Rasterizer2D.Rasterizer2D_expandClip(var22, var23, var94 + var22, var23 + var21); - var14.drawTransBgAt(var22, var23); - } - - Rasterizer2D.Rasterizer2D_setClip(var2, var3, var2 + var4, var3 + var5); - var76 += 2; - } else { - var76 += 5; - if (Client.viewportTempX > -1) { - var21 = var2 + Client.viewportTempX - (var15 >> 1); - var22 = var3 + Client.viewportTempY - var76; - Rasterizer2D.Rasterizer2D_fillRectangle(var21, var22, var94, 5, 65280); - Rasterizer2D.Rasterizer2D_fillRectangle(var21 + var94, var22, var15 - var94, 5, 16711680); - } - - var76 += 2; - } + var2.append((char)(var6 + 48)); } - } - } - if (var76 == -2) { - var76 += 7; - } - - var76 += var8; - if (var1 < var75) { - Player var90 = (Player)var0; - if (var90.isHidden) { - return; - } - - if (var90.headIconPk != -1 || var90.headIconPrayer != -1) { - World.getActorScreenLocation(var0, var0.defaultHeight + 15); - if (Client.viewportTempX > -1) { - if (var90.headIconPk != -1) { - var76 += 25; - StructDefinition.headIconPkSprites[var90.headIconPk].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var76); - } - - if (var90.headIconPrayer != -1) { - var76 += 25; - WorldMapRegion.headIconPrayerSprites[var90.headIconPrayer].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var76); - } - } - } - - if (var1 >= 0 && Client.hintArrowType == 10 && var7[var1] == Client.hintArrowPlayerIndex) { - World.getActorScreenLocation(var0, var0.defaultHeight + 15); - if (Client.viewportTempX > -1) { - var76 += ReflectionCheck.headIconHintSprites[1].subHeight; - ReflectionCheck.headIconHintSprites[1].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - var76); + var6 = var5 & 15; + if (var6 >= 10) { + var2.append((char)(var6 + 55)); + } else { + var2.append((char)(var6 + 48)); } } } else { - NPCDefinition var91 = ((NPC)var0).definition; - if (var91.transforms != null) { - var91 = var91.transform(); - } - - if (var91.headIconPrayer >= 0 && var91.headIconPrayer < WorldMapRegion.headIconPrayerSprites.length) { - World.getActorScreenLocation(var0, var0.defaultHeight + 15); - if (Client.viewportTempX > -1) { - WorldMapRegion.headIconPrayerSprites[var91.headIconPrayer].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 30); - } - } - - if (Client.hintArrowType == 1 && Client.npcIndices[var1 - var75] == Client.hintArrowNpcIndex && Client.cycle % 20 < 10) { - World.getActorScreenLocation(var0, var0.defaultHeight + 15); - if (Client.viewportTempX > -1) { - ReflectionCheck.headIconHintSprites[0].drawTransBgAt(var2 + Client.viewportTempX - 12, var3 + Client.viewportTempY - 28); - } - } + var2.append(var4); } - - if (var0.overheadText != null && (var1 >= var75 || !var0.field944 && (Client.publicChatMode == 4 || !var0.isAutoChatting && (Client.publicChatMode == 0 || Client.publicChatMode == 3 || Client.publicChatMode == 1 && ((Player)var0).isFriend())))) { - World.getActorScreenLocation(var0, var0.defaultHeight); - if (Client.viewportTempX > -1 && Client.overheadTextCount < Client.overheadTextLimit) { - Client.overheadTextXOffsets[Client.overheadTextCount] = class173.fontBold12.stringWidth(var0.overheadText) / 2; - Client.overheadTextAscents[Client.overheadTextCount] = class173.fontBold12.ascent; - Client.overheadTextXs[Client.overheadTextCount] = Client.viewportTempX; - Client.overheadTextYs[Client.overheadTextCount] = Client.viewportTempY; - Client.overheadTextColors[Client.overheadTextCount] = var0.overheadTextColor; - Client.overheadTextEffects[Client.overheadTextCount] = var0.overheadTextEffect; - Client.overheadTextCyclesRemaining[Client.overheadTextCount] = var0.overheadTextCyclesRemaining; - Client.overheadText[Client.overheadTextCount] = var0.overheadText; - ++Client.overheadTextCount; - } - } - - for (int var78 = 0; var78 < 4; ++var78) { - int var92 = var0.hitSplatCycles[var78]; - int var79 = var0.hitSplatTypes[var78]; - HitSplatDefinition var93 = null; - int var80 = 0; - HitSplatDefinition var81; - if (var79 >= 0) { - if (var92 <= Client.cycle) { - continue; - } - - var16 = var0.hitSplatTypes[var78]; - var81 = (HitSplatDefinition)HitSplatDefinition.HitSplatDefinition_cached.get((long)var16); - HitSplatDefinition var82; - if (var81 != null) { - var82 = var81; - } else { - byte[] var83 = HitSplatDefinition.HitSplatDefinition_archive.takeFile(32, var16); - var81 = new HitSplatDefinition(); - if (var83 != null) { - var81.decode(new Buffer(var83)); - } - - HitSplatDefinition.HitSplatDefinition_cached.put(var81, (long)var16); - var82 = var81; - } - - var93 = var82; - var80 = var82.field3318; - if (var82 != null && var82.transforms != null) { - var93 = var82.transform(); - if (var93 == null) { - var0.hitSplatCycles[var78] = -1; - continue; - } - } - } else if (var92 < 0) { - continue; - } - - var15 = var0.hitSplatTypes2[var78]; - HitSplatDefinition var84 = null; - HitSplatDefinition var96; - if (var15 >= 0) { - var96 = (HitSplatDefinition)HitSplatDefinition.HitSplatDefinition_cached.get((long)var15); - if (var96 != null) { - var81 = var96; - } else { - byte[] var85 = HitSplatDefinition.HitSplatDefinition_archive.takeFile(32, var15); - var96 = new HitSplatDefinition(); - if (var85 != null) { - var96.decode(new Buffer(var85)); - } - - HitSplatDefinition.HitSplatDefinition_cached.put(var96, (long)var15); - var81 = var96; - } - - var84 = var81; - if (var81 != null && var81.transforms != null) { - var84 = var81.transform(); - } - } - - if (var92 - var80 <= Client.cycle) { - if (var93 == null) { - var0.hitSplatCycles[var78] = -1; - } else { - World.getActorScreenLocation(var0, var0.defaultHeight / 2); - if (Client.viewportTempX > -1) { - if (var78 == 1) { - Client.viewportTempY -= 20; - } - - if (var78 == 2) { - Client.viewportTempX -= 15; - Client.viewportTempY -= 10; - } - - if (var78 == 3) { - Client.viewportTempX += 15; - Client.viewportTempY -= 10; - } - - var96 = null; - Sprite var98 = null; - Sprite var86 = null; - Sprite var87 = null; - var22 = 0; - var23 = 0; - int var24 = 0; - int var25 = 0; - int var26 = 0; - int var27 = 0; - int var28 = 0; - int var29 = 0; - Sprite var30 = null; - Sprite var31 = null; - Sprite var32 = null; - Sprite var33 = null; - int var34 = 0; - int var35 = 0; - int var36 = 0; - int var37 = 0; - int var38 = 0; - int var39 = 0; - int var40 = 0; - int var41 = 0; - int var42 = 0; - Sprite var97 = var93.method4520(); - int var43; - if (var97 != null) { - var22 = var97.subWidth; - var43 = var97.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var26 = var97.xOffset; - } - - var98 = var93.method4517(); - if (var98 != null) { - var23 = var98.subWidth; - var43 = var98.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var27 = var98.xOffset; - } - - var86 = var93.method4518(); - if (var86 != null) { - var24 = var86.subWidth; - var43 = var86.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var28 = var86.xOffset; - } - - var87 = var93.method4542(); - if (var87 != null) { - var25 = var87.subWidth; - var43 = var87.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var29 = var87.xOffset; - } - - if (var84 != null) { - var30 = var84.method4520(); - if (var30 != null) { - var34 = var30.subWidth; - var43 = var30.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var38 = var30.xOffset; - } - - var31 = var84.method4517(); - if (var31 != null) { - var35 = var31.subWidth; - var43 = var31.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var39 = var31.xOffset; - } - - var32 = var84.method4518(); - if (var32 != null) { - var36 = var32.subWidth; - var43 = var32.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var40 = var32.xOffset; - } - - var33 = var84.method4542(); - if (var33 != null) { - var37 = var33.subWidth; - var43 = var33.subHeight; - if (var43 > var42) { - var42 = var43; - } - - var41 = var33.xOffset; - } - } - - Font var88 = var93.getFont(); - if (var88 == null) { - var88 = GrandExchangeOfferOwnWorldComparator.fontPlain11; - } - - Font var44; - if (var84 != null) { - var44 = var84.getFont(); - if (var44 == null) { - var44 = GrandExchangeOfferOwnWorldComparator.fontPlain11; - } - } else { - var44 = GrandExchangeOfferOwnWorldComparator.fontPlain11; - } - - String var45 = null; - String var46 = null; - boolean var47 = false; - int var48 = 0; - var45 = var93.getString(var0.hitSplatValues[var78]); - int var95 = var88.stringWidth(var45); - if (var84 != null) { - var46 = var84.getString(var0.hitSplatValues2[var78]); - var48 = var44.stringWidth(var46); - } - - int var49 = 0; - int var50 = 0; - if (var23 > 0) { - if (var86 == null && var87 == null) { - var49 = 1; - } else { - var49 = var95 / var23 + 1; - } - } - - if (var84 != null && var35 > 0) { - if (var32 == null && var33 == null) { - var50 = 1; - } else { - var50 = var48 / var35 + 1; - } - } - - int var51 = 0; - int var52 = var51; - if (var22 > 0) { - var51 += var22; - } - - var51 += 2; - int var53 = var51; - if (var24 > 0) { - var51 += var24; - } - - int var54 = var51; - int var55 = var51; - int var56; - if (var23 > 0) { - var56 = var23 * var49; - var51 += var56; - var55 += (var56 - var95) / 2; - } else { - var51 += var95; - } - - var56 = var51; - if (var25 > 0) { - var51 += var25; - } - - int var57 = 0; - int var58 = 0; - int var59 = 0; - int var60 = 0; - int var61 = 0; - int var62; - if (var84 != null) { - var51 += 2; - var57 = var51; - if (var34 > 0) { - var51 += var34; - } - - var51 += 2; - var58 = var51; - if (var36 > 0) { - var51 += var36; - } - - var59 = var51; - var61 = var51; - if (var35 > 0) { - var62 = var35 * var50; - var51 += var62; - var61 += (var62 - var48) / 2; - } else { - var51 += var48; - } - - var60 = var51; - if (var37 > 0) { - var51 += var37; - } - } - - var62 = var0.hitSplatCycles[var78] - Client.cycle; - int var63 = var93.field3323 - var62 * var93.field3323 / var93.field3318; - int var64 = var62 * var93.field3311 / var93.field3318 + -var93.field3311; - int var65 = var63 + (var2 + Client.viewportTempX - (var51 >> 1)); - int var66 = var64 + (var3 + Client.viewportTempY - 12); - int var67 = var66; - int var68 = var66 + var42; - int var69 = var66 + var93.field3334 + 15; - int var70 = var69 - var88.maxAscent; - int var71 = var69 + var88.maxDescent; - if (var70 < var66) { - var67 = var70; - } - - if (var71 > var68) { - var68 = var71; - } - - int var72 = 0; - int var73; - int var74; - if (var84 != null) { - var72 = var66 + var84.field3334 + 15; - var73 = var72 - var44.maxAscent; - var74 = var72 + var44.maxDescent; - if (var73 < var67) { - ; - } - - if (var74 > var68) { - ; - } - } - - var73 = 255; - if (var93.field3325 >= 0) { - var73 = (var62 << 8) / (var93.field3318 - var93.field3325); - } - - if (var73 >= 0 && var73 < 255) { - if (var97 != null) { - var97.drawTransAt(var65 + var52 - var26, var66, var73); - } - - if (var86 != null) { - var86.drawTransAt(var53 + var65 - var28, var66, var73); - } - - if (var98 != null) { - for (var74 = 0; var74 < var49; ++var74) { - var98.drawTransAt(var23 * var74 + (var54 + var65 - var27), var66, var73); - } - } - - if (var87 != null) { - var87.drawTransAt(var56 + var65 - var29, var66, var73); - } - - var88.drawAlpha(var45, var55 + var65, var69, var93.textColor, 0, var73); - if (var84 != null) { - if (var30 != null) { - var30.drawTransAt(var57 + var65 - var38, var66, var73); - } - - if (var32 != null) { - var32.drawTransAt(var58 + var65 - var40, var66, var73); - } - - if (var31 != null) { - for (var74 = 0; var74 < var50; ++var74) { - var31.drawTransAt(var35 * var74 + (var65 + var59 - var39), var66, var73); - } - } - - if (var33 != null) { - var33.drawTransAt(var60 + var65 - var41, var66, var73); - } - - var44.drawAlpha(var46, var65 + var61, var72, var84.textColor, 0, var73); - } - } else { - if (var97 != null) { - var97.drawTransBgAt(var65 + var52 - var26, var66); - } - - if (var86 != null) { - var86.drawTransBgAt(var65 + var53 - var28, var66); - } - - if (var98 != null) { - for (var74 = 0; var74 < var49; ++var74) { - var98.drawTransBgAt(var74 * var23 + (var54 + var65 - var27), var66); - } - } - - if (var87 != null) { - var87.drawTransBgAt(var56 + var65 - var29, var66); - } - - var88.draw(var45, var55 + var65, var69, var93.textColor | -16777216, 0); - if (var84 != null) { - if (var30 != null) { - var30.drawTransBgAt(var65 + var57 - var38, var66); - } - - if (var32 != null) { - var32.drawTransBgAt(var65 + var58 - var40, var66); - } - - if (var31 != null) { - for (var74 = 0; var74 < var50; ++var74) { - var31.drawTransBgAt(var74 * var35 + (var59 + var65 - var39), var66); - } - } - - if (var33 != null) { - var33.drawTransBgAt(var60 + var65 - var41, var66); - } - - var44.draw(var46, var61 + var65, var72, var84.textColor | -16777216, 0); - } - } - } - } - } - } - } + + return var2.toString(); + } + + @ObfuscatedName("v") + @ObfuscatedSignature( + signature = "(Lkc;IIIIIIB)V", + garbageValue = "106" + ) + @Export("loadTerrain") + static final void loadTerrain(Buffer var0, int var1, int var2, int var3, int var4, int var5, int var6) { + int var7; + if (var2 >= 0 && var2 < 104 && var3 >= 0 && var3 < 104) { + Tiles.Tiles_renderFlags[var1][var2][var3] = 0; + + while (true) { + var7 = var0.readUnsignedByte(); + if (var7 == 0) { + if (var1 == 0) { + Tiles.Tiles_heights[0][var2][var3] = -SpotAnimationDefinition.method4582(var2 + 932731 + var4, var5 + 556238 + var3) * 8; + } else { + Tiles.Tiles_heights[var1][var2][var3] = Tiles.Tiles_heights[var1 - 1][var2][var3] - 240; + } + break; + } + + if (var7 == 1) { + int var8 = var0.readUnsignedByte(); + if (var8 == 1) { + var8 = 0; + } + + if (var1 == 0) { + Tiles.Tiles_heights[0][var2][var3] = -var8 * 8; + } else { + Tiles.Tiles_heights[var1][var2][var3] = Tiles.Tiles_heights[var1 - 1][var2][var3] - var8 * 8; + } + break; + } + + if (var7 <= 49) { + Tiles.field485[var1][var2][var3] = var0.readByte(); + Tiles.field482[var1][var2][var3] = (byte)((var7 - 2) / 4); + Tiles.field483[var1][var2][var3] = (byte)(var7 - 2 + var6 & 3); + } else if (var7 <= 81) { + Tiles.Tiles_renderFlags[var1][var2][var3] = (byte)(var7 - 49); + } else { + SoundSystem.field1414[var1][var2][var3] = (byte)(var7 - 81); + } + } + } else { + while (true) { + var7 = var0.readUnsignedByte(); + if (var7 == 0) { + break; + } + + if (var7 == 1) { + var0.readUnsignedByte(); + break; + } + + if (var7 <= 49) { + var0.readUnsignedByte(); + } + } + } + } } diff --git a/runescape-client/src/main/java/class319.java b/runescape-client/src/main/java/class319.java new file mode 100644 index 0000000000..da32128fb8 --- /dev/null +++ b/runescape-client/src/main/java/class319.java @@ -0,0 +1,22 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("li") +public class class319 { + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(Lkf;IB)V", + garbageValue = "-107" + ) + @Export("updatePlayers") + static final void updatePlayers(PacketBuffer var0, int var1) { + int var2 = var0.offset; + Players.Players_pendingUpdateCount = 0; + DevicePcmPlayerProvider.method919(var0); + class2.method49(var0); + if (var0.offset - var2 != var1) { + throw new RuntimeException(var0.offset - var2 + " " + var1); + } + } +} diff --git a/runescape-client/src/main/java/class32.java b/runescape-client/src/main/java/class32.java index 290e8c7952..67320c684c 100644 --- a/runescape-client/src/main/java/class32.java +++ b/runescape-client/src/main/java/class32.java @@ -1,392 +1,137 @@ -import java.io.DataInputStream; -import java.net.URL; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InvalidClassException; +import java.io.ObjectInputStream; +import java.io.OptionalDataException; +import java.io.StreamCorruptedException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.Reflection; -@ObfuscatedName("ab") +@ObfuscatedName("ak") public class class32 { - @ObfuscatedName("r") + @ObfuscatedName("bc") @ObfuscatedSignature( - signature = "Llp;" + signature = "Lhr;" ) - @Export("titleboxSprite") - static IndexedSprite titleboxSprite; + static ServerBuild field265; - @ObfuscatedName("z") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Ljava/lang/Throwable;I)V", - garbageValue = "-806391378" + signature = "(Lkf;I)V", + garbageValue = "1545814995" ) - @Export("RunException_sendStackTrace") - public static void RunException_sendStackTrace(String var0, Throwable var1) { + @Export("performReflectionCheck") + public static void performReflectionCheck(PacketBuffer var0) { + ReflectionCheck var1 = (ReflectionCheck)class96.reflectionChecks.last(); if (var1 != null) { - var1.printStackTrace(); + int var2 = var0.offset; + var0.writeInt(var1.id); + + for (int var3 = 0; var3 < var1.size; ++var3) { + if (var1.creationErrors[var3] != 0) { + var0.writeByte(var1.creationErrors[var3]); + } else { + try { + int var4 = var1.operations[var3]; + Field var5; + int var6; + if (var4 == 0) { + var5 = var1.fields[var3]; + var6 = Reflection.getInt(var5, (Object)null); + var0.writeByte(0); + var0.writeInt(var6); + } else if (var4 == 1) { + var5 = var1.fields[var3]; + Reflection.setInt(var5, (Object)null, var1.intReplaceValues[var3]); + var0.writeByte(0); + } else if (var4 == 2) { + var5 = var1.fields[var3]; + var6 = var5.getModifiers(); + var0.writeByte(0); + var0.writeInt(var6); + } + + Method var25; + if (var4 != 3) { + if (var4 == 4) { + var25 = var1.methods[var3]; + var6 = var25.getModifiers(); + var0.writeByte(0); + var0.writeInt(var6); + } + } else { + var25 = var1.methods[var3]; + byte[][] var10 = var1.arguments[var3]; + Object[] var7 = new Object[var10.length]; + + for (int var8 = 0; var8 < var10.length; ++var8) { + ObjectInputStream var9 = new ObjectInputStream(new ByteArrayInputStream(var10[var8])); + var7[var8] = var9.readObject(); + } + + Object var11 = Reflection.invoke(var25, (Object)null, var7); + if (var11 == null) { + var0.writeByte(0); + } else if (var11 instanceof Number) { + var0.writeByte(1); + var0.writeLong(((Number)var11).longValue()); + } else if (var11 instanceof String) { + var0.writeByte(2); + var0.writeStringCp1252NullTerminated((String)var11); + } else { + var0.writeByte(4); + } + } + } catch (ClassNotFoundException var13) { + var0.writeByte(-10); + } catch (InvalidClassException var14) { + var0.writeByte(-11); + } catch (StreamCorruptedException var15) { + var0.writeByte(-12); + } catch (OptionalDataException var16) { + var0.writeByte(-13); + } catch (IllegalAccessException var17) { + var0.writeByte(-14); + } catch (IllegalArgumentException var18) { + var0.writeByte(-15); + } catch (InvocationTargetException var19) { + var0.writeByte(-16); + } catch (SecurityException var20) { + var0.writeByte(-17); + } catch (IOException var21) { + var0.writeByte(-18); + } catch (NullPointerException var22) { + var0.writeByte(-19); + } catch (Exception var23) { + var0.writeByte(-20); + } catch (Throwable var24) { + var0.writeByte(-21); + } + } + } + + var0.writeCrc(var2); + var1.remove(); + } + } + + @ObfuscatedName("m") + @ObfuscatedSignature( + signature = "(Lhq;III)Z", + garbageValue = "2112875950" + ) + public static boolean method618(AbstractArchive var0, int var1, int var2) { + byte[] var3 = var0.takeFile(var1, var2); + if (var3 == null) { + return false; } else { - try { - String var2 = ""; - if (var1 != null) { - var2 = WorldMapManager.method685(var1); - } - - if (var0 != null) { - if (var1 != null) { - var2 = var2 + " | "; - } - - var2 = var2 + var0; - } - - System.out.println("Error: " + var2); - var2 = var2.replace(':', '.'); - var2 = var2.replace('@', '_'); - var2 = var2.replace('&', '_'); - var2 = var2.replace('#', '_'); - if (RunException.RunException_applet == null) { - return; - } - - URL var3 = new URL(RunException.RunException_applet.getCodeBase(), "clienterror.ws?c=" + RunException.RunException_revision + "&u=" + RunException.localPlayerName + "&v1=" + TaskHandler.javaVendor + "&v2=" + TaskHandler.javaVersion + "&ct=" + ClientType.clientType + "&e=" + var2); - DataInputStream var4 = new DataInputStream(var3.openStream()); - var4.read(); - var4.close(); - } catch (Exception var5) { - } - - } - } - - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "(CI)C", - garbageValue = "-2024660468" - ) - static char method577(char var0) { - switch(var0) { - case ' ': - case '-': - case '_': - case ' ': - return '_'; - case '#': - case '[': - case ']': - return var0; - case 'À': - case 'Á': - case 'Â': - case 'Ã': - case 'Ä': - case 'à': - case 'á': - case 'â': - case 'ã': - case 'ä': - return 'a'; - case 'Ç': - case 'ç': - return 'c'; - case 'È': - case 'É': - case 'Ê': - case 'Ë': - case 'è': - case 'é': - case 'ê': - case 'ë': - return 'e'; - case 'Í': - case 'Î': - case 'Ï': - case 'í': - case 'î': - case 'ï': - return 'i'; - case 'Ñ': - case 'ñ': - return 'n'; - case 'Ò': - case 'Ó': - case 'Ô': - case 'Õ': - case 'Ö': - case 'ò': - case 'ó': - case 'ô': - case 'õ': - case 'ö': - return 'o'; - case 'Ù': - case 'Ú': - case 'Û': - case 'Ü': - case 'ù': - case 'ú': - case 'û': - case 'ü': - return 'u'; - case 'ß': - return 'b'; - case 'ÿ': - case 'Ÿ': - return 'y'; - default: - return Character.toLowerCase(var0); - } - } - - @ObfuscatedName("r") - public static int method578(long var0) { - return (int)(var0 >>> 7 & 127L); - } - - @ObfuscatedName("fg") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1866608014" - ) - static final void method571() { - int var0 = Players.Players_count; - int[] var1 = Players.Players_indices; - - for (int var2 = 0; var2 < var0; ++var2) { - Player var3 = Client.players[var1[var2]]; - if (var3 != null) { - class325.calculateActorPosition(var3, 1); - } - } - - } - - @ObfuscatedName("hi") - @ObfuscatedSignature( - signature = "(IIIII)V", - garbageValue = "1810963756" - ) - @Export("selectSpell") - static void selectSpell(int var0, int var1, int var2, int var3) { - Widget var4 = GrandExchangeOfferWorldComparator.getWidgetChild(var0, var1); - if (var4 != null && var4.onTargetEnter != null) { - ScriptEvent var5 = new ScriptEvent(); - var5.widget = var4; - var5.args = var4.onTargetEnter; - ParamDefinition.runScriptEvent(var5); - } - - Client.field793 = var3; - Client.isSpellSelected = true; - AttackOption.selectedSpellWidget = var0; - Client.selectedSpellChildIndex = var1; - ItemContainer.selectedSpellFlags = var2; - WorldMapSectionType.invalidateWidget(var4); - } - - @ObfuscatedName("hp") - @ObfuscatedSignature( - signature = "(IIIII)V", - garbageValue = "-1928557491" - ) - @Export("addSceneMenuOptions") - static final void addSceneMenuOptions(int var0, int var1, int var2, int var3) { - if (Client.isItemSelected == 0 && !Client.isSpellSelected) { - WorldMapData_1.insertMenuItemNoShift("Walk here", "", 23, 0, var0 - var2, var1 - var3); - } - - long var4 = -1L; - long var6 = -1L; - int var8 = 0; - - while (true) { - int var10 = ViewportMouse.ViewportMouse_entityCount; - if (var8 >= var10) { - if (-1L != var4) { - var8 = class2.ViewportMouse_unpackX(var4); - int var9 = method578(var4); - Player var27 = Client.players[Client.combatTargetPlayerIndex]; - GrandExchangeEvent.addPlayerToMenu(var27, Client.combatTargetPlayerIndex, var8, var9); - } - - return; - } - - long var11 = ViewportMouse.ViewportMouse_entityTags[var8]; - if (var11 != var6) { - label336: { - var6 = var11; - int var15 = class2.ViewportMouse_unpackX(ViewportMouse.ViewportMouse_entityTags[var8]); - int var16 = var15; - int var17 = ArchiveLoader.method1173(var8); - int var18 = class81.method2063(var8); - int var19 = class81.Entity_unpackID(ViewportMouse.ViewportMouse_entityTags[var8]); - int var20 = var19; - if (var18 == 2 && PacketWriter.scene.getObjectFlags(WorldMapRectangle.plane, var15, var17, var11) >= 0) { - ObjectDefinition var21 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var19); - if (var21.transforms != null) { - var21 = var21.transform(); - } - - if (var21 == null) { - break label336; - } - - if (Client.isItemSelected == 1) { - WorldMapData_1.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + World.colorStartTag(65535) + var21.name, 1, var19, var15, var17); - } else if (Client.isSpellSelected) { - if ((ItemContainer.selectedSpellFlags & 4) == 4) { - WorldMapData_1.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + World.colorStartTag(65535) + var21.name, 2, var19, var15, var17); - } - } else { - String[] var28 = var21.actions; - if (var28 != null) { - for (int var29 = 4; var29 >= 0; --var29) { - if (var28[var29] != null) { - short var24 = 0; - if (var29 == 0) { - var24 = 3; - } - - if (var29 == 1) { - var24 = 4; - } - - if (var29 == 2) { - var24 = 5; - } - - if (var29 == 3) { - var24 = 6; - } - - if (var29 == 4) { - var24 = 1001; - } - - WorldMapData_1.insertMenuItemNoShift(var28[var29], World.colorStartTag(65535) + var21.name, var24, var20, var16, var17); - } - } - } - - WorldMapData_1.insertMenuItemNoShift("Examine", World.colorStartTag(65535) + var21.name, 1002, var21.id, var16, var17); - } - } - - int var22; - NPC var23; - Player var25; - int[] var35; - int var37; - if (var18 == 1) { - NPC var32 = Client.npcs[var20]; - if (var32 == null) { - break label336; - } - - if (var32.definition.size == 1 && (var32.x & 127) == 64 && (var32.y & 127) == 64) { - for (var22 = 0; var22 < Client.npcCount; ++var22) { - var23 = Client.npcs[Client.npcIndices[var22]]; - if (var23 != null && var23 != var32 && var23.definition.size == 1 && var23.x == var32.x && var23.y == var32.y) { - class186.addNpcToMenu(var23.definition, Client.npcIndices[var22], var16, var17); - } - } - - var22 = Players.Players_count; - var35 = Players.Players_indices; - - for (var37 = 0; var37 < var22; ++var37) { - var25 = Client.players[var35[var37]]; - if (var25 != null && var32.x == var25.x && var32.y == var25.y) { - GrandExchangeEvent.addPlayerToMenu(var25, var35[var37], var16, var17); - } - } - } - - class186.addNpcToMenu(var32.definition, var20, var16, var17); - } - - if (var18 == 0) { - Player var33 = Client.players[var20]; - if (var33 == null) { - break label336; - } - - if ((var33.x & 127) == 64 && (var33.y & 127) == 64) { - for (var22 = 0; var22 < Client.npcCount; ++var22) { - var23 = Client.npcs[Client.npcIndices[var22]]; - if (var23 != null && var23.definition.size == 1 && var23.x == var33.x && var33.y == var23.y) { - class186.addNpcToMenu(var23.definition, Client.npcIndices[var22], var16, var17); - } - } - - var22 = Players.Players_count; - var35 = Players.Players_indices; - - for (var37 = 0; var37 < var22; ++var37) { - var25 = Client.players[var35[var37]]; - if (var25 != null && var33 != var25 && var33.x == var25.x && var33.y == var25.y) { - GrandExchangeEvent.addPlayerToMenu(var25, var35[var37], var16, var17); - } - } - } - - if (var20 != Client.combatTargetPlayerIndex) { - GrandExchangeEvent.addPlayerToMenu(var33, var20, var16, var17); - } else { - var4 = var11; - } - } - - if (var18 == 3) { - NodeDeque var34 = Client.groundItems[WorldMapRectangle.plane][var16][var17]; - if (var34 != null) { - for (TileItem var38 = (TileItem)var34.first(); var38 != null; var38 = (TileItem)var34.next()) { - ItemDefinition var36 = Occluder.ItemDefinition_get(var38.id); - if (Client.isItemSelected == 1) { - WorldMapData_1.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + World.colorStartTag(16748608) + var36.name, 16, var38.id, var16, var17); - } else if (Client.isSpellSelected) { - if ((ItemContainer.selectedSpellFlags & 1) == 1) { - WorldMapData_1.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + World.colorStartTag(16748608) + var36.name, 17, var38.id, var16, var17); - } - } else { - String[] var30 = var36.groundActions; - - for (int var31 = 4; var31 >= 0; --var31) { - if (var30 != null && var30[var31] != null) { - byte var26 = 0; - if (var31 == 0) { - var26 = 18; - } - - if (var31 == 1) { - var26 = 19; - } - - if (var31 == 2) { - var26 = 20; - } - - if (var31 == 3) { - var26 = 21; - } - - if (var31 == 4) { - var26 = 22; - } - - WorldMapData_1.insertMenuItemNoShift(var30[var31], World.colorStartTag(16748608) + var36.name, var26, var38.id, var16, var17); - } else if (var31 == 2) { - WorldMapData_1.insertMenuItemNoShift("Take", World.colorStartTag(16748608) + var36.name, 20, var38.id, var16, var17); - } - } - - WorldMapData_1.insertMenuItemNoShift("Examine", World.colorStartTag(16748608) + var36.name, 1004, var38.id, var16, var17); - } - } - } - } - } - } - - ++var8; + Message.SpriteBuffer_decode(var3); + return true; } } } diff --git a/runescape-client/src/main/java/class325.java b/runescape-client/src/main/java/class325.java index 226d7e4e1c..126a22a453 100644 --- a/runescape-client/src/main/java/class325.java +++ b/runescape-client/src/main/java/class325.java @@ -1,415 +1,31 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; -import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("lo") +@ObfuscatedName("ld") public class class325 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 2036297741 + intValue = 826035997 ) @Export("SpriteBuffer_spriteCount") - static int SpriteBuffer_spriteCount; - @ObfuscatedName("n") + public static int SpriteBuffer_spriteCount; + @ObfuscatedName("t") @ObfuscatedGetter( - intValue = -850597869 + intValue = 1495878133 ) @Export("SpriteBuffer_spriteWidth") public static int SpriteBuffer_spriteWidth; - @ObfuscatedName("u") - @Export("SpriteBuffer_xOffsets") - public static int[] SpriteBuffer_xOffsets; - @ObfuscatedName("p") - @Export("SpriteBuffer_spriteWidths") - public static int[] SpriteBuffer_spriteWidths; - @ObfuscatedName("m") + @ObfuscatedName("n") + @ObfuscatedGetter( + intValue = -941829717 + ) + @Export("SpriteBuffer_spriteHeight") + public static int SpriteBuffer_spriteHeight; + @ObfuscatedName("o") @Export("SpriteBuffer_spritePalette") public static int[] SpriteBuffer_spritePalette; - - @ObfuscatedName("fu") - @ObfuscatedSignature( - signature = "(Lby;II)V", - garbageValue = "771292121" - ) - @Export("calculateActorPosition") - static final void calculateActorPosition(Actor var0, int var1) { - SequenceDefinition var2; - int var4; - int var11; - int var12; - if (var0.field948 > Client.cycle) { - class191.method3639(var0); - } else if (var0.field976 >= Client.cycle) { - HealthBar.method2032(var0); - } else { - var0.movementSequence = var0.readySequence; - if (var0.pathLength == 0) { - var0.field949 = 0; - } else { - label548: { - if (var0.sequence != -1 && var0.sequenceDelay == 0) { - var2 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var0.sequence); - if (var0.field988 > 0 && var2.field3515 == 0) { - ++var0.field949; - break label548; - } - - if (var0.field988 <= 0 && var2.field3510 == 0) { - ++var0.field949; - break label548; - } - } - - var11 = var0.x; - var12 = var0.y; - var4 = var0.pathX[var0.pathLength - 1] * 128 + var0.size * -527978816; - int var5 = var0.size * -527978816 + var0.pathY[var0.pathLength - 1] * 128; - if (var11 < var4) { - if (var12 < var5) { - var0.orientation = 1280; - } else if (var12 > var5) { - var0.orientation = 1792; - } else { - var0.orientation = 1536; - } - } else if (var11 > var4) { - if (var12 < var5) { - var0.orientation = 768; - } else if (var12 > var5) { - var0.orientation = 256; - } else { - var0.orientation = 512; - } - } else if (var12 < var5) { - var0.orientation = 1024; - } else if (var12 > var5) { - var0.orientation = 0; - } - - byte var6 = var0.pathTraversed[var0.pathLength - 1]; - if (var4 - var11 <= 256 && var4 - var11 >= -256 && var5 - var12 <= 256 && var5 - var12 >= -256) { - int var7 = var0.orientation - var0.rotation & 2047; - if (var7 > 1024) { - var7 -= 2048; - } - - int var8 = var0.walkBackSequence; - if (var7 >= -256 && var7 <= 256) { - var8 = var0.walkSequence; - } else if (var7 >= 256 && var7 < 768) { - var8 = var0.walkRightSequence; - } else if (var7 >= -768 && var7 <= -256) { - var8 = var0.walkLeftSequence; - } - - if (var8 == -1) { - var8 = var0.walkSequence; - } - - var0.movementSequence = var8; - int var9 = 4; - boolean var10 = true; - if (var0 instanceof NPC) { - var10 = ((NPC)var0).definition.isClickable; - } - - if (var10) { - if (var0.rotation != var0.orientation && var0.targetIndex == -1 && var0.field982 != 0) { - var9 = 2; - } - - if (var0.pathLength > 2) { - var9 = 6; - } - - if (var0.pathLength > 3) { - var9 = 8; - } - - if (var0.field949 > 0 && var0.pathLength > 1) { - var9 = 8; - --var0.field949; - } - } else { - if (var0.pathLength > 1) { - var9 = 6; - } - - if (var0.pathLength > 2) { - var9 = 8; - } - - if (var0.field949 > 0 && var0.pathLength > 1) { - var9 = 8; - --var0.field949; - } - } - - if (var6 == 2) { - var9 <<= 1; - } - - if (var9 >= 8 && var0.walkSequence == var0.movementSequence && var0.runSequence != -1) { - var0.movementSequence = var0.runSequence; - } - - if (var11 != var4 || var12 != var5) { - if (var11 < var4) { - var0.x += var9; - if (var0.x > var4) { - var0.x = var4; - } - } else if (var11 > var4) { - var0.x -= var9; - if (var0.x < var4) { - var0.x = var4; - } - } - - if (var12 < var5) { - var0.y += var9; - if (var0.y > var5) { - var0.y = var5; - } - } else if (var12 > var5) { - var0.y -= var9; - if (var0.y < var5) { - var0.y = var5; - } - } - } - - if (var4 == var0.x && var5 == var0.y) { - --var0.pathLength; - if (var0.field988 > 0) { - --var0.field988; - } - } - } else { - var0.x = var4; - var0.y = var5; - --var0.pathLength; - if (var0.field988 > 0) { - --var0.field988; - } - } - } - } - } - - if (var0.x < 128 || var0.y < 128 || var0.x >= 13184 || var0.y >= 13184) { - var0.sequence = -1; - var0.spotAnimation = -1; - var0.field948 = 0; - var0.field976 = 0; - var0.x = var0.pathX[0] * 128 + var0.size * -527978816; - var0.y = var0.size * -527978816 + var0.pathY[0] * 128; - var0.method1765(); - } - - if (class223.localPlayer == var0 && (var0.x < 1536 || var0.y < 1536 || var0.x >= 11776 || var0.y >= 11776)) { - var0.sequence = -1; - var0.spotAnimation = -1; - var0.field948 = 0; - var0.field976 = 0; - var0.x = var0.size * -527978816 + var0.pathX[0] * 128; - var0.y = var0.size * -527978816 + var0.pathY[0] * 128; - var0.method1765(); - } - - if (var0.field982 != 0) { - if (var0.targetIndex != -1) { - Object var13 = null; - if (var0.targetIndex < 32768) { - var13 = Client.npcs[var0.targetIndex]; - } else if (var0.targetIndex >= 32768) { - var13 = Client.players[var0.targetIndex - 32768]; - } - - if (var13 != null) { - var12 = var0.x - ((Actor)var13).x; - var4 = var0.y - ((Actor)var13).y; - if (var12 != 0 || var4 != 0) { - var0.orientation = (int)(Math.atan2((double)var12, (double)var4) * 325.949D) & 2047; - } - } else if (var0.false0) { - var0.targetIndex = -1; - var0.false0 = false; - } - } - - if (var0.field957 != -1 && (var0.pathLength == 0 || var0.field949 > 0)) { - var0.orientation = var0.field957; - var0.field957 = -1; - } - - var11 = var0.orientation - var0.rotation & 2047; - if (var11 == 0 && var0.false0) { - var0.targetIndex = -1; - var0.false0 = false; - } - - if (var11 != 0) { - ++var0.field981; - boolean var14; - if (var11 > 1024) { - var0.rotation -= var0.field982; - var14 = true; - if (var11 < var0.field982 || var11 > 2048 - var0.field982) { - var0.rotation = var0.orientation; - var14 = false; - } - - if (var0.readySequence == var0.movementSequence && (var0.field981 > 25 || var14)) { - if (var0.turnLeftSequence != -1) { - var0.movementSequence = var0.turnLeftSequence; - } else { - var0.movementSequence = var0.walkSequence; - } - } - } else { - var0.rotation += var0.field982; - var14 = true; - if (var11 < var0.field982 || var11 > 2048 - var0.field982) { - var0.rotation = var0.orientation; - var14 = false; - } - - if (var0.movementSequence == var0.readySequence && (var0.field981 > 25 || var14)) { - if (var0.turnRightSequence != -1) { - var0.movementSequence = var0.turnRightSequence; - } else { - var0.movementSequence = var0.walkSequence; - } - } - } - - var0.rotation &= 2047; - } else { - var0.field981 = 0; - } - } - - var0.isWalking = false; - if (var0.movementSequence != -1) { - var2 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var0.movementSequence); - if (var2 != null && var2.frameIds != null) { - ++var0.movementFrameCycle; - if (var0.movementFrame < var2.frameIds.length && var0.movementFrameCycle > var2.frameLengths[var0.movementFrame]) { - var0.movementFrameCycle = 1; - ++var0.movementFrame; - class30.addSequenceSoundEffect(var2, var0.movementFrame, var0.x, var0.y); - } - - if (var0.movementFrame >= var2.frameIds.length) { - var0.movementFrameCycle = 0; - var0.movementFrame = 0; - class30.addSequenceSoundEffect(var2, var0.movementFrame, var0.x, var0.y); - } - } else { - var0.movementSequence = -1; - } - } - - if (var0.spotAnimation != -1 && Client.cycle >= var0.field969) { - if (var0.spotAnimationFrame < 0) { - var0.spotAnimationFrame = 0; - } - - var11 = InterfaceParent.SpotAnimationDefinition_get(var0.spotAnimation).sequence; - if (var11 != -1) { - SequenceDefinition var3 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var11); - if (var3 != null && var3.frameIds != null) { - ++var0.spotAnimationFrameCycle; - if (var0.spotAnimationFrame < var3.frameIds.length && var0.spotAnimationFrameCycle > var3.frameLengths[var0.spotAnimationFrame]) { - var0.spotAnimationFrameCycle = 1; - ++var0.spotAnimationFrame; - class30.addSequenceSoundEffect(var3, var0.spotAnimationFrame, var0.x, var0.y); - } - - if (var0.spotAnimationFrame >= var3.frameIds.length && (var0.spotAnimationFrame < 0 || var0.spotAnimationFrame >= var3.frameIds.length)) { - var0.spotAnimation = -1; - } - } else { - var0.spotAnimation = -1; - } - } else { - var0.spotAnimation = -1; - } - } - - if (var0.sequence != -1 && var0.sequenceDelay <= 1) { - var2 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var0.sequence); - if (var2.field3515 == 1 && var0.field988 > 0 && var0.field948 <= Client.cycle && var0.field976 < Client.cycle) { - var0.sequenceDelay = 1; - return; - } - } - - if (var0.sequence != -1 && var0.sequenceDelay == 0) { - var2 = GrandExchangeOfferUnitPriceComparator.SequenceDefinition_get(var0.sequence); - if (var2 != null && var2.frameIds != null) { - ++var0.sequenceFrameCycle; - if (var0.sequenceFrame < var2.frameIds.length && var0.sequenceFrameCycle > var2.frameLengths[var0.sequenceFrame]) { - var0.sequenceFrameCycle = 1; - ++var0.sequenceFrame; - class30.addSequenceSoundEffect(var2, var0.sequenceFrame, var0.x, var0.y); - } - - if (var0.sequenceFrame >= var2.frameIds.length) { - var0.sequenceFrame -= var2.frameCount; - ++var0.field965; - if (var0.field965 >= var2.field3503) { - var0.sequence = -1; - } else if (var0.sequenceFrame >= 0 && var0.sequenceFrame < var2.frameIds.length) { - class30.addSequenceSoundEffect(var2, var0.sequenceFrame, var0.x, var0.y); - } else { - var0.sequence = -1; - } - } - - var0.isWalking = var2.field3504; - } else { - var0.sequence = -1; - } - } - - if (var0.sequenceDelay > 0) { - --var0.sequenceDelay; - } - - } - - @ObfuscatedName("jc") - @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-761836956" - ) - static void method6190() { - for (InterfaceParent var0 = (InterfaceParent)Client.interfaceParents.first(); var0 != null; var0 = (InterfaceParent)Client.interfaceParents.next()) { - int var1 = var0.group; - if (WorldMapData_0.loadInterface(var1)) { - boolean var2 = true; - Widget[] var3 = UserComparator5.Widget_interfaceComponents[var1]; - - int var4; - for (var4 = 0; var4 < var3.length; ++var4) { - if (var3[var4] != null) { - var2 = var3[var4].isIf3; - break; - } - } - - if (!var2) { - var4 = (int)var0.key; - Widget var5 = Canvas.getWidget(var4); - if (var5 != null) { - WorldMapSectionType.invalidateWidget(var5); - } - } - } - } - - } + @ObfuscatedName("i") + @Export("SpriteBuffer_pixels") + public static byte[][] SpriteBuffer_pixels; } diff --git a/runescape-client/src/main/java/class326.java b/runescape-client/src/main/java/class326.java new file mode 100644 index 0000000000..4cfdf219ec --- /dev/null +++ b/runescape-client/src/main/java/class326.java @@ -0,0 +1,21 @@ +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("lz") +public class class326 { + @ObfuscatedName("i") + public static short[] field3881; + + @ObfuscatedName("h") + @ObfuscatedSignature( + signature = "(II)I", + garbageValue = "1165668124" + ) + public static int method6375(int var0) { + if (var0 > 0) { + return 1; + } else { + return var0 < 0 ? -1 : 0; + } + } +} diff --git a/runescape-client/src/main/java/class335.java b/runescape-client/src/main/java/class335.java new file mode 100644 index 0000000000..aff31374b7 --- /dev/null +++ b/runescape-client/src/main/java/class335.java @@ -0,0 +1,30 @@ +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("lg") +public abstract class class335 { + @ObfuscatedName("bq") + static String field4016; + + @ObfuscatedName("jk") + @ObfuscatedSignature( + signature = "(Ljava/lang/String;Lhi;B)Ljava/lang/String;", + garbageValue = "38" + ) + static String method6661(String var0, Widget var1) { + if (var0.indexOf("%") != -1) { + for (int var2 = 1; var2 <= 5; ++var2) { + while (true) { + int var3 = var0.indexOf("%" + var2); + if (var3 == -1) { + break; + } + + var0 = var0.substring(0, var3) + class173.method3728(class4.method73(var1, var2 - 1)) + var0.substring(var3 + 2); + } + } + } + + return var0; + } +} diff --git a/runescape-client/src/main/java/class336.java b/runescape-client/src/main/java/class336.java index 893ee9a5c5..ab0c9b9161 100644 --- a/runescape-client/src/main/java/class336.java +++ b/runescape-client/src/main/java/class336.java @@ -1,20 +1,20 @@ import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("lc") +@ObfuscatedName("ly") public class class336 { - @ObfuscatedName("i") - static final int[] field4019; - @ObfuscatedName("c") - static final int[] field4023; + @ObfuscatedName("d") + static final int[] field4022; + @ObfuscatedName("m") + static final int[] field4017; static { - field4019 = new int[2048]; - field4023 = new int[2048]; + field4022 = new int[2048]; + field4017 = new int[2048]; double var0 = 0.0030679615757712823D; for (int var2 = 0; var2 < 2048; ++var2) { - field4019[var2] = (int)(65536.0D * Math.sin(var0 * (double)var2)); - field4023[var2] = (int)(65536.0D * Math.cos((double)var2 * var0)); + field4022[var2] = (int)(65536.0D * Math.sin(var0 * (double)var2)); + field4017[var2] = (int)(65536.0D * Math.cos((double)var2 * var0)); } } diff --git a/runescape-client/src/main/java/class338.java b/runescape-client/src/main/java/class338.java index 45006197b0..b322bef6c2 100644 --- a/runescape-client/src/main/java/class338.java +++ b/runescape-client/src/main/java/class338.java @@ -1,14 +1,18 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; -@ObfuscatedName("mp") +@ObfuscatedName("mg") public class class338 { - @ObfuscatedName("v") + @ObfuscatedName("n") static final char[] field4036; - @ObfuscatedName("u") - static final char[] field4037; + @ObfuscatedName("q") + static final char[] field4038; + @ObfuscatedName("ge") + @Export("regionMapArchiveIds") + static int[] regionMapArchiveIds; static { field4036 = new char[]{' ', ' ', '_', '-', 'à', 'á', 'â', 'ä', 'ã', 'À', 'Á', 'Â', 'Ä', 'Ã', 'è', 'é', 'ê', 'ë', 'È', 'É', 'Ê', 'Ë', 'í', 'î', 'ï', 'Í', 'Î', 'Ï', 'ò', 'ó', 'ô', 'ö', 'õ', 'Ò', 'Ó', 'Ô', 'Ö', 'Õ', 'ù', 'ú', 'û', 'ü', 'Ù', 'Ú', 'Û', 'Ü', 'ç', 'Ç', 'ÿ', 'Ÿ', 'ñ', 'Ñ', 'ß'}; - field4037 = new char[]{'[', ']', '#'}; + field4038 = new char[]{'[', ']', '#'}; } } diff --git a/runescape-client/src/main/java/class339.java b/runescape-client/src/main/java/class339.java new file mode 100644 index 0000000000..14cf8e47c2 --- /dev/null +++ b/runescape-client/src/main/java/class339.java @@ -0,0 +1,11 @@ +import net.runelite.mapping.ObfuscatedGetter; +import net.runelite.mapping.ObfuscatedName; + +@ObfuscatedName("mx") +public class class339 { + @ObfuscatedName("be") + @ObfuscatedGetter( + intValue = 566181067 + ) + static int field4041; +} diff --git a/runescape-client/src/main/java/class4.java b/runescape-client/src/main/java/class4.java index e1deb727da..88e3945ff0 100644 --- a/runescape-client/src/main/java/class4.java +++ b/runescape-client/src/main/java/class4.java @@ -1,171 +1,741 @@ -import java.lang.management.GarbageCollectorMXBean; -import java.lang.management.ManagementFactory; -import java.util.Iterator; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("r") +@ObfuscatedName("v") final class class4 implements class0 { - @ObfuscatedName("gj") + @ObfuscatedName("po") @ObfuscatedSignature( - signature = "[Llp;" + signature = "Ljp;" ) - @Export("scrollBarSprites") - static IndexedSprite[] scrollBarSprites; + @Export("clanChat") + static ClanChat clanChat; + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "Llw;" + ) + static IndexedSprite field23; + @ObfuscatedName("gg") + @ObfuscatedSignature( + signature = "Llx;" + ) + @Export("redHintArrowSprite") + static Sprite redHintArrowSprite; - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Ljava/lang/Object;Lkl;B)V", - garbageValue = "0" + signature = "(Ljava/lang/Object;Lkc;B)V", + garbageValue = "25" ) - public void vmethod64(Object var1, Buffer var2) { - this.method54((String)var1, var2); + public void vmethod89(Object var1, Buffer var2) { + this.method85((String)var1, var2); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Lkl;B)Ljava/lang/Object;", - garbageValue = "-93" + signature = "(Lkc;I)Ljava/lang/Object;", + garbageValue = "242985434" ) - public Object vmethod55(Buffer var1) { + public Object vmethod74(Buffer var1) { return var1.readStringCp1252NullTerminated(); } @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(Ljava/lang/String;Lkl;I)V", - garbageValue = "-1135540783" + signature = "(Ljava/lang/String;Lkc;B)V", + garbageValue = "0" ) - void method54(String var1, Buffer var2) { + void method85(String var1, Buffer var2) { var2.writeStringCp1252NullTerminated(var1); } - @ObfuscatedName("u") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IIIIB)V", - garbageValue = "-25" + signature = "(Lbi;II)V", + garbageValue = "-2040444199" ) - @Export("itemContainerSetItem") - static void itemContainerSetItem(int var0, int var1, int var2, int var3) { - ItemContainer var4 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); - if (var4 == null) { - var4 = new ItemContainer(); - ItemContainer.itemContainers.put(var4, (long)var0); + @Export("runScript") + static void runScript(ScriptEvent var0, int var1) { + Object[] var2 = var0.args; + Script var3; + int var17; + if (PlayerAppearance.isWorldMapEvent(var0.type)) { + WorldMapSprite.worldMapEvent = (WorldMapEvent)var2[0]; + WorldMapElement var4 = class65.WorldMapElement_get(WorldMapSprite.worldMapEvent.mapElement); + var3 = WorldMapIcon_1.getWorldMapScript(var0.type, var4.objectId, var4.category); + } else { + var17 = (Integer)var2[0]; + var3 = GrandExchangeOffer.getScript(var17); } - if (var4.ids.length <= var1) { - int[] var5 = new int[var1 + 1]; - int[] var6 = new int[var1 + 1]; + if (var3 != null) { + Interpreter.Interpreter_intStackSize = 0; + WorldMapDecoration.Interpreter_stringStackSize = 0; + var17 = -1; + int[] var5 = var3.opcodes; + int[] var6 = var3.intOperands; + byte var7 = -1; + Interpreter.Interpreter_frameDepth = 0; + Interpreter.field1075 = false; - int var7; - for (var7 = 0; var7 < var4.ids.length; ++var7) { - var5[var7] = var4.ids[var7]; - var6[var7] = var4.quantities[var7]; - } - - for (var7 = var4.ids.length; var7 < var1; ++var7) { - var5[var7] = -1; - var6[var7] = 0; - } - - var4.ids = var5; - var4.quantities = var6; - } - - var4.ids[var1] = var2; - var4.quantities[var1] = var3; - } - - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "(Lbo;I)V", - garbageValue = "688122635" - ) - @Export("changeWorld") - static void changeWorld(World var0) { - if (var0.isMembersOnly() != Client.isMembersWorld) { - Client.isMembersWorld = var0.isMembersOnly(); - class1.method16(var0.isMembersOnly()); - } - - class160.worldHost = var0.host; - Client.worldId = var0.id; - Client.worldProperties = var0.properties; - HitSplatDefinition.port1 = Client.gameBuild == 0 ? 43594 : var0.id + 40000; - BZip2State.port2 = Client.gameBuild == 0 ? 443 : var0.id + 50000; - NPC.port3 = HitSplatDefinition.port1; - } - - @ObfuscatedName("aq") - @ObfuscatedSignature( - signature = "(I)I", - garbageValue = "-1757923424" - ) - @Export("getGcDuration") - protected static int getGcDuration() { - int var0 = 0; - if (AbstractUserComparator.garbageCollector == null || !AbstractUserComparator.garbageCollector.isValid()) { try { - Iterator var1 = ManagementFactory.getGarbageCollectorMXBeans().iterator(); + int var10; + try { + World.Interpreter_intLocals = new int[var3.localIntCount]; + int var8 = 0; + Interpreter.Interpreter_stringLocals = new String[var3.localStringCount]; + int var9 = 0; - while (var1.hasNext()) { - GarbageCollectorMXBean var2 = (GarbageCollectorMXBean)var1.next(); - if (var2.isValid()) { - AbstractUserComparator.garbageCollector = var2; - GameShell.garbageCollectorLastCheckTimeMs = -1L; - GameShell.garbageCollectorLastCollectionTime = -1L; + int var11; + String var18; + for (var10 = 1; var10 < var2.length; ++var10) { + if (var2[var10] instanceof Integer) { + var11 = (Integer)var2[var10]; + if (var11 == -2147483647) { + var11 = var0.mouseX; + } + + if (var11 == -2147483646) { + var11 = var0.mouseY; + } + + if (var11 == -2147483645) { + var11 = var0.widget != null ? var0.widget.id : -1; + } + + if (var11 == -2147483644) { + var11 = var0.opIndex; + } + + if (var11 == -2147483643) { + var11 = var0.widget != null ? var0.widget.childIndex : -1; + } + + if (var11 == -2147483642) { + var11 = var0.dragTarget != null ? var0.dragTarget.id : -1; + } + + if (var11 == -2147483641) { + var11 = var0.dragTarget != null ? var0.dragTarget.childIndex : -1; + } + + if (var11 == -2147483640) { + var11 = var0.keyTyped; + } + + if (var11 == -2147483639) { + var11 = var0.keyPressed; + } + + World.Interpreter_intLocals[var8++] = var11; + } else if (var2[var10] instanceof String) { + var18 = (String)var2[var10]; + if (var18.equals("event_opbase")) { + var18 = var0.targetName; + } + + Interpreter.Interpreter_stringLocals[var9++] = var18; + } } - } - } catch (Throwable var11) { - } - } - if (AbstractUserComparator.garbageCollector != null) { - long var9 = class30.currentTimeMillis(); - long var3 = AbstractUserComparator.garbageCollector.getCollectionTime(); - if (GameShell.garbageCollectorLastCollectionTime != -1L) { - long var5 = var3 - GameShell.garbageCollectorLastCollectionTime; - long var7 = var9 - GameShell.garbageCollectorLastCheckTimeMs; - if (0L != var7) { - var0 = (int)(var5 * 100L / var7); - } - } + var10 = 0; + Interpreter.field1080 = var0.field550; - GameShell.garbageCollectorLastCollectionTime = var3; - GameShell.garbageCollectorLastCheckTimeMs = var9; - } - - return var0; - } - - @ObfuscatedName("gg") - @ObfuscatedSignature( - signature = "(ZB)V", - garbageValue = "57" - ) - @Export("addNpcsToScene") - static final void addNpcsToScene(boolean var0) { - for (int var1 = 0; var1 < Client.npcCount; ++var1) { - NPC var2 = Client.npcs[Client.npcIndices[var1]]; - if (var2 != null && var2.isVisible() && var2.definition.isVisible == var0 && var2.definition.transformIsVisible()) { - int var3 = var2.x >> 7; - int var4 = var2.y >> 7; - if (var3 >= 0 && var3 < 104 && var4 >= 0 && var4 < 104) { - if (var2.size * 1669471931 == 1 && (var2.x & 127) == 64 && (var2.y & 127) == 64) { - if (Client.tileLastDrawnActor[var3][var4] == Client.viewportDrawCount) { - continue; + while (true) { + ++var10; + if (var10 > var1) { + throw new RuntimeException(); } - Client.tileLastDrawnActor[var3][var4] = Client.viewportDrawCount; + ++var17; + int var29 = var5[var17]; + int var20; + if (var29 >= 100) { + boolean var32; + if (var3.intOperands[var17] == 1) { + var32 = true; + } else { + var32 = false; + } + + var20 = ScriptFrame.method1218(var29, var3, var32); + switch(var20) { + case 0: + return; + case 1: + default: + break; + case 2: + throw new IllegalStateException(); + } + } else if (var29 == ScriptOpcodes.ICONST) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6[var17]; + } else if (var29 == ScriptOpcodes.GET_VARP) { + var11 = var6[var17]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Varps.Varps_main[var11]; + } else if (var29 == ScriptOpcodes.SET_VARP) { + var11 = var6[var17]; + Varps.Varps_main[var11] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + WorldMapDecoration.method389(var11); + } else if (var29 == ScriptOpcodes.SCONST) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.stringOperands[var17]; + } else if (var29 == ScriptOpcodes.JUMP) { + var17 += var6[var17]; + } else if (var29 == ScriptOpcodes.IF_ICMPNE) { + Interpreter.Interpreter_intStackSize -= 2; + if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] != Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { + var17 += var6[var17]; + } + } else if (var29 == ScriptOpcodes.IF_ICMPEQ) { + Interpreter.Interpreter_intStackSize -= 2; + if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] == Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { + var17 += var6[var17]; + } + } else if (var29 == ScriptOpcodes.IF_ICMPLT) { + Interpreter.Interpreter_intStackSize -= 2; + if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] < Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { + var17 += var6[var17]; + } + } else if (var29 == ScriptOpcodes.IF_ICMPGT) { + Interpreter.Interpreter_intStackSize -= 2; + if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] > Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { + var17 += var6[var17]; + } + } else if (var29 == ScriptOpcodes.RETURN) { + if (Interpreter.Interpreter_frameDepth == 0) { + return; + } + + ScriptFrame var34 = Interpreter.Interpreter_frames[--Interpreter.Interpreter_frameDepth]; + var3 = var34.script; + var5 = var3.opcodes; + var6 = var3.intOperands; + var17 = var34.pc; + World.Interpreter_intLocals = var34.intLocals; + Interpreter.Interpreter_stringLocals = var34.stringLocals; + } else if (var29 == ScriptOpcodes.GET_VARBIT) { + var11 = var6[var17]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator9.getVarbit(var11); + } else if (var29 == ScriptOpcodes.SET_VARBIT) { + var11 = var6[var17]; + Message.method1299(var11, Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + } else if (var29 == ScriptOpcodes.IF_ICMPLE) { + Interpreter.Interpreter_intStackSize -= 2; + if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] <= Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { + var17 += var6[var17]; + } + } else if (var29 == ScriptOpcodes.IF_ICMPGE) { + Interpreter.Interpreter_intStackSize -= 2; + if (Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] >= Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]) { + var17 += var6[var17]; + } + } else if (var29 == ScriptOpcodes.ILOAD) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = World.Interpreter_intLocals[var6[var17]]; + } else if (var29 == ScriptOpcodes.ISTORE) { + World.Interpreter_intLocals[var6[var17]] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + } else if (var29 == ScriptOpcodes.SLOAD) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = Interpreter.Interpreter_stringLocals[var6[var17]]; + } else if (var29 == ScriptOpcodes.SSTORE) { + Interpreter.Interpreter_stringLocals[var6[var17]] = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + } else if (var29 == ScriptOpcodes.JOIN_STRING) { + var11 = var6[var17]; + WorldMapDecoration.Interpreter_stringStackSize -= var11; + String var31 = WorldMapDecorationType.method4270(Interpreter.Interpreter_stringStack, WorldMapDecoration.Interpreter_stringStackSize, var11); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var31; + } else if (var29 == ScriptOpcodes.POP_INT) { + --Interpreter.Interpreter_intStackSize; + } else if (var29 == ScriptOpcodes.POP_STRING) { + --WorldMapDecoration.Interpreter_stringStackSize; + } else { + int var15; + if (var29 != ScriptOpcodes.INVOKE) { + if (var29 == ScriptOpcodes.GET_VARC_INT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class1.varcs.getInt(var6[var17]); + } else if (var29 == ScriptOpcodes.SET_VARC_INT) { + class1.varcs.setInt(var6[var17], Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + } else if (var29 == ScriptOpcodes.DEFINE_ARRAY) { + var11 = var6[var17] >> 16; + var20 = var6[var17] & 65535; + int var21 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var21 < 0 || var21 > 5000) { + throw new RuntimeException(); + } + + Interpreter.Interpreter_arrayLengths[var11] = var21; + byte var22 = -1; + if (var20 == 105) { + var22 = 0; + } + + for (var15 = 0; var15 < var21; ++var15) { + Interpreter.Interpreter_arrays[var11][var15] = var22; + } + } else if (var29 == ScriptOpcodes.GET_ARRAY_INT) { + var11 = var6[var17]; + var20 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var20 < 0 || var20 >= Interpreter.Interpreter_arrayLengths[var11]) { + throw new RuntimeException(); + } + + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Interpreter.Interpreter_arrays[var11][var20]; + } else if (var29 == ScriptOpcodes.SET_ARRAY_INT) { + var11 = var6[var17]; + Interpreter.Interpreter_intStackSize -= 2; + var20 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + if (var20 < 0 || var20 >= Interpreter.Interpreter_arrayLengths[var11]) { + throw new RuntimeException(); + } + + Interpreter.Interpreter_arrays[var11][var20] = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + } else if (var29 == ScriptOpcodes.GET_VARC_STRING_OLD) { + var18 = class1.varcs.getStringOld(var6[var17]); + if (var18 == null) { + var18 = "null"; + } + + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var18; + } else if (var29 == ScriptOpcodes.SET_VARC_STRING_OLD) { + class1.varcs.setStringOld(var6[var17], Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]); + } else if (var29 == ScriptOpcodes.GET_VARC_STRING) { + var18 = class1.varcs.getString(var6[var17]); + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var18; + } else if (var29 == ScriptOpcodes.SET_VARC_STRING) { + class1.varcs.setString(var6[var17], Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]); + } else { + if (var29 != ScriptOpcodes.SWITCH) { + throw new IllegalStateException(); + } + + IterableNodeHashTable var33 = var3.switches[var6[var17]]; + IntegerNode var30 = (IntegerNode)var33.get((long)Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + if (var30 != null) { + var17 += var30.integer; + } + } + } else { + var11 = var6[var17]; + Script var12 = GrandExchangeOffer.getScript(var11); + int[] var13 = new int[var12.localIntCount]; + String[] var14 = new String[var12.localStringCount]; + + for (var15 = 0; var15 < var12.intArgumentCount; ++var15) { + var13[var15] = Interpreter.Interpreter_intStack[var15 + (Interpreter.Interpreter_intStackSize - var12.intArgumentCount)]; + } + + for (var15 = 0; var15 < var12.stringArgumentCount; ++var15) { + var14[var15] = Interpreter.Interpreter_stringStack[var15 + (WorldMapDecoration.Interpreter_stringStackSize - var12.stringArgumentCount)]; + } + + Interpreter.Interpreter_intStackSize -= var12.intArgumentCount; + WorldMapDecoration.Interpreter_stringStackSize -= var12.stringArgumentCount; + ScriptFrame var19 = new ScriptFrame(); + var19.script = var3; + var19.pc = var17; + var19.intLocals = World.Interpreter_intLocals; + var19.stringLocals = Interpreter.Interpreter_stringLocals; + Interpreter.Interpreter_frames[++Interpreter.Interpreter_frameDepth - 1] = var19; + var3 = var12; + var5 = var12.opcodes; + var6 = var12.intOperands; + var17 = -1; + World.Interpreter_intLocals = var13; + Interpreter.Interpreter_stringLocals = var14; + } + } + } + } catch (Exception var27) { + StringBuilder var24 = new StringBuilder(30); + var24.append("").append(var3.key).append(" "); + + for (var10 = Interpreter.Interpreter_frameDepth - 1; var10 >= 0; --var10) { + var24.append("").append(Interpreter.Interpreter_frames[var10].script.key).append(" "); } - long var5 = class267.calculateTag(0, 0, 1, !var2.definition.isInteractable, Client.npcIndices[var1]); - var2.playerCycle = Client.cycle; - PacketWriter.scene.drawEntity(WorldMapRectangle.plane, var2.x, var2.y, MusicPatchPcmStream.getTileHeight(var2.size * -527978816 - 64 + var2.x, var2.size * -527978816 - 64 + var2.y, WorldMapRectangle.plane), var2.size * -527978816 - 64 + 60, var2, var2.rotation, var5, var2.isWalking); + var24.append("").append(var7); + User.RunException_sendStackTrace(var24.toString(), var27); } + } finally { + if (Interpreter.field1075) { + Interpreter.field1076 = true; + Skills.method4271(); + Interpreter.field1076 = false; + Interpreter.field1075 = false; + } + } } + } + @ObfuscatedName("n") + @ObfuscatedSignature( + signature = "(Lkc;I)Ljava/lang/String;", + garbageValue = "-1998352105" + ) + public static String method90(Buffer var0) { + return ArchiveLoader.method1234(var0, 32767); + } + + @ObfuscatedName("hr") + @ObfuscatedSignature( + signature = "(III)V", + garbageValue = "-230464245" + ) + @Export("updateItemPile") + static final void updateItemPile(int var0, int var1) { + NodeDeque var2 = Client.groundItems[Player.Scene_plane][var0][var1]; + if (var2 == null) { + WorldMapArea.scene.removeGroundItemPile(Player.Scene_plane, var0, var1); + } else { + long var3 = -99999999L; + TileItem var5 = null; + + TileItem var6; + for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) { + ItemDefinition var7 = class222.ItemDefinition_get(var6.id); + long var8 = (long)var7.price; + if (var7.isStackable == 1) { + var8 *= (long)(var6.quantity + 1); + } + + if (var8 > var3) { + var3 = var8; + var5 = var6; + } + } + + if (var5 == null) { + WorldMapArea.scene.removeGroundItemPile(Player.Scene_plane, var0, var1); + } else { + var2.addLast(var5); + TileItem var12 = null; + TileItem var11 = null; + + for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) { + if (var6.id != var5.id) { + if (var12 == null) { + var12 = var6; + } + + if (var6.id != var12.id && var11 == null) { + var11 = var6; + } + } + } + + long var9 = class160.calculateTag(var0, var1, 3, false, 0); + WorldMapArea.scene.newGroundItemPile(Player.Scene_plane, var0, var1, GraphicsObject.getTileHeight(var0 * 128 + 64, var1 * 128 + 64, Player.Scene_plane), var5, var9, var12, var11); + } + } + } + + @ObfuscatedName("jc") + @ObfuscatedSignature( + signature = "(Lhi;IB)I", + garbageValue = "0" + ) + static final int method73(Widget var0, int var1) { + if (var0.cs1Instructions != null && var1 < var0.cs1Instructions.length) { + try { + int[] var2 = var0.cs1Instructions[var1]; + int var3 = 0; + int var4 = 0; + byte var5 = 0; + + while (true) { + int var6 = var2[var4++]; + int var7 = 0; + byte var8 = 0; + if (var6 == 0) { + return var3; + } + + if (var6 == 1) { + var7 = Client.currentLevels[var2[var4++]]; + } + + if (var6 == 2) { + var7 = Client.levels[var2[var4++]]; + } + + if (var6 == 3) { + var7 = Client.experience[var2[var4++]]; + } + + int var9; + Widget var10; + int var11; + int var12; + if (var6 == 4) { + var9 = var2[var4++] << 16; + var9 += var2[var4++]; + var10 = PacketBufferNode.getWidget(var9); + var11 = var2[var4++]; + if (var11 != -1 && (!class222.ItemDefinition_get(var11).isMembersOnly || Client.isMembersWorld)) { + for (var12 = 0; var12 < var10.itemIds.length; ++var12) { + if (var11 + 1 == var10.itemIds[var12]) { + var7 += var10.itemQuantities[var12]; + } + } + } + } + + if (var6 == 5) { + var7 = Varps.Varps_main[var2[var4++]]; + } + + if (var6 == 6) { + var7 = Skills.Skills_experienceTable[Client.levels[var2[var4++]] - 1]; + } + + if (var6 == 7) { + var7 = Varps.Varps_main[var2[var4++]] * 100 / 46875; + } + + if (var6 == 8) { + var7 = class215.localPlayer.combatLevel; + } + + if (var6 == 9) { + for (var9 = 0; var9 < 25; ++var9) { + if (Skills.Skills_enabled[var9]) { + var7 += Client.levels[var9]; + } + } + } + + if (var6 == 10) { + var9 = var2[var4++] << 16; + var9 += var2[var4++]; + var10 = PacketBufferNode.getWidget(var9); + var11 = var2[var4++]; + if (var11 != -1 && (!class222.ItemDefinition_get(var11).isMembersOnly || Client.isMembersWorld)) { + for (var12 = 0; var12 < var10.itemIds.length; ++var12) { + if (var11 + 1 == var10.itemIds[var12]) { + var7 = 999999999; + break; + } + } + } + } + + if (var6 == 11) { + var7 = Client.runEnergy; + } + + if (var6 == 12) { + var7 = Client.weight; + } + + if (var6 == 13) { + var9 = Varps.Varps_main[var2[var4++]]; + int var13 = var2[var4++]; + var7 = (var9 & 1 << var13) != 0 ? 1 : 0; + } + + if (var6 == 14) { + var9 = var2[var4++]; + var7 = UserComparator9.getVarbit(var9); + } + + if (var6 == 15) { + var8 = 1; + } + + if (var6 == 16) { + var8 = 2; + } + + if (var6 == 17) { + var8 = 3; + } + + if (var6 == 18) { + var7 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); + } + + if (var6 == 19) { + var7 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); + } + + if (var6 == 20) { + var7 = var2[var4++]; + } + + if (var8 == 0) { + if (var5 == 0) { + var3 += var7; + } + + if (var5 == 1) { + var3 -= var7; + } + + if (var5 == 2 && var7 != 0) { + var3 /= var7; + } + + if (var5 == 3) { + var3 *= var7; + } + + var5 = 0; + } else { + var5 = var8; + } + } + } catch (Exception var14) { + return -1; + } + } else { + return -2; + } + } + + @ObfuscatedName("kk") + @ObfuscatedSignature( + signature = "(Lhi;III)V", + garbageValue = "-879504077" + ) + @Export("clickWidget") + static final void clickWidget(Widget var0, int var1, int var2) { + if (Client.clickedWidget == null && !Client.isMenuOpen) { + if (var0 != null && class30.method604(var0) != null) { + Client.clickedWidget = var0; + Client.clickedWidgetParent = class30.method604(var0); + Client.widgetClickX = var1; + Client.widgetClickY = var2; + FloorDecoration.widgetDragDuration = 0; + Client.isDraggingWidget = false; + int var3 = class16.getNewestMenuIdx(); + if (var3 != -1) { + Script.method2384(var3); + } + + } + } + } + + @ObfuscatedName("kd") + @ObfuscatedSignature( + signature = "(Lhi;IIII)V", + garbageValue = "1498154785" + ) + @Export("drawMinimap") + static final void drawMinimap(Widget var0, int var1, int var2, int var3) { + ChatChannel.playPcmPlayers(); + SpriteMask var4 = var0.getSpriteMask(false); + if (var4 != null) { + Rasterizer2D.Rasterizer2D_setClip(var1, var2, var4.width + var1, var2 + var4.height); + if (Client.minimapState != 2 && Client.minimapState != 5) { + int var5 = Client.camAngleY & 2047; + int var6 = class215.localPlayer.x / 32 + 48; + int var7 = 464 - class215.localPlayer.y / 32; + FloorDecoration.sceneMinimapSprite.drawRotatedMaskedCenteredAround(var1, var2, var4.width, var4.height, var6, var7, var5, 256, var4.xStarts, var4.xWidths); + + int var8; + int var9; + int var10; + for (var8 = 0; var8 < Client.mapIconCount; ++var8) { + var9 = Client.mapIconXs[var8] * 4 + 2 - class215.localPlayer.x / 32; + var10 = Client.mapIconYs[var8] * 4 + 2 - class215.localPlayer.y / 32; + Message.drawSpriteOnMinimap(var1, var2, var9, var10, Client.mapIcons[var8], var4); + } + + int var11; + int var12; + for (var8 = 0; var8 < 104; ++var8) { + for (var9 = 0; var9 < 104; ++var9) { + NodeDeque var15 = Client.groundItems[Player.Scene_plane][var8][var9]; + if (var15 != null) { + var11 = var8 * 4 + 2 - class215.localPlayer.x / 32; + var12 = var9 * 4 + 2 - class215.localPlayer.y / 32; + Message.drawSpriteOnMinimap(var1, var2, var11, var12, class42.mapDotSprites[0], var4); + } + } + } + + for (var8 = 0; var8 < Client.npcCount; ++var8) { + NPC var16 = Client.npcs[Client.npcIndices[var8]]; + if (var16 != null && var16.isVisible()) { + NPCDefinition var18 = var16.definition; + if (var18 != null && var18.transforms != null) { + var18 = var18.transform(); + } + + if (var18 != null && var18.drawMapDot && var18.isInteractable) { + var11 = var16.x / 32 - class215.localPlayer.x / 32; + var12 = var16.y / 32 - class215.localPlayer.y / 32; + Message.drawSpriteOnMinimap(var1, var2, var11, var12, class42.mapDotSprites[1], var4); + } + } + } + + var8 = Players.Players_count; + int[] var19 = Players.Players_indices; + + for (var10 = 0; var10 < var8; ++var10) { + Player var17 = Client.players[var19[var10]]; + if (var17 != null && var17.isVisible() && !var17.isHidden && var17 != class215.localPlayer) { + var12 = var17.x / 32 - class215.localPlayer.x / 32; + int var13 = var17.y / 32 - class215.localPlayer.y / 32; + boolean var14 = false; + if (class215.localPlayer.team != 0 && var17.team != 0 && var17.team == class215.localPlayer.team) { + var14 = true; + } + + if (var17.isFriend()) { + Message.drawSpriteOnMinimap(var1, var2, var12, var13, class42.mapDotSprites[3], var4); + } else if (var14) { + Message.drawSpriteOnMinimap(var1, var2, var12, var13, class42.mapDotSprites[4], var4); + } else if (var17.isClanMember()) { + Message.drawSpriteOnMinimap(var1, var2, var12, var13, class42.mapDotSprites[5], var4); + } else { + Message.drawSpriteOnMinimap(var1, var2, var12, var13, class42.mapDotSprites[2], var4); + } + } + } + + if (Client.hintArrowType != 0 && Client.cycle % 20 < 10) { + if (Client.hintArrowType == 1 && Client.hintArrowNpcIndex >= 0 && Client.hintArrowNpcIndex < Client.npcs.length) { + NPC var20 = Client.npcs[Client.hintArrowNpcIndex]; + if (var20 != null) { + var11 = var20.x / 32 - class215.localPlayer.x / 32; + var12 = var20.y / 32 - class215.localPlayer.y / 32; + WorldMapManager.worldToMinimap(var1, var2, var11, var12, GrandExchangeOfferOwnWorldComparator.mapMarkerSprites[1], var4); + } + } + + if (Client.hintArrowType == 2) { + var10 = Client.hintArrowX * 4 - UserComparator8.baseX * 256 + 2 - class215.localPlayer.x / 32; + var11 = Client.hintArrowY * 4 - HealthBar.baseY * 256 + 2 - class215.localPlayer.y / 32; + WorldMapManager.worldToMinimap(var1, var2, var10, var11, GrandExchangeOfferOwnWorldComparator.mapMarkerSprites[1], var4); + } + + if (Client.hintArrowType == 10 && Client.hintArrowPlayerIndex >= 0 && Client.hintArrowPlayerIndex < Client.players.length) { + Player var21 = Client.players[Client.hintArrowPlayerIndex]; + if (var21 != null) { + var11 = var21.x / 32 - class215.localPlayer.x / 32; + var12 = var21.y / 32 - class215.localPlayer.y / 32; + WorldMapManager.worldToMinimap(var1, var2, var11, var12, GrandExchangeOfferOwnWorldComparator.mapMarkerSprites[1], var4); + } + } + } + + if (Client.destinationX != 0) { + var10 = Client.destinationX * 4 + 2 - class215.localPlayer.x / 32; + var11 = Client.destinationY * 4 + 2 - class215.localPlayer.y / 32; + Message.drawSpriteOnMinimap(var1, var2, var10, var11, GrandExchangeOfferOwnWorldComparator.mapMarkerSprites[0], var4); + } + + if (!class215.localPlayer.isHidden) { + Rasterizer2D.Rasterizer2D_fillRectangle(var4.width / 2 + var1 - 1, var4.height / 2 + var2 - 1, 3, 3, 16777215); + } + } else { + Rasterizer2D.Rasterizer2D_fillMaskedRectangle(var1, var2, 0, var4.xStarts, var4.xWidths); + } + + Client.field837[var3] = true; + } } } diff --git a/runescape-client/src/main/java/class40.java b/runescape-client/src/main/java/class40.java index cb645eb30d..1157817db6 100644 --- a/runescape-client/src/main/java/class40.java +++ b/runescape-client/src/main/java/class40.java @@ -1,33 +1,20 @@ -import java.awt.image.BufferedImage; -import java.awt.image.PixelGrabber; -import java.io.ByteArrayInputStream; import java.io.IOException; -import javax.imageio.ImageIO; +import java.net.Socket; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ak") +@ObfuscatedName("ae") public class class40 { - @ObfuscatedName("em") + @ObfuscatedName("a") @ObfuscatedGetter( - intValue = 1914345139 - ) - static int field329; - @ObfuscatedName("ga") - @ObfuscatedGetter( - intValue = -1478059255 - ) - static int field326; - @ObfuscatedName("z") - @ObfuscatedGetter( - intValue = 1827111681 + intValue = -359946727 ) @Export("pixelsPerTile") int pixelsPerTile; - @ObfuscatedName("n") + @ObfuscatedName("t") @Export("tileTemplates") byte[][][] tileTemplates; @@ -35,25 +22,25 @@ public class class40 { this.pixelsPerTile = var1; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(IIIIIIIII)V", - garbageValue = "-1205626261" + garbageValue = "519041522" ) - void method751(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { + void method798(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { if (var7 != 0 && this.pixelsPerTile != 0 && this.tileTemplates != null) { - var8 = this.method752(var8, var7); - var7 = this.method753(var7); + var8 = this.method799(var8, var7); + var7 = this.method838(var7); Rasterizer2D.Rasterizer2D_drawGradientPixels(var1, var2, var5, var6, var3, var4, this.tileTemplates[var7 - 1][var8], this.pixelsPerTile); } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(IIB)I", - garbageValue = "-28" + signature = "(III)I", + garbageValue = "869171029" ) - int method752(int var1, int var2) { + int method799(int var1, int var2) { if (var2 == 9) { var1 = var1 + 1 & 3; } @@ -69,12 +56,12 @@ public class class40 { return var1; } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( - signature = "(IB)I", - garbageValue = "-61" + signature = "(II)I", + garbageValue = "2011840456" ) - int method753(int var1) { + int method838(int var1) { if (var1 != 9 && var1 != 10) { return var1 == 11 ? 8 : var1; } else { @@ -82,10 +69,10 @@ public class class40 { } } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(S)V", - garbageValue = "-1981" + signature = "(I)V", + garbageValue = "-73707874" ) @Export("init") void init() { @@ -102,10 +89,10 @@ public class class40 { } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "27" + signature = "(I)V", + garbageValue = "-413581425" ) @Export("init0") void init0() { @@ -169,10 +156,10 @@ public class class40 { this.tileTemplates[0][3] = var1; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1748591927" + garbageValue = "2134890825" ) @Export("init1") void init1() { @@ -240,10 +227,10 @@ public class class40 { this.tileTemplates[1][3] = var1; } - @ObfuscatedName("q") + @ObfuscatedName("c") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-997969960" + garbageValue = "1327235203" ) @Export("init2") void init2() { @@ -307,10 +294,10 @@ public class class40 { this.tileTemplates[2][3] = var1; } - @ObfuscatedName("m") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "26" + signature = "(I)V", + garbageValue = "-1955000342" ) @Export("init3") void init3() { @@ -374,10 +361,10 @@ public class class40 { this.tileTemplates[3][3] = var1; } - @ObfuscatedName("y") + @ObfuscatedName("i") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "2142999758" + signature = "(B)V", + garbageValue = "1" ) @Export("init4") void init4() { @@ -441,10 +428,10 @@ public class class40 { this.tileTemplates[4][3] = var1; } - @ObfuscatedName("i") + @ObfuscatedName("d") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "582087203" + garbageValue = "-1524084830" ) @Export("init5") void init5() { @@ -510,10 +497,10 @@ public class class40 { this.tileTemplates[5][3] = var1; } - @ObfuscatedName("c") + @ObfuscatedName("m") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-920906914" + garbageValue = "792481241" ) @Export("init6") void init6() { @@ -579,10 +566,10 @@ public class class40 { this.tileTemplates[6][3] = var1; } - @ObfuscatedName("b") + @ObfuscatedName("p") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "-1722985499" + garbageValue = "401274730" ) @Export("init7") void init7() { @@ -648,219 +635,384 @@ public class class40 { this.tileTemplates[7][3] = var1; } - @ObfuscatedName("z") + @ObfuscatedName("al") @ObfuscatedSignature( - signature = "([BB)Llf;", - garbageValue = "14" + signature = "(Ljava/net/Socket;III)Lku;", + garbageValue = "477889440" ) - @Export("convertJpgToSprite") - public static final Sprite convertJpgToSprite(byte[] var0) { - BufferedImage var1 = null; - - try { - var1 = ImageIO.read(new ByteArrayInputStream(var0)); - int var2 = var1.getWidth(); - int var3 = var1.getHeight(); - int[] var4 = new int[var2 * var3]; - PixelGrabber var5 = new PixelGrabber(var1, 0, 0, var2, var3, var4, 0, var2); - var5.grabPixels(); - return new Sprite(var4, var2, var3); - } catch (IOException var7) { - } catch (InterruptedException var8) { - } - - return new Sprite(0, 0); + public static AbstractSocket method839(Socket var0, int var1, int var2) throws IOException { + return new BufferedNetSocket(var0, var1, var2); } - @ObfuscatedName("u") + @ObfuscatedName("ap") @ObfuscatedSignature( - signature = "([BIIII[Lfa;I)V", - garbageValue = "1638905500" + signature = "(ILcj;ZB)I", + garbageValue = "-72" ) - static final void method787(byte[] var0, int var1, int var2, int var3, int var4, CollisionMap[] var5) { - int var7; - int var8; - for (int var6 = 0; var6 < 4; ++var6) { - for (var7 = 0; var7 < 64; ++var7) { - for (var8 = 0; var8 < 64; ++var8) { - if (var7 + var1 > 0 && var7 + var1 < 103 && var8 + var2 > 0 && var8 + var2 < 103) { - int[] var10000 = var5[var6].flags[var7 + var1]; - var10000[var2 + var8] &= -16777217; - } - } + static int method837(int var0, Script var1, boolean var2) { + if (var0 == ScriptOpcodes.CHAT_GETFILTER_PUBLIC) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.publicChatMode; + return 1; + } else if (var0 == ScriptOpcodes.CHAT_SETFILTER) { + Interpreter.Interpreter_intStackSize -= 3; + Client.publicChatMode = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + class3.privateChatMode = NPCDefinition.method4881(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + if (class3.privateChatMode == null) { + class3.privateChatMode = PrivateChatMode.field3779; } - } - Buffer var10 = new Buffer(var0); - - for (var7 = 0; var7 < 4; ++var7) { - for (var8 = 0; var8 < 64; ++var8) { - for (int var9 = 0; var9 < 64; ++var9) { - GrandExchangeOfferWorldComparator.loadTerrain(var10, var7, var8 + var1, var9 + var2, var3, var4, 0); - } - } - } - - } - - @ObfuscatedName("m") - @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "123699852" - ) - static int method797(int var0, Script var1, boolean var2) { - boolean var3 = true; - Widget var4; - if (var0 >= 2000) { - var0 -= 1000; - var4 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - var3 = false; + Client.tradeChatMode = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + PacketBufferNode var18 = SoundSystem.getPacketBufferNode(ClientPacket.field2256, Client.packetWriter.isaacCipher); + var18.packetBuffer.writeByte(Client.publicChatMode); + var18.packetBuffer.writeByte(class3.privateChatMode.field3781); + var18.packetBuffer.writeByte(Client.tradeChatMode); + Client.packetWriter.addNode(var18); + return 1; } else { - var4 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; - } - - int var11; - if (var0 == ScriptOpcodes.CC_SETOP) { - var11 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] - 1; - if (var11 >= 0 && var11 <= 9) { - var4.setAction(var11, Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]); - return 1; - } else { - --Interpreter.Interpreter_stringStackSize; - return 1; - } - } else { - int var6; - if (var0 == ScriptOpcodes.CC_SETDRAGGABLE) { + String var3; + int var4; + if (var0 == ScriptOpcodes.CHAT_SENDABUSEREPORT) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; Interpreter.Interpreter_intStackSize -= 2; - var11 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var4.parent = GrandExchangeOfferWorldComparator.getWidgetChild(var11, var6); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETDRAGGABLEBEHAVIOR) { - var4.isScrollBar = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETDRAGDEADZONE) { - var4.dragZoneSize = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETDRAGDEADTIME) { - var4.dragThreshold = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETOPBASE) { - var4.dataText = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTARGETVERB) { - var4.spellActionName = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - return 1; - } else if (var0 == ScriptOpcodes.CC_CLEAROPS) { - var4.actions = null; - return 1; - } else if (var0 == 1308) { - var4.field2687 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + PacketBufferNode var6 = SoundSystem.getPacketBufferNode(ClientPacket.field2204, Client.packetWriter.isaacCipher); + var6.packetBuffer.writeByte(UserComparator6.stringCp1252NullTerminatedByteSize(var3) + 2); + var6.packetBuffer.writeStringCp1252NullTerminated(var3); + var6.packetBuffer.writeByte(var4 - 1); + var6.packetBuffer.writeByte(var5); + Client.packetWriter.addNode(var6); return 1; } else { - int var7; - byte[] var9; - if (var0 != ScriptOpcodes.CC_SETOPKEY) { - byte var5; - if (var0 == ScriptOpcodes.CC_SETOPTKEY) { - Interpreter.Interpreter_intStackSize -= 2; - var5 = 10; - var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]}; - byte[] var10 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]}; - Calendar.Widget_setKey(var4, var5, var9, var10); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETOPKEYRATE) { - Interpreter.Interpreter_intStackSize -= 3; - var11 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] - 1; - var6 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var7 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - if (var11 >= 0 && var11 <= 9) { - LoginScreenAnimation.Widget_setKeyRate(var4, var11, var6, var7); - return 1; - } else { - throw new RuntimeException(); + int var10; + if (var0 == ScriptOpcodes.CHAT_GETHISTORY_BYTYPEANDLINE) { + Interpreter.Interpreter_intStackSize -= 2; + var10 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Message var15 = WallDecoration.Messages_getByChannelAndID(var10, var4); + if (var15 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.count; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.cycle; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var15.sender != null ? var15.sender : ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var15.prefix != null ? var15.prefix : ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var15.text != null ? var15.text : ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.isFromFriend() ? 1 : (var15.isFromIgnored() ? 2 : 0); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CHAT_GETHISTORY_BYUID) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Message var16 = WorldMapIcon_1.Messages_getMessage(var10); + if (var16 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var16.type; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var16.cycle; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var16.sender != null ? var16.sender : ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var16.prefix != null ? var16.prefix : ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var16.text != null ? var16.text : ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var16.isFromFriend() ? 1 : (var16.isFromIgnored() ? 2 : 0); + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else if (var0 == ScriptOpcodes.CHAT_GETFILTER_PRIVATE) { + if (class3.privateChatMode == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class3.privateChatMode.field3781; + } + + return 1; + } else if (var0 == ScriptOpcodes.CHAT_SENDPUBLIC) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + String var14 = var3.toLowerCase(); + byte var17 = 0; + if (var14.startsWith("yellow:")) { + var17 = 0; + var3 = var3.substring("yellow:".length()); + } else if (var14.startsWith("red:")) { + var17 = 1; + var3 = var3.substring("red:".length()); + } else if (var14.startsWith("green:")) { + var17 = 2; + var3 = var3.substring("green:".length()); + } else if (var14.startsWith("cyan:")) { + var17 = 3; + var3 = var3.substring("cyan:".length()); + } else if (var14.startsWith("purple:")) { + var17 = 4; + var3 = var3.substring("purple:".length()); + } else if (var14.startsWith("white:")) { + var17 = 5; + var3 = var3.substring("white:".length()); + } else if (var14.startsWith("flash1:")) { + var17 = 6; + var3 = var3.substring("flash1:".length()); + } else if (var14.startsWith("flash2:")) { + var17 = 7; + var3 = var3.substring("flash2:".length()); + } else if (var14.startsWith("flash3:")) { + var17 = 8; + var3 = var3.substring("flash3:".length()); + } else if (var14.startsWith("glow1:")) { + var17 = 9; + var3 = var3.substring("glow1:".length()); + } else if (var14.startsWith("glow2:")) { + var17 = 10; + var3 = var3.substring("glow2:".length()); + } else if (var14.startsWith("glow3:")) { + var17 = 11; + var3 = var3.substring("glow3:".length()); + } else if (WorldMapSection1.clientLanguage != Language.Language_EN) { + if (var14.startsWith("yellow:")) { + var17 = 0; + var3 = var3.substring("yellow:".length()); + } else if (var14.startsWith("red:")) { + var17 = 1; + var3 = var3.substring("red:".length()); + } else if (var14.startsWith("green:")) { + var17 = 2; + var3 = var3.substring("green:".length()); + } else if (var14.startsWith("cyan:")) { + var17 = 3; + var3 = var3.substring("cyan:".length()); + } else if (var14.startsWith("purple:")) { + var17 = 4; + var3 = var3.substring("purple:".length()); + } else if (var14.startsWith("white:")) { + var17 = 5; + var3 = var3.substring("white:".length()); + } else if (var14.startsWith("flash1:")) { + var17 = 6; + var3 = var3.substring("flash1:".length()); + } else if (var14.startsWith("flash2:")) { + var17 = 7; + var3 = var3.substring("flash2:".length()); + } else if (var14.startsWith("flash3:")) { + var17 = 8; + var3 = var3.substring("flash3:".length()); + } else if (var14.startsWith("glow1:")) { + var17 = 9; + var3 = var3.substring("glow1:".length()); + } else if (var14.startsWith("glow2:")) { + var17 = 10; + var3 = var3.substring("glow2:".length()); + } else if (var14.startsWith("glow3:")) { + var17 = 11; + var3 = var3.substring("glow3:".length()); } - } else if (var0 == ScriptOpcodes.CC_SETOPTKEYRATE) { - var5 = 10; - var6 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - LoginScreenAnimation.Widget_setKeyRate(var4, var5, var6, var7); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETOPKEYIGNOREHELD) { - --Interpreter.Interpreter_intStackSize; - var11 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize] - 1; - if (var11 >= 0 && var11 <= 9) { - class13.Widget_setKeyIgnoreHeld(var4, var11); - return 1; - } else { - throw new RuntimeException(); + } + + var14 = var3.toLowerCase(); + byte var7 = 0; + if (var14.startsWith("wave:")) { + var7 = 1; + var3 = var3.substring("wave:".length()); + } else if (var14.startsWith("wave2:")) { + var7 = 2; + var3 = var3.substring("wave2:".length()); + } else if (var14.startsWith("shake:")) { + var7 = 3; + var3 = var3.substring("shake:".length()); + } else if (var14.startsWith("scroll:")) { + var7 = 4; + var3 = var3.substring("scroll:".length()); + } else if (var14.startsWith("slide:")) { + var7 = 5; + var3 = var3.substring("slide:".length()); + } else if (WorldMapSection1.clientLanguage != Language.Language_EN) { + if (var14.startsWith("wave:")) { + var7 = 1; + var3 = var3.substring("wave:".length()); + } else if (var14.startsWith("wave2:")) { + var7 = 2; + var3 = var3.substring("wave2:".length()); + } else if (var14.startsWith("shake:")) { + var7 = 3; + var3 = var3.substring("shake:".length()); + } else if (var14.startsWith("scroll:")) { + var7 = 4; + var3 = var3.substring("scroll:".length()); + } else if (var14.startsWith("slide:")) { + var7 = 5; + var3 = var3.substring("slide:".length()); } - } else if (var0 == ScriptOpcodes.CC_SETOPTKEYIGNOREHELD) { - var5 = 10; - class13.Widget_setKeyIgnoreHeld(var4, var5); + } + + PacketBufferNode var8 = SoundSystem.getPacketBufferNode(ClientPacket.field2182, Client.packetWriter.isaacCipher); + var8.packetBuffer.writeByte(0); + int var9 = var8.packetBuffer.offset; + var8.packetBuffer.writeByte(var4); + var8.packetBuffer.writeByte(var17); + var8.packetBuffer.writeByte(var7); + SecureRandomCallable.method1229(var8.packetBuffer, var3); + var8.packetBuffer.writeLengthByte(var8.packetBuffer.offset - var9); + Client.packetWriter.addNode(var8); + return 1; + } else if (var0 == ScriptOpcodes.CHAT_SENDPRIVATE) { + WorldMapDecoration.Interpreter_stringStackSize -= 2; + var3 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize]; + String var12 = Interpreter.Interpreter_stringStack[WorldMapDecoration.Interpreter_stringStackSize + 1]; + PacketBufferNode var11 = SoundSystem.getPacketBufferNode(ClientPacket.field2207, Client.packetWriter.isaacCipher); + var11.packetBuffer.writeShort(0); + int var13 = var11.packetBuffer.offset; + var11.packetBuffer.writeStringCp1252NullTerminated(var3); + SecureRandomCallable.method1229(var11.packetBuffer, var12); + var11.packetBuffer.writeLengthShort(var11.packetBuffer.offset - var13); + Client.packetWriter.addNode(var11); + return 1; + } else if (var0 != ScriptOpcodes.CHAT_PLAYERNAME) { + if (var0 == ScriptOpcodes.CHAT_GETFILTER_TRADE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = Client.tradeChatMode; + return 1; + } else if (var0 == ScriptOpcodes.CHAT_GETHISTORYLENGTH) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = AttackOption.Messages_getHistorySize(var10); + return 1; + } else if (var0 == ScriptOpcodes.CHAT_GETNEXTUID) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class83.Messages_getNextChatID(var10); + return 1; + } else if (var0 == ScriptOpcodes.CHAT_GETPREVUID) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = class65.Messages_getLastChatID(var10); + return 1; + } else if (var0 == ScriptOpcodes.DOCHEAT) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + MidiPcmStream.doCheat(var3); + return 1; + } else if (var0 == ScriptOpcodes.CHAT_SETMESSAGEFILTER) { + Client.field849 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize].toLowerCase().trim(); + return 1; + } else if (var0 == ScriptOpcodes.CHAT_GETMESSAGEFILTER) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = Client.field849; + return 1; + } else if (var0 == ScriptOpcodes.DEBUGMES) { + var3 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + System.out.println(var3); return 1; } else { return 2; } } else { - byte[] var8 = null; - var9 = null; - if (var3) { - Interpreter.Interpreter_intStackSize -= 10; - - for (var7 = 0; var7 < 10 && Interpreter.Interpreter_intStack[var7 + Interpreter.Interpreter_intStackSize] >= 0; var7 += 2) { - } - - if (var7 > 0) { - var8 = new byte[var7 / 2]; - var9 = new byte[var7 / 2]; - - for (var7 -= 2; var7 >= 0; var7 -= 2) { - var8[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + Interpreter.Interpreter_intStackSize]; - var9[var7 / 2] = (byte)Interpreter.Interpreter_intStack[var7 + Interpreter.Interpreter_intStackSize + 1]; - } - } + if (class215.localPlayer != null && class215.localPlayer.username != null) { + var3 = class215.localPlayer.username.getName(); } else { - Interpreter.Interpreter_intStackSize -= 2; - var8 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]}; - var9 = new byte[]{(byte)Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]}; + var3 = ""; } - var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] - 1; - if (var7 >= 0 && var7 <= 9) { - Calendar.Widget_setKey(var4, var7, var8, var9); - return 1; - } else { - throw new RuntimeException(); - } + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3; + return 1; } } } } - @ObfuscatedName("hc") + @ObfuscatedName("hg") @ObfuscatedSignature( - signature = "(II)Ljava/lang/String;", - garbageValue = "-2143921100" + signature = "(ZB)V", + garbageValue = "-121" ) - static String method799(int var0) { - if (var0 < 0) { - return ""; - } else { - return Client.menuTargets[var0].length() > 0 ? Client.menuActions[var0] + " " + Client.menuTargets[var0] : Client.menuActions[var0]; + @Export("addNpcsToScene") + static final void addNpcsToScene(boolean var0) { + for (int var1 = 0; var1 < Client.npcCount; ++var1) { + NPC var2 = Client.npcs[Client.npcIndices[var1]]; + if (var2 != null && var2.isVisible() && var2.definition.isVisible == var0 && var2.definition.transformIsVisible()) { + int var3 = var2.x >> 7; + int var4 = var2.y >> 7; + if (var3 >= 0 && var3 < 104 && var4 >= 0 && var4 < 104) { + if (var2.field927 == 1 && (var2.x & 127) == 64 && (var2.y & 127) == 64) { + if (Client.tileLastDrawnActor[var3][var4] == Client.viewportDrawCount) { + continue; + } + + Client.tileLastDrawnActor[var3][var4] = Client.viewportDrawCount; + } + + long var5 = class160.calculateTag(0, 0, 1, !var2.definition.isInteractable, Client.npcIndices[var1]); + var2.playerCycle = Client.cycle; + WorldMapArea.scene.drawEntity(Player.Scene_plane, var2.x, var2.y, GraphicsObject.getTileHeight(var2.field927 * 64 - 64 + var2.x, var2.field927 * 64 - 64 + var2.y, Player.Scene_plane), var2.field927 * 64 - 64 + 60, var2, var2.rotation, var5, var2.isWalking); + } + } } + } - @ObfuscatedName("js") + @ObfuscatedName("ia") @ObfuscatedSignature( - signature = "(IIB)V", - garbageValue = "0" + signature = "(Lbj;IIII)V", + garbageValue = "231016448" ) - @Export("runIntfCloseListeners") - static final void runIntfCloseListeners(int var0, int var1) { - if (WorldMapData_0.loadInterface(var0)) { - MouseRecorder.runComponentCloseListeners(UserComparator5.Widget_interfaceComponents[var0], var1); + @Export("addPlayerToMenu") + static final void addPlayerToMenu(Player var0, int var1, int var2, int var3) { + if (class215.localPlayer != var0) { + if (Client.menuOptionsCount < 400) { + String var4; + if (var0.skillLevel == 0) { + var4 = var0.actions[0] + var0.username + var0.actions[1] + GrandExchangeOffer.method159(var0.combatLevel, class215.localPlayer.combatLevel) + " " + " (" + "level-" + var0.combatLevel + ")" + var0.actions[2]; + } else { + var4 = var0.actions[0] + var0.username + var0.actions[1] + " " + " (" + "skill-" + var0.skillLevel + ")" + var0.actions[2]; + } + + int var5; + if (Client.isItemSelected == 1) { + GameObject.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + AbstractArchive.colorStartTag(16777215) + var4, 14, var1, var2, var3); + } else if (Client.isSpellSelected) { + if ((class81.selectedSpellFlags & 8) == 8) { + GameObject.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + AbstractArchive.colorStartTag(16777215) + var4, 15, var1, var2, var3); + } + } else { + for (var5 = 7; var5 >= 0; --var5) { + if (Client.playerMenuActions[var5] != null) { + short var6 = 0; + if (Client.playerMenuActions[var5].equalsIgnoreCase("Attack")) { + if (Client.playerAttackOption == AttackOption.AttackOption_hidden) { + continue; + } + + if (Client.playerAttackOption == AttackOption.AttackOption_alwaysRightClick || AttackOption.AttackOption_dependsOnCombatLevels == Client.playerAttackOption && var0.combatLevel > class215.localPlayer.combatLevel) { + var6 = 2000; + } + + if (class215.localPlayer.team != 0 && var0.team != 0) { + if (var0.team == class215.localPlayer.team) { + var6 = 2000; + } else { + var6 = 0; + } + } + } else if (Client.playerOptionsPriorities[var5]) { + var6 = 2000; + } + + boolean var7 = false; + int var8 = Client.playerMenuOpcodes[var5] + var6; + GameObject.insertMenuItemNoShift(Client.playerMenuActions[var5], AbstractArchive.colorStartTag(16777215) + var4, var8, var1, var2, var3); + } + } + } + + for (var5 = 0; var5 < Client.menuOptionsCount; ++var5) { + if (Client.menuOpcodes[var5] == 23) { + Client.menuTargets[var5] = AbstractArchive.colorStartTag(16777215) + var4; + break; + } + } + + } } } } diff --git a/runescape-client/src/main/java/class42.java b/runescape-client/src/main/java/class42.java index 5fd769eaa7..f344876f2d 100644 --- a/runescape-client/src/main/java/class42.java +++ b/runescape-client/src/main/java/class42.java @@ -1,369 +1,335 @@ +import java.util.Iterator; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("am") +@ObfuscatedName("ah") public class class42 implements WorldMapSection { - @ObfuscatedName("o") - @ObfuscatedSignature( - signature = "Llp;" - ) - @Export("options_buttons_2Sprite") - static IndexedSprite options_buttons_2Sprite; - @ObfuscatedName("ak") - @ObfuscatedSignature( - signature = "Llm;" - ) - @Export("rasterProvider") - public static AbstractRasterProvider rasterProvider; - @ObfuscatedName("z") + @ObfuscatedName("ql") @ObfuscatedGetter( - intValue = -1607509985 + intValue = -1572028416 ) - int field337; + static int field360; + @ObfuscatedName("gc") + @ObfuscatedSignature( + signature = "[Llx;" + ) + @Export("mapDotSprites") + static Sprite[] mapDotSprites; + @ObfuscatedName("a") + @ObfuscatedGetter( + intValue = 1414528917 + ) + int field358; + @ObfuscatedName("t") + @ObfuscatedGetter( + intValue = -1336936449 + ) + int field349; @ObfuscatedName("n") @ObfuscatedGetter( - intValue = 1391505979 - ) - int field338; - @ObfuscatedName("v") - @ObfuscatedGetter( - intValue = 558153755 - ) - int field339; - @ObfuscatedName("u") - @ObfuscatedGetter( - intValue = -246228093 - ) - int field342; - @ObfuscatedName("r") - @ObfuscatedGetter( - intValue = -1950186217 - ) - int field341; - @ObfuscatedName("p") - @ObfuscatedGetter( - intValue = -766889275 + intValue = 1265839335 ) int field351; @ObfuscatedName("q") @ObfuscatedGetter( - intValue = 1083558581 + intValue = 1444724099 ) - int field343; - @ObfuscatedName("m") + int field357; + @ObfuscatedName("v") @ObfuscatedGetter( - intValue = 1036531637 + intValue = -1979837671 ) - int field344; - @ObfuscatedName("y") + int field353; + @ObfuscatedName("l") @ObfuscatedGetter( - intValue = 796855403 + intValue = -1964329659 ) - int field345; + int field354; + @ObfuscatedName("c") + @ObfuscatedGetter( + intValue = -837058271 + ) + int field355; + @ObfuscatedName("o") + @ObfuscatedGetter( + intValue = -882784751 + ) + int field350; @ObfuscatedName("i") @ObfuscatedGetter( - intValue = 301384915 + intValue = -1697600129 ) - int field340; + int field359; + @ObfuscatedName("d") + @ObfuscatedGetter( + intValue = 309221771 + ) + int field352; class42() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(Lac;I)V", - garbageValue = "2098672163" + signature = "(Laa;B)V", + garbageValue = "-111" ) @Export("expandBounds") public void expandBounds(WorldMapArea var1) { - if (var1.regionLowX > this.field341) { - var1.regionLowX = this.field341; + if (var1.regionLowX > this.field353) { + var1.regionLowX = this.field353; } - if (var1.regionHighX < this.field341) { - var1.regionHighX = this.field341; + if (var1.regionHighX < this.field353) { + var1.regionHighX = this.field353; } - if (var1.regionLowY > this.field351) { - var1.regionLowY = this.field351; + if (var1.regionLowY > this.field354) { + var1.regionLowY = this.field354; } - if (var1.regionHighY < this.field351) { - var1.regionHighY = this.field351; + if (var1.regionHighY < this.field354) { + var1.regionHighY = this.field354; } } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( signature = "(IIII)Z", - garbageValue = "-327883108" + garbageValue = "-1417818612" ) @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { - if (var1 >= this.field337 && var1 < this.field338 + this.field337) { - return var2 >= (this.field339 << 6) + (this.field343 << 3) && var2 <= (this.field339 << 6) + (this.field343 << 3) + 7 && var3 >= (this.field342 << 6) + (this.field344 << 3) && var3 <= (this.field342 << 6) + (this.field344 << 3) + 7; + if (var1 >= this.field358 && var1 < this.field358 + this.field349) { + return var2 >= (this.field351 << 6) + (this.field355 << 3) && var2 <= (this.field351 << 6) + (this.field355 << 3) + 7 && var3 >= (this.field357 << 6) + (this.field350 << 3) && var3 <= (this.field357 << 6) + (this.field350 << 3) + 7; } else { return false; } } - @ObfuscatedName("v") + @ObfuscatedName("n") @ObfuscatedSignature( signature = "(III)Z", - garbageValue = "-1535371561" + garbageValue = "-2132898041" ) @Export("containsPosition") public boolean containsPosition(int var1, int var2) { - return var1 >= (this.field341 << 6) + (this.field345 << 3) && var1 <= (this.field341 << 6) + (this.field345 << 3) + 7 && var2 >= (this.field351 << 6) + (this.field340 << 3) && var2 <= (this.field351 << 6) + (this.field340 << 3) + 7; + return var1 >= (this.field353 << 6) + (this.field359 << 3) && var1 <= (this.field353 << 6) + (this.field359 << 3) + 7 && var2 >= (this.field354 << 6) + (this.field352 << 3) && var2 <= (this.field354 << 6) + (this.field352 << 3) + 7; } - @ObfuscatedName("u") + @ObfuscatedName("q") @ObfuscatedSignature( signature = "(IIII)[I", - garbageValue = "-1322751923" + garbageValue = "1209167521" ) @Export("getBorderTileLengths") public int[] getBorderTileLengths(int var1, int var2, int var3) { if (!this.containsCoord(var1, var2, var3)) { return null; } else { - int[] var4 = new int[]{this.field341 * 64 - this.field339 * 64 + var2 + (this.field345 * 8 - this.field343 * 8), var3 + (this.field351 * 64 - this.field342 * 64) + (this.field340 * 8 - this.field344 * 8)}; + int[] var4 = new int[]{this.field353 * 64 - this.field351 * 64 + var2 + (this.field359 * 8 - this.field355 * 8), var3 + (this.field354 * 64 - this.field357 * 64) + (this.field352 * 8 - this.field350 * 8)}; return var4; } } - @ObfuscatedName("r") + @ObfuscatedName("v") @ObfuscatedSignature( - signature = "(III)Lhb;", - garbageValue = "1439979703" + signature = "(IIS)Lhf;", + garbageValue = "7283" ) @Export("coord") public Coord coord(int var1, int var2) { if (!this.containsPosition(var1, var2)) { return null; } else { - int var3 = this.field339 * 64 - this.field341 * 64 + (this.field343 * 8 - this.field345 * 8) + var1; - int var4 = this.field342 * 64 - this.field351 * 64 + var2 + (this.field344 * 8 - this.field340 * 8); - return new Coord(this.field337, var3, var4); + int var3 = this.field351 * 64 - this.field353 * 64 + (this.field355 * 8 - this.field359 * 8) + var1; + int var4 = this.field357 * 64 - this.field354 * 64 + var2 + (this.field350 * 8 - this.field352 * 8); + return new Coord(this.field358, var3, var4); } } + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(Lkc;I)V", + garbageValue = "-568369534" + ) + @Export("read") + public void read(Buffer var1) { + this.field358 = var1.readUnsignedByte(); + this.field349 = var1.readUnsignedByte(); + this.field351 = var1.readUnsignedShort(); + this.field355 = var1.readUnsignedByte(); + this.field357 = var1.readUnsignedShort(); + this.field350 = var1.readUnsignedByte(); + this.field353 = var1.readUnsignedShort(); + this.field359 = var1.readUnsignedByte(); + this.field354 = var1.readUnsignedShort(); + this.field352 = var1.readUnsignedByte(); + this.method852(); + } + + @ObfuscatedName("c") + @ObfuscatedSignature( + signature = "(B)V", + garbageValue = "108" + ) + void method852() { + } + + @ObfuscatedName("i") + @ObfuscatedSignature( + signature = "(IIII)I", + garbageValue = "-1518213603" + ) + static final int method856(int var0, int var1, int var2) { + int var3 = var0 / var2; + int var4 = var0 & var2 - 1; + int var5 = var1 / var2; + int var6 = var1 & var2 - 1; + int var7 = RouteStrategy.method3736(var3, var5); + int var8 = RouteStrategy.method3736(var3 + 1, var5); + int var9 = RouteStrategy.method3736(var3, var5 + 1); + int var10 = RouteStrategy.method3736(var3 + 1, var5 + 1); + int var12 = 65536 - Rasterizer3D.Rasterizer3D_cosine[var4 * 1024 / var2] >> 1; + int var11 = ((65536 - var12) * var7 >> 16) + (var8 * var12 >> 16); + int var13 = GrandExchangeOfferAgeComparator.method195(var9, var10, var4, var2); + int var15 = 65536 - Rasterizer3D.Rasterizer3D_cosine[var6 * 1024 / var2] >> 1; + int var14 = ((65536 - var15) * var11 >> 16) + (var13 * var15 >> 16); + return var14; + } + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "(Lkl;B)V", - garbageValue = "-99" + signature = "(ILcj;ZI)I", + garbageValue = "-1035175611" ) - @Export("read") - public void read(Buffer var1) { - this.field337 = var1.readUnsignedByte(); - this.field338 = var1.readUnsignedByte(); - this.field339 = var1.readUnsignedShort(); - this.field343 = var1.readUnsignedByte(); - this.field342 = var1.readUnsignedShort(); - this.field344 = var1.readUnsignedByte(); - this.field341 = var1.readUnsignedShort(); - this.field345 = var1.readUnsignedByte(); - this.field351 = var1.readUnsignedShort(); - this.field340 = var1.readUnsignedByte(); - this.method810(); + static int method873(int var0, Script var1, boolean var2) { + Widget var3; + if (var0 >= 2000) { + var0 -= 1000; + var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + } else { + var3 = var2 ? class96.field1301 : ReflectionCheck.field1310; + } + + String var4 = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + int[] var5 = null; + if (var4.length() > 0 && var4.charAt(var4.length() - 1) == 'Y') { + int var6 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var6 > 0) { + for (var5 = new int[var6]; var6-- > 0; var5[var6] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]) { + } + } + + var4 = var4.substring(0, var4.length() - 1); + } + + Object[] var8 = new Object[var4.length() + 1]; + + int var7; + for (var7 = var8.length - 1; var7 >= 1; --var7) { + if (var4.charAt(var7 - 1) == 's') { + var8[var7] = Interpreter.Interpreter_stringStack[--WorldMapDecoration.Interpreter_stringStackSize]; + } else { + var8[var7] = new Integer(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + } + } + + var7 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + if (var7 != -1) { + var8[0] = new Integer(var7); + } else { + var8 = null; + } + + if (var0 == ScriptOpcodes.CC_SETONCLICK) { + var3.onClick = var8; + } else if (var0 == ScriptOpcodes.CC_SETONHOLD) { + var3.onHold = var8; + } else if (var0 == ScriptOpcodes.CC_SETONRELEASE) { + var3.onRelease = var8; + } else if (var0 == ScriptOpcodes.CC_SETONMOUSEOVER) { + var3.onMouseOver = var8; + } else if (var0 == ScriptOpcodes.CC_SETONMOUSELEAVE) { + var3.onMouseLeave = var8; + } else if (var0 == ScriptOpcodes.CC_SETONDRAG) { + var3.onDrag = var8; + } else if (var0 == ScriptOpcodes.CC_SETONTARGETLEAVE) { + var3.onTargetLeave = var8; + } else if (var0 == ScriptOpcodes.CC_SETONVARTRANSMIT) { + var3.onVarTransmit = var8; + var3.varTransmitTriggers = var5; + } else if (var0 == ScriptOpcodes.CC_SETONTIMER) { + var3.onTimer = var8; + } else if (var0 == ScriptOpcodes.CC_SETONOP) { + var3.onOp = var8; + } else if (var0 == ScriptOpcodes.CC_SETONDRAGCOMPLETE) { + var3.onDragComplete = var8; + } else if (var0 == ScriptOpcodes.CC_SETONCLICKREPEAT) { + var3.onClickRepeat = var8; + } else if (var0 == ScriptOpcodes.CC_SETONMOUSEREPEAT) { + var3.onMouseRepeat = var8; + } else if (var0 == ScriptOpcodes.CC_SETONINVTRANSMIT) { + var3.onInvTransmit = var8; + var3.invTransmitTriggers = var5; + } else if (var0 == ScriptOpcodes.CC_SETONSTATTRANSMIT) { + var3.onStatTransmit = var8; + var3.statTransmitTriggers = var5; + } else if (var0 == ScriptOpcodes.CC_SETONTARGETENTER) { + var3.onTargetEnter = var8; + } else if (var0 == ScriptOpcodes.CC_SETONSCROLLWHEEL) { + var3.onScroll = var8; + } else if (var0 == ScriptOpcodes.CC_SETONCHATTRANSMIT) { + var3.onChatTransmit = var8; + } else if (var0 == ScriptOpcodes.CC_SETONKEY) { + var3.onKey = var8; + } else if (var0 == ScriptOpcodes.CC_SETONFRIENDTRANSMIT) { + var3.onFriendTransmit = var8; + } else if (var0 == ScriptOpcodes.CC_SETONCLANTRANSMIT) { + var3.onClanTransmit = var8; + } else if (var0 == ScriptOpcodes.CC_SETONMISCTRANSMIT) { + var3.onMiscTransmit = var8; + } else if (var0 == ScriptOpcodes.CC_SETONDIALOGABORT) { + var3.onDialogAbort = var8; + } else if (var0 == ScriptOpcodes.CC_SETONSUBCHANGE) { + var3.onSubChange = var8; + } else if (var0 == ScriptOpcodes.CC_SETONSTOCKTRANSMIT) { + var3.onStockTransmit = var8; + } else if (var0 == 1426) { + var3.field2665 = var8; + } else { + if (var0 != ScriptOpcodes.CC_SETONRESIZE) { + return 2; + } + + var3.onResize = var8; + } + + var3.hasListener = true; + return 1; } - @ObfuscatedName("q") + @ObfuscatedName("kl") @ObfuscatedSignature( signature = "(I)V", - garbageValue = "1301595386" + garbageValue = "1911467364" ) - void method810() { - } + @Export("FriendSystem_invalidateIgnoreds") + static final void FriendSystem_invalidateIgnoreds() { + Iterator var0 = Messages.Messages_hashTable.iterator(); - @ObfuscatedName("n") - @ObfuscatedSignature( - signature = "(IIII)Lcu;", - garbageValue = "-994648590" - ) - @Export("getWorldMapScript") - static Script getWorldMapScript(int var0, int var1, int var2) { - int var3 = (var1 << 8) + var0; - Script var5 = WorldMapSection1.method591(var3, var0); - if (var5 != null) { - return var5; - } else { - int var6 = (var2 + 40000 << 8) + var0; - var5 = WorldMapSection1.method591(var6, var0); - return var5 != null ? var5 : null; - } - } - - @ObfuscatedName("gp") - @ObfuscatedSignature( - signature = "(IIIIIB)V", - garbageValue = "127" - ) - @Export("drawObject") - static final void drawObject(int var0, int var1, int var2, int var3, int var4) { - long var5 = PacketWriter.scene.getBoundaryObjectTag(var0, var1, var2); - int var7; - int var8; - int var9; - int var10; - int var12; - int var13; - if (var5 != 0L) { - var7 = PacketWriter.scene.getObjectFlags(var0, var1, var2, var5); - var8 = var7 >> 6 & 3; - var9 = var7 & 31; - var10 = var3; - if (Language.method3635(var5)) { - var10 = var4; - } - - int[] var11 = ObjectSound.sceneMinimapSprite.pixels; - var12 = var1 * 4 + (103 - var2) * 2048 + 24624; - var13 = class81.Entity_unpackID(var5); - ObjectDefinition var14 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var13); - if (var14.mapSceneId != -1) { - IndexedSprite var15 = class14.mapSceneSprites[var14.mapSceneId]; - if (var15 != null) { - int var16 = (var14.sizeX * 4 - var15.subWidth) / 2; - int var17 = (var14.sizeY * 4 - var15.subHeight) / 2; - var15.drawAt(var1 * 4 + var16 + 48, var17 + (104 - var2 - var14.sizeY) * 4 + 48); - } - } else { - if (var9 == 0 || var9 == 2) { - if (var8 == 0) { - var11[var12] = var10; - var11[var12 + 512] = var10; - var11[var12 + 1024] = var10; - var11[var12 + 1536] = var10; - } else if (var8 == 1) { - var11[var12] = var10; - var11[var12 + 1] = var10; - var11[var12 + 2] = var10; - var11[var12 + 3] = var10; - } else if (var8 == 2) { - var11[var12 + 3] = var10; - var11[var12 + 512 + 3] = var10; - var11[var12 + 1024 + 3] = var10; - var11[var12 + 1536 + 3] = var10; - } else if (var8 == 3) { - var11[var12 + 1536] = var10; - var11[var12 + 1536 + 1] = var10; - var11[var12 + 1536 + 2] = var10; - var11[var12 + 1536 + 3] = var10; - } - } - - if (var9 == 3) { - if (var8 == 0) { - var11[var12] = var10; - } else if (var8 == 1) { - var11[var12 + 3] = var10; - } else if (var8 == 2) { - var11[var12 + 1536 + 3] = var10; - } else if (var8 == 3) { - var11[var12 + 1536] = var10; - } - } - - if (var9 == 2) { - if (var8 == 3) { - var11[var12] = var10; - var11[var12 + 512] = var10; - var11[var12 + 1024] = var10; - var11[var12 + 1536] = var10; - } else if (var8 == 0) { - var11[var12] = var10; - var11[var12 + 1] = var10; - var11[var12 + 2] = var10; - var11[var12 + 3] = var10; - } else if (var8 == 1) { - var11[var12 + 3] = var10; - var11[var12 + 512 + 3] = var10; - var11[var12 + 1024 + 3] = var10; - var11[var12 + 1536 + 3] = var10; - } else if (var8 == 2) { - var11[var12 + 1536] = var10; - var11[var12 + 1536 + 1] = var10; - var11[var12 + 1536 + 2] = var10; - var11[var12 + 1536 + 3] = var10; - } - } - } + while (var0.hasNext()) { + Message var1 = (Message)var0.next(); + var1.clearIsFromIgnored(); } - var5 = PacketWriter.scene.getGameObjectTag(var0, var1, var2); - if (var5 != 0L) { - var7 = PacketWriter.scene.getObjectFlags(var0, var1, var2, var5); - var8 = var7 >> 6 & 3; - var9 = var7 & 31; - var10 = class81.Entity_unpackID(var5); - ObjectDefinition var24 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var10); - int var19; - if (var24.mapSceneId != -1) { - IndexedSprite var18 = class14.mapSceneSprites[var24.mapSceneId]; - if (var18 != null) { - var13 = (var24.sizeX * 4 - var18.subWidth) / 2; - var19 = (var24.sizeY * 4 - var18.subHeight) / 2; - var18.drawAt(var1 * 4 + var13 + 48, var19 + (104 - var2 - var24.sizeY) * 4 + 48); - } - } else if (var9 == 9) { - var12 = 15658734; - if (Language.method3635(var5)) { - var12 = 15597568; - } - - int[] var23 = ObjectSound.sceneMinimapSprite.pixels; - var19 = var1 * 4 + (103 - var2) * 2048 + 24624; - if (var8 != 0 && var8 != 2) { - var23[var19] = var12; - var23[var19 + 1 + 512] = var12; - var23[var19 + 1024 + 2] = var12; - var23[var19 + 1536 + 3] = var12; - } else { - var23[var19 + 1536] = var12; - var23[var19 + 1 + 1024] = var12; - var23[var19 + 512 + 2] = var12; - var23[var19 + 3] = var12; - } - } + if (class4.clanChat != null) { + class4.clanChat.invalidateIgnoreds(); } - var5 = PacketWriter.scene.getFloorDecorationTag(var0, var1, var2); - if (var5 != 0L) { - var7 = class81.Entity_unpackID(var5); - ObjectDefinition var20 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var7); - if (var20.mapSceneId != -1) { - IndexedSprite var21 = class14.mapSceneSprites[var20.mapSceneId]; - if (var21 != null) { - var10 = (var20.sizeX * 4 - var21.subWidth) / 2; - int var22 = (var20.sizeY * 4 - var21.subHeight) / 2; - var21.drawAt(var1 * 4 + var10 + 48, (104 - var2 - var20.sizeY) * 4 + var22 + 48); - } - } - } - - } - - @ObfuscatedName("iq") - @ObfuscatedSignature( - signature = "(IS)Ljava/lang/String;", - garbageValue = "-6160" - ) - @Export("formatItemStacks") - static final String formatItemStacks(int var0) { - String var1 = Integer.toString(var0); - - for (int var2 = var1.length() - 3; var2 > 0; var2 -= 3) { - var1 = var1.substring(0, var2) + "," + var1.substring(var2); - } - - if (var1.length() > 9) { - return " " + World.colorStartTag(65408) + var1.substring(0, var1.length() - 8) + "M" + " " + " (" + var1 + ")" + ""; - } else { - return var1.length() > 6 ? " " + World.colorStartTag(16777215) + var1.substring(0, var1.length() - 4) + "K" + " " + " (" + var1 + ")" + "" : " " + World.colorStartTag(16776960) + var1 + ""; - } } } diff --git a/runescape-client/src/main/java/class43.java b/runescape-client/src/main/java/class43.java index feec31293d..10eb71b83d 100644 --- a/runescape-client/src/main/java/class43.java +++ b/runescape-client/src/main/java/class43.java @@ -1,82 +1,470 @@ -import java.awt.Component; +import java.net.URL; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("ae") +@ObfuscatedName("an") public final class class43 { - @ObfuscatedName("dq") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "Lky;" + signature = "Lhq;" ) - @Export("js5Socket") - static AbstractSocket js5Socket; - - @ObfuscatedName("z") + @Export("KitDefinition_modelsArchive") + public static AbstractArchive KitDefinition_modelsArchive; + @ObfuscatedName("f") + static String field363; + @ObfuscatedName("fr") @ObfuscatedSignature( - signature = "(Ljava/awt/Component;I)V", - garbageValue = "-416045608" + signature = "Lks;" ) - static void method838(Component var0) { - var0.addMouseListener(MouseHandler.MouseHandler_instance); - var0.addMouseMotionListener(MouseHandler.MouseHandler_instance); - var0.addFocusListener(MouseHandler.MouseHandler_instance); - } + @Export("fontBold12") + static Font fontBold12; - @ObfuscatedName("o") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(II)Ljava/lang/String;", - garbageValue = "1930428495" + signature = "(I)Z", + garbageValue = "2037455287" ) - static final String method839(int var0) { - if (var0 < 100000) { - return "" + var0 + ""; - } else { - return var0 < 10000000 ? "" + var0 / 1000 + "K" + "" : "" + var0 / 1000000 + "M" + ""; - } - } + @Export("loadWorlds") + static boolean loadWorlds() { + try { + if (class96.World_request == null) { + class96.World_request = Skills.urlRequester.request(new URL(class335.field4016)); + } else if (class96.World_request.isDone()) { + byte[] var0 = class96.World_request.getResponse(); + Buffer var1 = new Buffer(var0); + var1.readInt(); + World.World_count = var1.readUnsignedShort(); + Username.World_worlds = new World[World.World_count]; - @ObfuscatedName("jw") - @ObfuscatedSignature( - signature = "(Lho;I)Z", - garbageValue = "-1205677722" - ) - static final boolean method840(Widget var0) { - int var1 = var0.contentType; - if (var1 == 205) { - Client.logoutTimer = 250; - return true; - } else { - int var2; - int var3; - if (var1 >= 300 && var1 <= 313) { - var2 = (var1 - 300) / 2; - var3 = var1 & 1; - Client.playerAppearance.changeAppearance(var2, var3 == 1); - } + World var3; + for (int var2 = 0; var2 < World.World_count; var3.index = var2++) { + var3 = Username.World_worlds[var2] = new World(); + var3.id = var1.readUnsignedShort(); + var3.properties = var1.readInt(); + var3.host = var1.readStringCp1252NullTerminated(); + var3.activity = var1.readStringCp1252NullTerminated(); + var3.location = var1.readUnsignedByte(); + var3.population = var1.readShort(); + } - if (var1 >= 314 && var1 <= 323) { - var2 = (var1 - 314) / 2; - var3 = var1 & 1; - Client.playerAppearance.method3977(var2, var3 == 1); - } - - if (var1 == 324) { - Client.playerAppearance.changeSex(false); - } - - if (var1 == 325) { - Client.playerAppearance.changeSex(true); - } - - if (var1 == 326) { - PacketBufferNode var4 = InterfaceParent.getPacketBufferNode(ClientPacket.field2228, Client.packetWriter.isaacCipher); - Client.playerAppearance.write(var4.packetBuffer); - Client.packetWriter.addNode(var4); + class2.sortWorlds(Username.World_worlds, 0, Username.World_worlds.length - 1, World.World_sortOption1, World.World_sortOption2); + class96.World_request = null; return true; - } else { - return false; + } + } catch (Exception var4) { + var4.printStackTrace(); + class96.World_request = null; + } + + return false; + } + + @ObfuscatedName("t") + static final void method882(long var0) { + try { + Thread.sleep(var0); + } catch (InterruptedException var3) { + } + + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(I)V", + garbageValue = "-2078513733" + ) + public static void method880() { + if (KeyHandler.KeyHandler_instance != null) { + synchronized(KeyHandler.KeyHandler_instance) { + KeyHandler.KeyHandler_instance = null; } } + + } + + @ObfuscatedName("az") + @ObfuscatedSignature( + signature = "(ILcj;ZI)I", + garbageValue = "-2029671704" + ) + static int method877(int var0, Script var1, boolean var2) { + int var3; + if (var0 == 6600) { + var3 = Player.Scene_plane; + int var9 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); + int var5 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); + UserComparator4.getWorldMap().method6437(var3, var9, var5, true); + return 1; + } else { + WorldMapArea var11; + if (var0 == ScriptOpcodes.WORLDMAP_GETMAPNAME) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + String var16 = ""; + var11 = UserComparator4.getWorldMap().getMapArea(var3); + if (var11 != null) { + var16 = var11.getExternalName(); + } + + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var16; + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_SETMAP) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + UserComparator4.getWorldMap().setCurrentMapAreaId(var3); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETZOOM) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().getZoomLevel(); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_SETZOOM) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + UserComparator4.getWorldMap().setZoomPercentage(var3); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_ISLOADED) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().isCacheLoaded() ? 1 : 0; + return 1; + } else { + Coord var15; + if (var0 == ScriptOpcodes.WORLDMAP_JUMPTODISPLAYCOORD) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + UserComparator4.getWorldMap().setWorldMapPositionTarget(var15.x, var15.y); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_JUMPTODISPLAYCOORD_INSTANT) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + UserComparator4.getWorldMap().setWorldMapPositionTargetInstant(var15.x, var15.y); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_JUMPTOSOURCECOORD) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + UserComparator4.getWorldMap().jumpToSourceCoord(var15.plane, var15.x, var15.y); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_JUMPTOSOURCECOORD_INSTANT) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + UserComparator4.getWorldMap().jumpToSourceCoordInstant(var15.plane, var15.x, var15.y); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISPLAYPOSITION) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().getDisplayX(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().getDisplayY(); + return 1; + } else { + WorldMapArea var13; + if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGORIGIN) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var13 = UserComparator4.getWorldMap().getMapArea(var3); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getOrigin().packed(); + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGSIZE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var13 = UserComparator4.getWorldMap().getMapArea(var3); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var13.getRegionHighX() - var13.getRegionLowX() + 1) * 64; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var13.getRegionHighY() - var13.getRegionLowY() + 1) * 64; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGBOUNDS) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var13 = UserComparator4.getWorldMap().getMapArea(var3); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionLowX() * 64; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionLowY() * 64; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionHighX() * 64 + 64 - 1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getRegionHighY() * 64 + 64 - 1; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETCONFIGZOOM) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var13 = UserComparator4.getWorldMap().getMapArea(var3); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getZoom(); + } + + return 1; + } else if (var0 == 6615) { + var15 = UserComparator4.getWorldMap().getDisplayCoord(); + if (var15 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.x; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var15.y; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETCURRENTMAP) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().currentMapAreaId(); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISPLAYCOORD) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + var13 = UserComparator4.getWorldMap().getCurrentMapArea(); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + return 1; + } else { + int[] var14 = var13.position(var15.plane, var15.x, var15.y); + if (var14 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14[0]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var14[1]; + } + + return 1; + } + } else { + Coord var7; + if (var0 == 6618) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + var13 = UserComparator4.getWorldMap().getCurrentMapArea(); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + return 1; + } else { + var7 = var13.coord(var15.x, var15.y); + if (var7 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.packed(); + } + + return 1; + } + } else { + Coord var12; + if (var0 == 6619) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + Language.method3810(var3, var12, false); + return 1; + } else if (var0 == 6620) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + Language.method3810(var3, var12, true); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_COORDINMAP) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + var11 = UserComparator4.getWorldMap().getMapArea(var3); + if (var11 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + return 1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var11.containsCoord(var12.plane, var12.x, var12.y) ? 1 : 0; + return 1; + } + } else if (var0 == ScriptOpcodes.WORLDMAP_GETSIZE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().getDisplayWith(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().getDisplayHeight(); + return 1; + } else if (var0 == 6623) { + var15 = new Coord(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + var13 = UserComparator4.getWorldMap().mapAreaAtCoord(var15.plane, var15.x, var15.y); + if (var13 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var13.getId(); + } + + return 1; + } else if (var0 == 6624) { + UserComparator4.getWorldMap().setMaxFlashCount(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + return 1; + } else if (var0 == 6625) { + UserComparator4.getWorldMap().resetMaxFlashCount(); + return 1; + } else if (var0 == 6626) { + UserComparator4.getWorldMap().setCyclesPerFlash(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + return 1; + } else if (var0 == 6627) { + UserComparator4.getWorldMap().resetCyclesPerFlash(); + return 1; + } else { + boolean var10; + if (var0 == ScriptOpcodes.WORLDMAP_PERPETUALFLASH) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + UserComparator4.getWorldMap().setPerpetualFlash(var10); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_FLASHELEMENT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + UserComparator4.getWorldMap().flashElement(var3); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_FLASHELEMENTCATEGORY) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + UserComparator4.getWorldMap().flashCategory(var3); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_STOPCURRENTFLASHES) { + UserComparator4.getWorldMap().stopCurrentFlashes(); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_DISABLEELEMENTS) { + var10 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; + UserComparator4.getWorldMap().setElementsDisabled(var10); + return 1; + } else { + boolean var4; + if (var0 == ScriptOpcodes.WORLDMAP_DISABLEELEMENT) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; + UserComparator4.getWorldMap().disableElement(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_DISABLEELEMENTCATEGORY) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1] == 1; + UserComparator4.getWorldMap().setCategoryDisabled(var3, var4); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISABLEELEMENTS) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().getElementsDisabled() ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISABLEELEMENT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().isElementDisabled(var3) ? 1 : 0; + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_GETDISABLEELEMENTCATEGORY) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = UserComparator4.getWorldMap().isCategoryDisabled(var3) ? 1 : 0; + return 1; + } else if (var0 == 6638) { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var12 = new Coord(Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]); + var7 = UserComparator4.getWorldMap().method6481(var3, var12); + if (var7 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var7.packed(); + } + + return 1; + } else { + AbstractWorldMapIcon var8; + if (var0 == ScriptOpcodes.WORLDMAP_LISTELEMENT_START) { + var8 = UserComparator4.getWorldMap().iconStart(); + if (var8 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.getElement(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.coord2.packed(); + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_LISTELEMENT_NEXT) { + var8 = UserComparator4.getWorldMap().iconNext(); + if (var8 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.getElement(); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var8.coord2.packed(); + } + + return 1; + } else { + WorldMapElement var6; + if (var0 == ScriptOpcodes.MEC_TEXT) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class65.WorldMapElement_get(var3); + if (var6.name == null) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = ""; + } else { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var6.name; + } + + return 1; + } else if (var0 == ScriptOpcodes.MEC_TEXTSIZE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class65.WorldMapElement_get(var3); + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.textSize; + return 1; + } else if (var0 == ScriptOpcodes.MEC_CATEGORY) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class65.WorldMapElement_get(var3); + if (var6 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.category; + } + + return 1; + } else if (var0 == ScriptOpcodes.MEC_SPRITE) { + var3 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; + var6 = class65.WorldMapElement_get(var3); + if (var6 == null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = -1; + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var6.sprite1; + } + + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_ELEMENT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapSprite.worldMapEvent.mapElement; + return 1; + } else if (var0 == 6698) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapSprite.worldMapEvent.coord1.packed(); + return 1; + } else if (var0 == ScriptOpcodes.WORLDMAP_ELEMENTCOORD) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = WorldMapSprite.worldMapEvent.coord2.packed(); + return 1; + } else { + return 2; + } + } + } + } + } + } + } + } + } + } + } + + @ObfuscatedName("jo") + @ObfuscatedSignature( + signature = "([Lhi;Lhi;ZI)V", + garbageValue = "-1915700559" + ) + @Export("revalidateWidgetScroll") + static void revalidateWidgetScroll(Widget[] var0, Widget var1, boolean var2) { + int var3 = var1.scrollWidth != 0 ? var1.scrollWidth : var1.width; + int var4 = var1.scrollHeight != 0 ? var1.scrollHeight : var1.height; + Message.resizeInterface(var0, var1.id, var3, var4, var2); + if (var1.children != null) { + Message.resizeInterface(var1.children, var1.id, var3, var4, var2); + } + + InterfaceParent var5 = (InterfaceParent)Client.interfaceParents.get((long)var1.id); + if (var5 != null) { + int var6 = var5.group; + if (TextureProvider.loadInterface(var6)) { + Message.resizeInterface(Widget.Widget_interfaceComponents[var6], -1, var3, var4, var2); + } + } + + if (var1.contentType == 1337) { + } + } } diff --git a/runescape-client/src/main/java/class47.java b/runescape-client/src/main/java/class47.java index 2a066a87df..51ab725bbf 100644 --- a/runescape-client/src/main/java/class47.java +++ b/runescape-client/src/main/java/class47.java @@ -3,23 +3,23 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; import netscape.javascript.JSObject; -@ObfuscatedName("aj") +@ObfuscatedName("ao") public class class47 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( signature = "(Ljava/applet/Applet;Ljava/lang/String;I)V", - garbageValue = "-716931956" + garbageValue = "2108629123" ) - public static void method880(Applet var0, String var1) throws Throwable { + public static void method922(Applet var0, String var1) throws Throwable { JSObject.getWindow(var0).eval(var1); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ljava/applet/Applet;Ljava/lang/String;B)Ljava/lang/Object;", - garbageValue = "-1" + signature = "(Ljava/applet/Applet;Ljava/lang/String;I)Ljava/lang/Object;", + garbageValue = "-2095941713" ) - public static Object method881(Applet var0, String var1) throws Throwable { + public static Object method923(Applet var0, String var1) throws Throwable { return JSObject.getWindow(var0).call(var1, (Object[])null); } } diff --git a/runescape-client/src/main/java/class49.java b/runescape-client/src/main/java/class49.java index c4654e1512..88fedf446c 100644 --- a/runescape-client/src/main/java/class49.java +++ b/runescape-client/src/main/java/class49.java @@ -3,56 +3,85 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("au") +@ObfuscatedName("ac") public class class49 { - @ObfuscatedName("u") - @ObfuscatedSignature( - signature = "Lgb;" - ) - @Export("midiPcmStream") - public static MidiPcmStream midiPcmStream; - @ObfuscatedName("m") + @ObfuscatedName("rv") @ObfuscatedGetter( - intValue = -649185671 + intValue = 1570979840 ) - @Export("musicTrackFileId") - public static int musicTrackFileId; + static int field401; + @ObfuscatedName("r") + @ObfuscatedGetter( + intValue = -331085425 + ) + @Export("clientTickTimeIdx") + static int clientTickTimeIdx; + @ObfuscatedName("ev") + @ObfuscatedGetter( + intValue = -2015230611 + ) + static int field399; static { ImageIO.setUseCache(false); } - @ObfuscatedName("u") + @ObfuscatedName("s") @ObfuscatedSignature( - signature = "(IZIZB)V", - garbageValue = "-64" + signature = "(ILcj;ZI)I", + garbageValue = "-17701588" ) - @Export("sortWorldList") - static void sortWorldList(int var0, boolean var1, int var2, boolean var3) { - if (World.World_worlds != null) { - AbstractWorldMapData.doWorldSorting(0, World.World_worlds.length - 1, var0, var1, var2, var3); - } - - } - - @ObfuscatedName("y") - @ObfuscatedSignature( - signature = "([BI)Lkn;", - garbageValue = "-1770627772" - ) - static Font method893(byte[] var0) { - if (var0 == null) { - return null; + static int method938(int var0, Script var1, boolean var2) { + Widget var3 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + if (var0 == ScriptOpcodes.IF_GETSCROLLX) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollX; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETSCROLLY) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollY; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETTEXT) { + Interpreter.Interpreter_stringStack[++WorldMapDecoration.Interpreter_stringStackSize - 1] = var3.text; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETSCROLLWIDTH) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollWidth; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETSCROLLHEIGHT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.scrollHeight; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETMODELZOOM) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelZoom; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETMODELANGLE_X) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleX; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETMODELANGLE_Z) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleZ; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETMODELANGLE_Y) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelAngleY; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETTRANSTOP) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyTop; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETTRANSBOT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.transparencyBot; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETCOLOUR) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETFILLCOLOUR) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.color2; + return 1; + } else if (var0 == ScriptOpcodes.IF_GETFILLMODE) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.fillMode.rsOrdinal(); + return 1; + } else if (var0 == ScriptOpcodes.IF_GETMODELTRANSPARENT) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.modelTransparency ? 1 : 0; + return 1; } else { - Font var1 = new Font(var0, class325.SpriteBuffer_xOffsets, MusicPatchPcmStream.SpriteBuffer_yOffsets, class325.SpriteBuffer_spriteWidths, RunException.SpriteBuffer_spriteHeights, class325.SpriteBuffer_spritePalette, PacketBufferNode.SpriteBuffer_pixels); - class325.SpriteBuffer_xOffsets = null; - MusicPatchPcmStream.SpriteBuffer_yOffsets = null; - class325.SpriteBuffer_spriteWidths = null; - RunException.SpriteBuffer_spriteHeights = null; - class325.SpriteBuffer_spritePalette = null; - PacketBufferNode.SpriteBuffer_pixels = null; - return var1; + return 2; } } } diff --git a/runescape-client/src/main/java/class51.java b/runescape-client/src/main/java/class51.java index aa577584ff..02dc6328b4 100644 --- a/runescape-client/src/main/java/class51.java +++ b/runescape-client/src/main/java/class51.java @@ -1,90 +1,81 @@ import java.applet.Applet; import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("at") +@ObfuscatedName("as") public class class51 { - @ObfuscatedName("z") + @ObfuscatedName("a") @Export("applet") - public static Applet applet; - @ObfuscatedName("n") - public static String field406; - @ObfuscatedName("m") + static Applet applet; + @ObfuscatedName("t") + static String field416; + @ObfuscatedName("p") @ObfuscatedSignature( - signature = "Llf;" + signature = "Llw;" ) - @Export("rightTitleSprite") - static Sprite rightTitleSprite; - @ObfuscatedName("i") + static IndexedSprite field412; + @ObfuscatedName("fv") @ObfuscatedSignature( - signature = "Leh;" + signature = "Lks;" ) - @Export("World_request") - static UrlRequest World_request; - @ObfuscatedName("kc") - @ObfuscatedGetter( - intValue = -1418069311 - ) - @Export("menuY") - static int menuY; + @Export("fontPlain11") + static Font fontPlain11; static { applet = null; - field406 = ""; + field416 = ""; } - @ObfuscatedName("s") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(ILcu;ZI)I", - garbageValue = "-150727859" + signature = "(I)[Lhy;", + garbageValue = "1830105975" ) - static int method921(int var0, Script var1, boolean var2) { - Widget var3 = Canvas.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); - if (var0 == ScriptOpcodes.IF_GETX) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.x; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETY) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.y; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETWIDTH) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.width; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETHEIGHT) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.height; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETHIDE) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.isHidden ? 1 : 0; - return 1; - } else if (var0 == ScriptOpcodes.IF_GETLAYER) { - Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = var3.parentId; - return 1; - } else { - return 2; - } + @Export("PlayerType_values") + public static PlayerType[] PlayerType_values() { + return new PlayerType[]{PlayerType.PlayerType_hardcoreIronman, PlayerType.PlayerType_ultimateIronman, PlayerType.PlayerType_jagexModerator, PlayerType.PlayerType_playerModerator, PlayerType.PlayerType_ironman, PlayerType.PlayerType_normal}; } - @ObfuscatedName("jo") + @ObfuscatedName("o") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-1129572121" + signature = "(I)Llw;", + garbageValue = "2066459689" ) - static final void method922() { - PacketBufferNode var0 = InterfaceParent.getPacketBufferNode(ClientPacket.field2241, Client.packetWriter.isaacCipher); - Client.packetWriter.addNode(var0); + static IndexedSprite method975() { + IndexedSprite var0 = new IndexedSprite(); + var0.width = class325.SpriteBuffer_spriteWidth; + var0.height = class325.SpriteBuffer_spriteHeight; + var0.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[0]; + var0.yOffset = HealthBar.SpriteBuffer_yOffsets[0]; + var0.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[0]; + var0.subHeight = AttackOption.SpriteBuffer_spriteHeights[0]; + var0.palette = class325.SpriteBuffer_spritePalette; + var0.pixels = class325.SpriteBuffer_pixels[0]; + WorldMapData_1.method787(); + return var0; + } - for (InterfaceParent var1 = (InterfaceParent)Client.interfaceParents.first(); var1 != null; var1 = (InterfaceParent)Client.interfaceParents.next()) { - if (var1.type == 0 || var1.type == 3) { - FontName.closeInterface(var1, true); - } - } - - if (Client.meslayerContinueWidget != null) { - WorldMapSectionType.invalidateWidget(Client.meslayerContinueWidget); - Client.meslayerContinueWidget = null; + @ObfuscatedName("ic") + @ObfuscatedSignature( + signature = "(IIIII)V", + garbageValue = "1215512172" + ) + @Export("selectSpell") + static void selectSpell(int var0, int var1, int var2, int var3) { + Widget var4 = ArchiveLoader.getWidgetChild(var0, var1); + if (var4 != null && var4.onTargetEnter != null) { + ScriptEvent var5 = new ScriptEvent(); + var5.widget = var4; + var5.args = var4.onTargetEnter; + GrandExchangeOfferAgeComparator.runScriptEvent(var5); } + Client.field788 = var3; + Client.isSpellSelected = true; + Clock.selectedSpellWidget = var0; + Client.selectedSpellChildIndex = var1; + class81.selectedSpellFlags = var2; + GrandExchangeOfferAgeComparator.invalidateWidget(var4); } } diff --git a/runescape-client/src/main/java/class60.java b/runescape-client/src/main/java/class60.java index d8dc2cb231..22c197467b 100644 --- a/runescape-client/src/main/java/class60.java +++ b/runescape-client/src/main/java/class60.java @@ -2,84 +2,21 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("bc") +@ObfuscatedName("br") public class class60 { - @ObfuscatedName("gg") - @Export("regionLandArchiveIds") - static int[] regionLandArchiveIds; - - @ObfuscatedName("fv") + @ObfuscatedName("bl") @ObfuscatedSignature( - signature = "(I)V", - garbageValue = "-410662040" + signature = "Lln;" ) - static final void method1191() { - if (Client.field643 != WorldMapRectangle.plane) { - Client.field643 = WorldMapRectangle.plane; - int var0 = WorldMapRectangle.plane; - int[] var1 = ObjectSound.sceneMinimapSprite.pixels; - int var2 = var1.length; - - int var3; - for (var3 = 0; var3 < var2; ++var3) { - var1[var3] = 0; - } - - int var4; - int var5; - for (var3 = 1; var3 < 103; ++var3) { - var4 = (103 - var3) * 2048 + 24628; - - for (var5 = 1; var5 < 103; ++var5) { - if ((Tiles.Tiles_renderFlags[var0][var5][var3] & 24) == 0) { - PacketWriter.scene.drawTileMinimap(var1, var4, 512, var0, var5, var3); - } - - if (var0 < 3 && (Tiles.Tiles_renderFlags[var0 + 1][var5][var3] & 8) != 0) { - PacketWriter.scene.drawTileMinimap(var1, var4, 512, var0 + 1, var5, var3); - } - - var4 += 4; - } - } - - var3 = (238 + (int)(Math.random() * 20.0D) - 10 << 16) + (238 + (int)(Math.random() * 20.0D) - 10 << 8) + (238 + (int)(Math.random() * 20.0D) - 10); - var4 = 238 + (int)(Math.random() * 20.0D) - 10 << 16; - ObjectSound.sceneMinimapSprite.setRaster(); - - int var6; - for (var5 = 1; var5 < 103; ++var5) { - for (var6 = 1; var6 < 103; ++var6) { - if ((Tiles.Tiles_renderFlags[var0][var6][var5] & 24) == 0) { - class42.drawObject(var0, var6, var5, var3, var4); - } - - if (var0 < 3 && (Tiles.Tiles_renderFlags[var0 + 1][var6][var5] & 8) != 0) { - class42.drawObject(var0 + 1, var6, var5, var3, var4); - } - } - } - - Client.mapIconCount = 0; - - for (var5 = 0; var5 < 104; ++var5) { - for (var6 = 0; var6 < 104; ++var6) { - long var7 = PacketWriter.scene.getFloorDecorationTag(WorldMapRectangle.plane, var5, var6); - if (0L != var7) { - int var9 = class81.Entity_unpackID(var7); - int var10 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var9).mapIconId; - if (var10 >= 0) { - Client.mapIcons[Client.mapIconCount] = Decimator.WorldMapElement_get(var10).getSpriteBool(false); - Client.mapIconXs[Client.mapIconCount] = var5; - Client.mapIconYs[Client.mapIconCount] = var6; - ++Client.mapIconCount; - } - } - } - } - - class42.rasterProvider.apply(); - } + @Export("loginType") + static LoginType loginType; + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(B)[Lhp;", + garbageValue = "66" + ) + public static StudioGame[] method1260() { + return new StudioGame[]{StudioGame.game5, StudioGame.runescape, StudioGame.game3, StudioGame.game4, StudioGame.oldscape, StudioGame.stellardawn}; } } diff --git a/runescape-client/src/main/java/class65.java b/runescape-client/src/main/java/class65.java index e4c94c1c2a..bc46fae55f 100644 --- a/runescape-client/src/main/java/class65.java +++ b/runescape-client/src/main/java/class65.java @@ -1,54 +1,160 @@ import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; +import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("bu") +@ObfuscatedName("bs") public class class65 extends RouteStrategy { class65() { } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIILfa;B)Z", - garbageValue = "27" + signature = "(IIILfm;B)Z", + garbageValue = "16" ) @Export("hasArrived") protected boolean hasArrived(int var1, int var2, int var3, CollisionMap var4) { return var2 == super.approxDestinationX && var3 == super.approxDestinationY; } - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "(IIIB)I", - garbageValue = "42" + signature = "(II)Lie;", + garbageValue = "-921951444" ) - static int method1245(int var0, int var1, int var2) { - if (var2 > 179) { - var1 /= 2; - } - - if (var2 > 192) { - var1 /= 2; - } - - if (var2 > 217) { - var1 /= 2; - } - - if (var2 > 243) { - var1 /= 2; - } - - int var3 = (var1 / 32 << 7) + (var0 / 4 << 10) + var2 / 2; - return var3; + @Export("WorldMapElement_get") + public static WorldMapElement WorldMapElement_get(int var0) { + return var0 >= 0 && var0 < GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached.length && GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached[var0] != null ? GrandExchangeOfferTotalQuantityComparator.WorldMapElement_cached[var0] : new WorldMapElement(var0); } - @ObfuscatedName("n") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(Lkl;I)Ljava/lang/String;", - garbageValue = "-714921437" + signature = "(ILcj;ZB)I", + garbageValue = "0" ) - public static String method1250(Buffer var0) { - return TilePaint.method3042(var0, 32767); + static int method1321(int var0, Script var1, boolean var2) { + int var3; + int var4; + if (var0 == ScriptOpcodes.CC_CREATE) { + Interpreter.Interpreter_intStackSize -= 3; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + int var5 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; + if (var4 == 0) { + throw new RuntimeException(); + } else { + Widget var6 = PacketBufferNode.getWidget(var3); + if (var6.children == null) { + var6.children = new Widget[var5 + 1]; + } + + if (var6.children.length <= var5) { + Widget[] var7 = new Widget[var5 + 1]; + + for (int var8 = 0; var8 < var6.children.length; ++var8) { + var7[var8] = var6.children[var8]; + } + + var6.children = var7; + } + + if (var5 > 0 && var6.children[var5 - 1] == null) { + throw new RuntimeException("" + (var5 - 1)); + } else { + Widget var12 = new Widget(); + var12.type = var4; + var12.parentId = var12.id = var6.id; + var12.childIndex = var5; + var12.isIf3 = true; + var6.children[var5] = var12; + if (var2) { + class96.field1301 = var12; + } else { + ReflectionCheck.field1310 = var12; + } + + GrandExchangeOfferAgeComparator.invalidateWidget(var6); + return 1; + } + } + } else { + Widget var9; + if (var0 == ScriptOpcodes.CC_DELETE) { + var9 = var2 ? class96.field1301 : ReflectionCheck.field1310; + Widget var10 = PacketBufferNode.getWidget(var9.id); + var10.children[var9.childIndex] = null; + GrandExchangeOfferAgeComparator.invalidateWidget(var10); + return 1; + } else if (var0 == ScriptOpcodes.CC_DELETEALL) { + var9 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + var9.children = null; + GrandExchangeOfferAgeComparator.invalidateWidget(var9); + return 1; + } else if (var0 != ScriptOpcodes.CC_FIND) { + if (var0 == ScriptOpcodes.IF_FIND) { + var9 = PacketBufferNode.getWidget(Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]); + if (var9 != null) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + if (var2) { + class96.field1301 = var9; + } else { + ReflectionCheck.field1310 = var9; + } + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } else { + return 2; + } + } else { + Interpreter.Interpreter_intStackSize -= 2; + var3 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; + var4 = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; + Widget var11 = ArchiveLoader.getWidgetChild(var3, var4); + if (var11 != null && var4 != -1) { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 1; + if (var2) { + class96.field1301 = var11; + } else { + ReflectionCheck.field1310 = var11; + } + } else { + Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = 0; + } + + return 1; + } + } + } + + @ObfuscatedName("l") + @ObfuscatedSignature( + signature = "(II)I", + garbageValue = "732649186" + ) + @Export("Messages_getLastChatID") + static int Messages_getLastChatID(int var0) { + Message var1 = (Message)Messages.Messages_hashTable.get((long)var0); + if (var1 == null) { + return -1; + } else { + return var1.nextDual == Messages.Messages_queue.sentinel ? -1 : ((Message)var1.nextDual).count; + } + } + + @ObfuscatedName("it") + @ObfuscatedSignature( + signature = "(II)Ljava/lang/String;", + garbageValue = "1231454629" + ) + static String method1316(int var0) { + if (var0 < 0) { + return ""; + } else { + return Client.menuTargets[var0].length() > 0 ? Client.menuActions[var0] + " " + Client.menuTargets[var0] : Client.menuActions[var0]; + } } } diff --git a/runescape-client/src/main/java/class80.java b/runescape-client/src/main/java/class80.java index 6434bcf9ec..573e611009 100644 --- a/runescape-client/src/main/java/class80.java +++ b/runescape-client/src/main/java/class80.java @@ -1,19 +1,19 @@ import java.math.BigInteger; import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cv") +@ObfuscatedName("ce") public class class80 { - @ObfuscatedName("rs") - @ObfuscatedGetter( - intValue = 436556705 + @ObfuscatedName("qh") + @ObfuscatedSignature( + signature = "Ldq;" ) - static int field1126; - @ObfuscatedName("r") + @Export("pcmPlayer0") + static PcmPlayer pcmPlayer0; + @ObfuscatedName("v") static final BigInteger field1119; - @ObfuscatedName("p") + @ObfuscatedName("l") static final BigInteger field1120; static { @@ -21,140 +21,304 @@ public class class80 { field1120 = new BigInteger("7237300117305667488707183861728052766358166655052137727439795191253340127955075499635575104901523446809299097934591732635674173519120047404024393881551683"); } - @ObfuscatedName("v") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "([BI)V", - garbageValue = "555042891" + signature = "(I)V", + garbageValue = "-1194202893" ) - @Export("ByteArrayPool_release") - public static synchronized void ByteArrayPool_release(byte[] var0) { - if (var0.length == 100 && ByteArrayPool.ByteArrayPool_smallCount < 1000) { - ByteArrayPool.ByteArrayPool_small[++ByteArrayPool.ByteArrayPool_smallCount - 1] = var0; - } else if (var0.length == 5000 && ByteArrayPool.ByteArrayPool_mediumCount < 250) { - ByteArrayPool.ByteArrayPool_medium[++ByteArrayPool.ByteArrayPool_mediumCount - 1] = var0; - } else if (var0.length == 30000 && ByteArrayPool.ByteArrayPool_largeCount < 50) { - ByteArrayPool.ByteArrayPool_large[++ByteArrayPool.ByteArrayPool_largeCount - 1] = var0; + public static void method2198() { + class96.reflectionChecks = new IterableNodeDeque(); + } + + @ObfuscatedName("t") + @ObfuscatedSignature( + signature = "(CLgw;I)C", + garbageValue = "307690319" + ) + @Export("standardizeChar") + static char standardizeChar(char var0, Language var1) { + if (var0 >= 192 && var0 <= 255) { + if (var0 >= 192 && var0 <= 198) { + return 'A'; + } + + if (var0 == 199) { + return 'C'; + } + + if (var0 >= 200 && var0 <= 203) { + return 'E'; + } + + if (var0 >= 204 && var0 <= 207) { + return 'I'; + } + + if (var0 == 209 && var1 != Language.Language_ES) { + return 'N'; + } + + if (var0 >= 210 && var0 <= 214) { + return 'O'; + } + + if (var0 >= 217 && var0 <= 220) { + return 'U'; + } + + if (var0 == 221) { + return 'Y'; + } + + if (var0 == 223) { + return 's'; + } + + if (var0 >= 224 && var0 <= 230) { + return 'a'; + } + + if (var0 == 231) { + return 'c'; + } + + if (var0 >= 232 && var0 <= 235) { + return 'e'; + } + + if (var0 >= 236 && var0 <= 239) { + return 'i'; + } + + if (var0 == 241 && var1 != Language.Language_ES) { + return 'n'; + } + + if (var0 >= 242 && var0 <= 246) { + return 'o'; + } + + if (var0 >= 249 && var0 <= 252) { + return 'u'; + } + + if (var0 == 253 || var0 == 255) { + return 'y'; + } + } + + if (var0 == 338) { + return 'O'; + } else if (var0 == 339) { + return 'o'; } else { - if (class81.ByteArrayPool_arrays != null) { - for (int var1 = 0; var1 < ByteArrayPool.ByteArrayPool_alternativeSizes.length; ++var1) { - if (var0.length == ByteArrayPool.ByteArrayPool_alternativeSizes[var1] && ByteArrayPool.ByteArrayPool_altSizeArrayCounts[var1] < class81.ByteArrayPool_arrays[var1].length) { - class81.ByteArrayPool_arrays[var1][ByteArrayPool.ByteArrayPool_altSizeArrayCounts[var1]++] = var0; - return; - } - } - } - + return var0 == 376 ? 'Y' : var0; } } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(B)V", - garbageValue = "84" + signature = "(II)V", + garbageValue = "571659543" ) - public static void method2057() { - if (NetCache.NetCache_socket != null) { - NetCache.NetCache_socket.close(); - } - + public static void method2194(int var0) { + class197.field2377 = 1; + class247.musicTrackArchive = null; + class189.musicTrackGroupId = -1; + class197.musicTrackFileId = -1; + class197.field2379 = 0; + ScriptFrame.musicTrackBoolean = false; + class197.field2384 = var0; } - @ObfuscatedName("q") + @ObfuscatedName("jx") @ObfuscatedSignature( - signature = "([BIIIIIIILex;[Lfa;I)V", - garbageValue = "1963296713" + signature = "(Lhi;IIB)V", + garbageValue = "-53" ) - static final void method2051(byte[] var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, Scene var8, CollisionMap[] var9) { - Buffer var10 = new Buffer(var0); - int var11 = -1; + static final void method2197(Widget var0, int var1, int var2) { + if (var0.buttonType == 1) { + GameObject.insertMenuItemNoShift(var0.buttonText, "", 24, 0, 0, var0.id); + } - while (true) { - int var12 = var10.method5457(); - if (var12 == 0) { - return; + String var3; + if (var0.buttonType == 2 && !Client.isSpellSelected) { + var3 = SoundCache.method2666(var0); + if (var3 != null) { + GameObject.insertMenuItemNoShift(var3, AbstractArchive.colorStartTag(65280) + var0.spellName, 25, 0, -1, var0.id); } + } - var11 += var12; - int var13 = 0; + if (var0.buttonType == 3) { + GameObject.insertMenuItemNoShift("Close", "", 26, 0, 0, var0.id); + } - while (true) { - int var14 = var10.readUShortSmart(); - if (var14 == 0) { - break; - } + if (var0.buttonType == 4) { + GameObject.insertMenuItemNoShift(var0.buttonText, "", 28, 0, 0, var0.id); + } - var13 += var14 - 1; - int var15 = var13 & 63; - int var16 = var13 >> 6 & 63; - int var17 = var13 >> 12; - int var18 = var10.readUnsignedByte(); - int var19 = var18 >> 2; - int var20 = var18 & 3; - if (var17 == var4 && var16 >= var5 && var16 < var5 + 8 && var15 >= var6 && var15 < var6 + 8) { - ObjectDefinition var21 = GrandExchangeOfferOwnWorldComparator.getObjectDefinition(var11); - int var24 = var16 & 7; - int var25 = var15 & 7; - int var27 = var21.sizeX; - int var28 = var21.sizeY; - int var29; - if ((var20 & 1) == 1) { - var29 = var27; - var27 = var28; - var28 = var29; + if (var0.buttonType == 5) { + GameObject.insertMenuItemNoShift(var0.buttonText, "", 29, 0, 0, var0.id); + } + + if (var0.buttonType == 6 && Client.meslayerContinueWidget == null) { + GameObject.insertMenuItemNoShift(var0.buttonText, "", 30, 0, -1, var0.id); + } + + int var4; + int var5; + int var19; + if (var0.type == 2) { + var19 = 0; + + for (var4 = 0; var4 < var0.height; ++var4) { + for (var5 = 0; var5 < var0.width; ++var5) { + int var6 = (var0.paddingX + 32) * var5; + int var7 = (var0.paddingY + 32) * var4; + if (var19 < 20) { + var6 += var0.inventoryXOffsets[var19]; + var7 += var0.inventoryYOffsets[var19]; } - int var26 = var7 & 3; - int var23; - if (var26 == 0) { - var23 = var24; - } else if (var26 == 1) { - var23 = var25; - } else if (var26 == 2) { - var23 = 7 - var24 - (var27 - 1); - } else { - var23 = 7 - var25 - (var28 - 1); - } + if (var1 >= var6 && var2 >= var7 && var1 < var6 + 32 && var2 < var7 + 32) { + Client.dragItemSlotDestination = var19; + DirectByteArrayCopier.field2476 = var0; + if (var0.itemIds[var19] > 0) { + label325: { + ItemDefinition var8 = class222.ItemDefinition_get(var0.itemIds[var19] - 1); + boolean var9; + int var10; + if (Client.isItemSelected == 1) { + var10 = class195.getWidgetClickMask(var0); + var9 = (var10 >> 30 & 1) != 0; + if (var9) { + if (var0.id != MidiPcmStream.selectedItemWidget || var19 != MouseRecorder.selectedItemSlot) { + GameObject.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + AbstractArchive.colorStartTag(16748608) + var8.name, 31, var8.id, var19, var0.id); + } + break label325; + } + } - var29 = var2 + var23; - int var32 = var16 & 7; - int var33 = var15 & 7; - int var35 = var21.sizeX; - int var36 = var21.sizeY; - int var37; - if ((var20 & 1) == 1) { - var37 = var35; - var35 = var36; - var36 = var37; - } + if (Client.isSpellSelected) { + var10 = class195.getWidgetClickMask(var0); + var9 = (var10 >> 30 & 1) != 0; + if (var9) { + if ((class81.selectedSpellFlags & 16) == 16) { + GameObject.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + AbstractArchive.colorStartTag(16748608) + var8.name, 32, var8.id, var19, var0.id); + } + break label325; + } + } - int var34 = var7 & 3; - int var31; - if (var34 == 0) { - var31 = var33; - } else if (var34 == 1) { - var31 = 7 - var32 - (var35 - 1); - } else if (var34 == 2) { - var31 = 7 - var33 - (var36 - 1); - } else { - var31 = var32; - } + String[] var20 = var8.inventoryActions; + var10 = -1; + if (Client.shiftClickDrop && class222.method4272()) { + var10 = var8.getShiftClickIndex(); + } - var37 = var3 + var31; - if (var29 > 0 && var37 > 0 && var29 < 103 && var37 < 103) { - int var38 = var1; - if ((Tiles.Tiles_renderFlags[1][var29][var37] & 2) == 2) { - var38 = var1 - 1; + int var12 = class195.getWidgetClickMask(var0); + boolean var11 = (var12 >> 30 & 1) != 0; + if (var11) { + for (int var13 = 4; var13 >= 3; --var13) { + if (var13 != var10) { + Message.addWidgetItemMenuItem(var0, var8, var19, var13, false); + } + } + } + + int var14 = class195.getWidgetClickMask(var0); + boolean var24 = (var14 >> 31 & 1) != 0; + if (var24) { + GameObject.insertMenuItemNoShift("Use", AbstractArchive.colorStartTag(16748608) + var8.name, 38, var8.id, var19, var0.id); + } + + int var16 = class195.getWidgetClickMask(var0); + boolean var15 = (var16 >> 30 & 1) != 0; + int var17; + if (var15) { + for (var17 = 2; var17 >= 0; --var17) { + if (var17 != var10) { + Message.addWidgetItemMenuItem(var0, var8, var19, var17, false); + } + } + + if (var10 >= 0) { + Message.addWidgetItemMenuItem(var0, var8, var19, var10, true); + } + } + + var20 = var0.itemActions; + if (var20 != null) { + for (var17 = 4; var17 >= 0; --var17) { + if (var20[var17] != null) { + byte var18 = 0; + if (var17 == 0) { + var18 = 39; + } + + if (var17 == 1) { + var18 = 40; + } + + if (var17 == 2) { + var18 = 41; + } + + if (var17 == 3) { + var18 = 42; + } + + if (var17 == 4) { + var18 = 43; + } + + GameObject.insertMenuItemNoShift(var20[var17], AbstractArchive.colorStartTag(16748608) + var8.name, var18, var8.id, var19, var0.id); + } + } + } + + GameObject.insertMenuItemNoShift("Examine", AbstractArchive.colorStartTag(16748608) + var8.name, 1005, var8.id, var19, var0.id); + } } - - CollisionMap var39 = null; - if (var38 >= 0) { - var39 = var9[var38]; - } - - GrandExchangeOfferAgeComparator.method165(var1, var29, var37, var11, var20 + var7 & 3, var19, var8, var39); } + + ++var19; } } } + + if (var0.isIf3) { + if (Client.isSpellSelected) { + if (AbstractWorldMapData.method327(class195.getWidgetClickMask(var0)) && (class81.selectedSpellFlags & 32) == 32) { + GameObject.insertMenuItemNoShift(Client.selectedSpellActionName, Client.selectedSpellName + " " + "->" + " " + var0.dataText, 58, 0, var0.childIndex, var0.id); + } + } else { + for (var19 = 9; var19 >= 5; --var19) { + String var21 = WorldMapData_0.method210(var0, var19); + if (var21 != null) { + GameObject.insertMenuItemNoShift(var21, var0.dataText, 1007, var19 + 1, var0.childIndex, var0.id); + } + } + + var3 = SoundCache.method2666(var0); + if (var3 != null) { + GameObject.insertMenuItemNoShift(var3, var0.dataText, 25, 0, var0.childIndex, var0.id); + } + + for (var4 = 4; var4 >= 0; --var4) { + String var22 = WorldMapData_0.method210(var0, var4); + if (var22 != null) { + ArchiveDiskAction.insertMenuItem(var22, var0.dataText, 57, var4 + 1, var0.childIndex, var0.id, var0.field2690); + } + } + + var5 = class195.getWidgetClickMask(var0); + boolean var23 = (var5 & 1) != 0; + if (var23) { + GameObject.insertMenuItemNoShift("Continue", "", 30, 0, var0.childIndex, var0.id); + } + } + } + } } diff --git a/runescape-client/src/main/java/class81.java b/runescape-client/src/main/java/class81.java index 8a6dbafdc4..70c5315d08 100644 --- a/runescape-client/src/main/java/class81.java +++ b/runescape-client/src/main/java/class81.java @@ -1,224 +1,45 @@ -import java.awt.Image; import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -import net.runelite.rs.ScriptOpcodes; -@ObfuscatedName("co") +@ObfuscatedName("cw") public class class81 { - @ObfuscatedName("sp") + @ObfuscatedName("mx") @ObfuscatedGetter( - longValue = -8179620885535776663L + intValue = -1202719231 ) - static long field1135; - @ObfuscatedName("y") - @Export("ByteArrayPool_arrays") - public static byte[][][] ByteArrayPool_arrays; - @ObfuscatedName("as") - static Image field1127; + @Export("selectedSpellFlags") + static int selectedSpellFlags; - @ObfuscatedName("p") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(ILcu;ZB)I", - garbageValue = "116" + signature = "(Lkf;I)I", + garbageValue = "1778630102" ) - static int method2062(int var0, Script var1, boolean var2) { - int var4 = -1; - Widget var3; - if (var0 >= 2000) { - var0 -= 1000; - var4 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - var3 = Canvas.getWidget(var4); + static int method2206(PacketBuffer var0) { + int var1 = var0.readBits(2); + int var2; + if (var1 == 0) { + var2 = 0; + } else if (var1 == 1) { + var2 = var0.readBits(5); + } else if (var1 == 2) { + var2 = var0.readBits(8); } else { - var3 = var2 ? GrandExchangeOfferAgeComparator.field76 : KitDefinition.field3252; + var2 = var0.readBits(11); } - if (var0 == ScriptOpcodes.CC_SETSCROLLPOS) { - Interpreter.Interpreter_intStackSize -= 2; - var3.scrollX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - if (var3.scrollX > var3.scrollWidth - var3.width) { - var3.scrollX = var3.scrollWidth - var3.width; - } - - if (var3.scrollX < 0) { - var3.scrollX = 0; - } - - var3.scrollY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - if (var3.scrollY > var3.scrollHeight - var3.height) { - var3.scrollY = var3.scrollHeight - var3.height; - } - - if (var3.scrollY < 0) { - var3.scrollY = 0; - } - - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETCOLOUR) { - var3.color = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETFILL) { - var3.fill = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTRANS) { - var3.transparencyTop = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETLINEWID) { - var3.lineWid = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETGRAPHIC) { - var3.spriteId2 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SET2DANGLE) { - var3.spriteAngle = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTILING) { - var3.spriteTiling = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETMODEL) { - var3.modelType = 1; - var3.modelId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETMODELANGLE) { - Interpreter.Interpreter_intStackSize -= 6; - var3.modelOffsetX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var3.modelOffsetY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var3.modelAngleX = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - var3.modelAngleY = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 3]; - var3.modelAngleZ = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 4]; - var3.modelZoom = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 5]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else { - int var8; - if (var0 == ScriptOpcodes.CC_SETMODELANIM) { - var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - if (var8 != var3.sequenceId) { - var3.sequenceId = var8; - var3.modelFrame = 0; - var3.modelFrameCycle = 0; - WorldMapSectionType.invalidateWidget(var3); - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_SETMODELORTHOG) { - var3.modelOrthog = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTEXT) { - String var7 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; - if (!var7.equals(var3.text)) { - var3.text = var7; - WorldMapSectionType.invalidateWidget(var3); - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTEXTFONT) { - var3.fontId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTEXTALIGN) { - Interpreter.Interpreter_intStackSize -= 3; - var3.textXAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var3.textYAlignment = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - var3.textLineHeight = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 2]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETTEXTSHADOW) { - var3.textShadowed = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETOUTLINE) { - var3.outline = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETGRAPHICSHADOW) { - var3.spriteShadow = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETVFLIP) { - var3.spriteFlipV = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETHFLIP) { - var3.spriteFlipH = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETSCROLLSIZE) { - Interpreter.Interpreter_intStackSize -= 2; - var3.scrollWidth = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize]; - var3.scrollHeight = Interpreter.Interpreter_intStack[Interpreter.Interpreter_intStackSize + 1]; - WorldMapSectionType.invalidateWidget(var3); - if (var4 != -1 && var3.type == 0) { - GameShell.revalidateWidgetScroll(UserComparator5.Widget_interfaceComponents[var4 >> 16], var3, false); - } - - return 1; - } else if (var0 == ScriptOpcodes.CC_RESUME_PAUSEBUTTON) { - Clock.resumePauseWidget(var3.id, var3.childIndex); - Client.meslayerContinueWidget = var3; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == 1122) { - var3.spriteId = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETFILLCOLOUR) { - var3.color2 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == 1124) { - var3.transparencyBot = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - WorldMapSectionType.invalidateWidget(var3); - return 1; - } else if (var0 == ScriptOpcodes.CC_SETFILLMODE) { - var8 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - FillMode var6 = (FillMode)NetSocket.findEnumerated(class96.FillMode_values(), var8); - if (var6 != null) { - var3.fillMode = var6; - WorldMapSectionType.invalidateWidget(var3); - } - - return 1; - } else { - boolean var5; - if (var0 == ScriptOpcodes.CC_SETLINEDIRECTION) { - var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - var3.field2579 = var5; - return 1; - } else if (var0 == ScriptOpcodes.CC_SETMODELTRANSPARENT) { - var5 = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize] == 1; - var3.modelTransparency = var5; - return 1; - } else { - return 2; - } - } - } + return var2; } - @ObfuscatedName("p") + @ObfuscatedName("l") @ObfuscatedSignature( - signature = "(II)I", - garbageValue = "550144839" + signature = "(B)V", + garbageValue = "11" ) - public static int method2063(int var0) { - return Client.method1708(ViewportMouse.ViewportMouse_entityTags[var0]); - } - - @ObfuscatedName("m") - @Export("Entity_unpackID") - public static int Entity_unpackID(long var0) { - return (int)(var0 >>> 17 & 4294967295L); + public static void method2207() { + SpotAnimationDefinition.SpotAnimationDefinition_cached.clear(); + SpotAnimationDefinition.SpotAnimationDefinition_cachedModels.clear(); } } diff --git a/runescape-client/src/main/java/class83.java b/runescape-client/src/main/java/class83.java index 029b7c87e1..524f0de683 100644 --- a/runescape-client/src/main/java/class83.java +++ b/runescape-client/src/main/java/class83.java @@ -1,49 +1,86 @@ -import java.awt.Component; import java.math.BigInteger; +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cg") +@ObfuscatedName("cn") public class class83 { - @ObfuscatedName("z") - static final BigInteger field1148; - @ObfuscatedName("n") - static final BigInteger field1149; - @ObfuscatedName("aj") + @ObfuscatedName("a") + static final BigInteger field1144; + @ObfuscatedName("t") + static final BigInteger field1145; + @ObfuscatedName("p") @ObfuscatedGetter( - intValue = 1818915939 + intValue = 543275717 ) - static int field1145; + static int field1146; static { - field1148 = new BigInteger("10001", 16); - field1149 = new BigInteger("a8cda33f9c45f0b9d1675c38ec69da6be4143320190060c229bb35ed91677a4447e09e77031e824aed13bfab51ba180bbda7e279a128f3eb016e9b0dd752a948431798626fc36ac10e036d945f2752d0d874c65a86d3e001a17bf9d63d8bc263b07be4ebc613d01781023a07de698e75248b582e682f1751395f61b9ec1bcbb3", 16); + field1144 = new BigInteger("10001", 16); + field1145 = new BigInteger("8ffe6122bc1531a9d3909c2cefb420d9099dcda7494cf98fcd054d7eac1f32c03cc1cff0955965d35dfb6bd322c5e9201941edfa6f26cfff45524daf4c6b09c8a121f3b0262443ca7164bbad436420e7fd23d9d2b74f228f68f961563e337b95772bf046cf05bb699549141325085c55e5d44ea15e3c7f17dd6c03d521f963f7", 16); } - @ObfuscatedName("n") + @ObfuscatedName("t") @ObfuscatedSignature( - signature = "(Ljava/awt/Component;I)V", - garbageValue = "2076208439" + signature = "(Lhq;III)[Llx;", + garbageValue = "676628248" ) - static void method2069(Component var0) { - var0.removeKeyListener(KeyHandler.KeyHandler_instance); - var0.removeFocusListener(KeyHandler.KeyHandler_instance); - KeyHandler.field373 = -1; + @Export("SpriteBuffer_getSpriteArray") + public static Sprite[] SpriteBuffer_getSpriteArray(AbstractArchive var0, int var1, int var2) { + if (!class32.method618(var0, var1, var2)) { + return null; + } else { + Sprite[] var4 = new Sprite[class325.SpriteBuffer_spriteCount]; + + for (int var5 = 0; var5 < class325.SpriteBuffer_spriteCount; ++var5) { + Sprite var6 = var4[var5] = new Sprite(); + var6.width = class325.SpriteBuffer_spriteWidth; + var6.height = class325.SpriteBuffer_spriteHeight; + var6.xOffset = SecureRandomFuture.SpriteBuffer_xOffsets[var5]; + var6.yOffset = HealthBar.SpriteBuffer_yOffsets[var5]; + var6.subWidth = SecureRandomCallable.SpriteBuffer_spriteWidths[var5]; + var6.subHeight = AttackOption.SpriteBuffer_spriteHeights[var5]; + int var7 = var6.subHeight * var6.subWidth; + byte[] var8 = class325.SpriteBuffer_pixels[var5]; + var6.pixels = new int[var7]; + + for (int var9 = 0; var9 < var7; ++var9) { + var6.pixels[var9] = class325.SpriteBuffer_spritePalette[var8[var9] & 255]; + } + } + + WorldMapData_1.method787(); + return var4; + } } - @ObfuscatedName("n") + @ObfuscatedName("c") @ObfuscatedSignature( - signature = "(Lhp;IIIZI)V", - garbageValue = "-476776598" + signature = "(IB)I", + garbageValue = "13" ) - public static void method2068(AbstractArchive var0, int var1, int var2, int var3, boolean var4) { - class197.field2386 = 1; - class197.musicTrackArchive = var0; - class188.musicTrackGroupId = var1; - class49.musicTrackFileId = var2; - TileItem.field1223 = var3; - WorldMapSectionType.musicTrackBoolean = var4; - MusicPatchNode2.field2382 = 10000; + @Export("Messages_getNextChatID") + static int Messages_getNextChatID(int var0) { + Message var1 = (Message)Messages.Messages_hashTable.get((long)var0); + if (var1 == null) { + return -1; + } else { + return var1.previousDual == Messages.Messages_queue.sentinel ? -1 : ((Message)var1.previousDual).count; + } + } + + @ObfuscatedName("if") + @ObfuscatedSignature( + signature = "(IIIII)V", + garbageValue = "1903758255" + ) + static final void method2212(int var0, int var1, int var2, int var3) { + for (int var4 = 0; var4 < Client.rootWidgetCount; ++var4) { + if (Client.rootWidgetXs[var4] + Client.rootWidgetWidths[var4] > var0 && Client.rootWidgetXs[var4] < var0 + var2 && Client.rootWidgetYs[var4] + Client.rootWidgetHeights[var4] > var1 && Client.rootWidgetYs[var4] < var3 + var1) { + Client.field842[var4] = true; + } + } + } } diff --git a/runescape-client/src/main/java/class96.java b/runescape-client/src/main/java/class96.java index 7cddfd1c8a..cd7b1de892 100644 --- a/runescape-client/src/main/java/class96.java +++ b/runescape-client/src/main/java/class96.java @@ -1,57 +1,45 @@ import net.runelite.mapping.Export; -import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; -@ObfuscatedName("cw") +@ObfuscatedName("cs") public class class96 { - @ObfuscatedName("z") + @ObfuscatedName("a") @ObfuscatedSignature( - signature = "Ljs;" + signature = "Ljm;" ) @Export("reflectionChecks") public static IterableNodeDeque reflectionChecks; - @ObfuscatedName("m") - @ObfuscatedGetter( - intValue = -2145130731 + @ObfuscatedName("o") + static byte[][][] field1300; + @ObfuscatedName("d") + @ObfuscatedSignature( + signature = "Ler;" ) - static int field1304; + @Export("World_request") + static UrlRequest World_request; + @ObfuscatedName("k") + @ObfuscatedSignature( + signature = "Lhi;" + ) + static Widget field1301; + @ObfuscatedName("z") + public static String field1299; static { reflectionChecks = new IterableNodeDeque(); } - @ObfuscatedName("z") + @ObfuscatedName("q") @ObfuscatedSignature( - signature = "(B)[Lgv;", - garbageValue = "-50" + signature = "(IZIZI)V", + garbageValue = "422781217" ) - @Export("ServerPacket_values") - public static ServerPacket[] ServerPacket_values() { - return new ServerPacket[]{ServerPacket.field2126, ServerPacket.field2134, ServerPacket.field2105, ServerPacket.field2098, ServerPacket.field2113, ServerPacket.field2099, ServerPacket.field2101, ServerPacket.field2177, ServerPacket.field2103, ServerPacket.field2140, ServerPacket.field2132, ServerPacket.field2167, ServerPacket.field2107, ServerPacket.field2102, ServerPacket.field2109, ServerPacket.field2110, ServerPacket.field2111, ServerPacket.field2112, ServerPacket.field2145, ServerPacket.field2114, ServerPacket.field2115, ServerPacket.field2096, ServerPacket.field2139, ServerPacket.field2118, ServerPacket.field2119, ServerPacket.field2120, ServerPacket.field2095, ServerPacket.field2122, ServerPacket.field2123, ServerPacket.field2124, ServerPacket.field2104, ServerPacket.field2133, ServerPacket.field2127, ServerPacket.field2128, ServerPacket.field2117, ServerPacket.field2130, ServerPacket.field2159, ServerPacket.field2141, ServerPacket.field2121, ServerPacket.field2106, ServerPacket.field2135, ServerPacket.field2136, ServerPacket.field2137, ServerPacket.field2138, ServerPacket.field2100, ServerPacket.field2129, ServerPacket.field2174, ServerPacket.field2182, ServerPacket.field2168, ServerPacket.field2144, ServerPacket.field2142, ServerPacket.field2146, ServerPacket.field2147, ServerPacket.field2148, ServerPacket.field2149, ServerPacket.field2150, ServerPacket.field2151, ServerPacket.field2152, ServerPacket.field2153, ServerPacket.field2154, ServerPacket.field2155, ServerPacket.field2156, ServerPacket.field2097, ServerPacket.field2158, ServerPacket.field2157, ServerPacket.field2160, ServerPacket.field2161, ServerPacket.field2162, ServerPacket.field2163, ServerPacket.field2164, ServerPacket.field2165, ServerPacket.field2116, ServerPacket.field2143, ServerPacket.field2166, ServerPacket.field2169, ServerPacket.field2170, ServerPacket.field2171, ServerPacket.field2172, ServerPacket.field2173, ServerPacket.field2183, ServerPacket.field2175, ServerPacket.field2176, ServerPacket.field2179, ServerPacket.field2178, ServerPacket.field2125, ServerPacket.field2180}; - } - - @ObfuscatedName("z") - @ObfuscatedSignature( - signature = "(B)[Llu;", - garbageValue = "-67" - ) - @Export("FillMode_values") - public static FillMode[] FillMode_values() { - return new FillMode[]{FillMode.field3856, FillMode.SOLID, FillMode.field3857}; - } - - @ObfuscatedName("v") - @ObfuscatedSignature( - signature = "(Llb;ILjava/lang/String;I)Ljava/lang/String;", - garbageValue = "539746719" - ) - static String method2263(IterableNodeHashTable var0, int var1, String var2) { - if (var0 == null) { - return var2; - } else { - ObjectNode var3 = (ObjectNode)var0.get((long)var1); - return var3 == null ? var2 : (String)var3.obj; + @Export("sortWorldList") + static void sortWorldList(int var0, boolean var1, int var2, boolean var3) { + if (Username.World_worlds != null) { + ModelData0.doWorldSorting(0, Username.World_worlds.length - 1, var0, var1, var2, var3); } + } } diff --git a/runescape-client/src/main/java/class99.java b/runescape-client/src/main/java/class99.java new file mode 100644 index 0000000000..4936360dd7 --- /dev/null +++ b/runescape-client/src/main/java/class99.java @@ -0,0 +1,14 @@ +import net.runelite.mapping.Export; +import net.runelite.mapping.ObfuscatedName; +import net.runelite.mapping.ObfuscatedSignature; + +@ObfuscatedName("cc") +public interface class99 { + @ObfuscatedName("a") + @ObfuscatedSignature( + signature = "(I)Ldq;", + garbageValue = "1807765023" + ) + @Export("player") + PcmPlayer player(); +} diff --git a/runescape-client/src/main/java/net/runelite/rs/ScriptOpcodes.java b/runescape-client/src/main/java/net/runelite/rs/ScriptOpcodes.java index c4236130f5..b715069a54 100644 --- a/runescape-client/src/main/java/net/runelite/rs/ScriptOpcodes.java +++ b/runescape-client/src/main/java/net/runelite/rs/ScriptOpcodes.java @@ -428,6 +428,7 @@ public class ScriptOpcodes { public static final int DOCHEAT = 5020; public static final int CHAT_SETMESSAGEFILTER = 5021; public static final int CHAT_GETMESSAGEFILTER = 5022; + public static final int DEBUGMES = 5023; public static final int GETWINDOWMODE = 5306; public static final int SETWINDOWMODE = 5307; public static final int GETDEFAULTWINDOWMODE = 5308; From 92c674fdff12fdaf65328104e0ad916fd83e1d51 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 31 Oct 2019 17:10:13 +0100 Subject: [PATCH 123/185] Don't look for instance methods when mixin method is static and vice-v --- .../java/net/runelite/injector/MixinInjector.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java index bf4627c785..fc871fa152 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java +++ b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java @@ -525,7 +525,7 @@ public class MixinInjector String deobMethodName = (String) replaceAnnotation.getElement().getValue(); ClassFile deobCf = inject.toDeobClass(cf); - Method deobMethod = findDeobMethod(deobCf, deobMethodName, method.getDescriptor()); + Method deobMethod = findDeobMethod(deobCf, deobMethodName, method); if (deobMethod == null) { @@ -739,14 +739,16 @@ public class MixinInjector } } - private Method findDeobMethod(ClassFile deobCf, String deobMethodName, Signature descriptor) + private Method findDeobMethod(ClassFile deobCf, String deobMethodName, Method mixinMethod) throws InjectionException { - List matchingMethods = new ArrayList<>(); + final Signature descriptor = mixinMethod.getDescriptor(); + final List matchingMethods = new ArrayList<>(); + final boolean stat = mixinMethod.isStatic(); for (Method m : deobCf.getMethods()) { - if (!deobMethodName.equals(m.getName())) + if (!deobMethodName.equals(m.getName()) || m.isStatic() != stat) { continue; } @@ -966,7 +968,7 @@ public class MixinInjector String hookName = methodHook.getElement().getString(); boolean end = methodHook.getElements().size() == 2 && methodHook.getElements().get(1).getValue().equals(true); ClassFile deobCf = inject.toDeobClass(cf); - Method targetMethod = findDeobMethod(deobCf, hookName, method.getDescriptor()); + Method targetMethod = findDeobMethod(deobCf, hookName, method); if (targetMethod == null) { From 2a87b2f2e89ef69727492491822b1e1e19d3dd4c Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 31 Oct 2019 17:18:46 +0100 Subject: [PATCH 124/185] Rename plane again (scene_plane already existed) --- .../java/net/runelite/rs/api/RSClient.java | 4 +- .../src/main/java/ArchiveLoader.java | 2 +- runescape-client/src/main/java/Client.java | 32 +++++------ .../src/main/java/ClientPacket.java | 4 +- .../main/java/DevicePcmPlayerProvider.java | 2 +- runescape-client/src/main/java/FontName.java | 4 +- .../GrandExchangeOfferNameComparator.java | 6 +-- .../GrandExchangeOfferOwnWorldComparator.java | 2 +- ...GrandExchangeOfferUnitPriceComparator.java | 2 +- .../src/main/java/JagexCache.java | 2 +- runescape-client/src/main/java/Language.java | 2 +- .../src/main/java/MouseHandler.java | 4 +- runescape-client/src/main/java/Player.java | 14 ++--- runescape-client/src/main/java/Script.java | 4 +- .../src/main/java/ScriptFrame.java | 8 +-- .../src/main/java/WallDecoration.java | 40 +++++++------- .../src/main/java/WorldMapCacheName.java | 2 +- .../src/main/java/WorldMapSprite.java | 54 +++++++++---------- runescape-client/src/main/java/class4.java | 10 ++-- runescape-client/src/main/java/class40.java | 2 +- runescape-client/src/main/java/class43.java | 2 +- 21 files changed, 101 insertions(+), 101 deletions(-) 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 a71e222efa..e6abda53ba 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 @@ -63,7 +63,7 @@ public interface RSClient extends RSGameShell, Client @Override int getCameraZ2(); - @Import("Scene_plane") + @Import("Client_plane") @Override int getPlane(); @@ -904,7 +904,7 @@ public interface RSClient extends RSGameShell, Client @Import("Scene_cameraYTile") void setScreenCenterZ(int screenCenterZ); // <-- This is correct! - @Import("Scene_plane") + @Import("Client_plane") void setScenePlane(int scenePlane); @Import("Scene_cameraXTileMin") diff --git a/runescape-client/src/main/java/ArchiveLoader.java b/runescape-client/src/main/java/ArchiveLoader.java index 1780bdd426..5b2bdcfdb1 100644 --- a/runescape-client/src/main/java/ArchiveLoader.java +++ b/runescape-client/src/main/java/ArchiveLoader.java @@ -132,7 +132,7 @@ public class ArchiveLoader { var2.x = (var2.pathX[0] << 7) + (var2.transformedSize() << 6); var2.pathY[0] = var6 - HealthBar.baseY * 64; var2.y = (var2.pathY[0] << 7) + (var2.transformedSize() << 6); - Player.Scene_plane = var2.plane = var4; + Player.Client_plane = var2.plane = var4; if (Players.field1229[var1] != null) { var2.read(Players.field1229[var1]); } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index 1c157aff75..944f77e1b1 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -2536,12 +2536,12 @@ public final class Client extends GameShell implements Usernamed { GrandExchangeOfferNameComparator.method172(true); var48 = Tiles.Tiles_minPlane; - if (var48 > Player.Scene_plane) { - var48 = Player.Scene_plane; + if (var48 > Player.Client_plane) { + var48 = Player.Client_plane; } - if (var48 < Player.Scene_plane - 1) { - var48 = Player.Scene_plane - 1; + if (var48 < Player.Client_plane - 1) { + var48 = Player.Client_plane - 1; } if (isLowDetail) { @@ -4181,14 +4181,14 @@ public final class Client extends GameShell implements Usernamed { } if (PendingSpawn.method1854() && KeyHandler.KeyHandler_pressedKeys[82] && KeyHandler.KeyHandler_pressedKeys[81] && mouseWheelRotation != 0) { - var3 = class215.localPlayer.Scene_plane - mouseWheelRotation; + var3 = class215.localPlayer.Client_plane - mouseWheelRotation; if (var3 < 0) { var3 = 0; } else if (var3 > 3) { var3 = 3; } - if (var3 != class215.localPlayer.Scene_plane) { + if (var3 != class215.localPlayer.Client_plane) { var4 = class215.localPlayer.pathX[0] + UserComparator8.baseX * 64; var5 = class215.localPlayer.pathY[0] + HealthBar.baseY * 64; var18 = SoundSystem.getPacketBufferNode(ClientPacket.field2228, packetWriter.isaacCipher); @@ -4360,12 +4360,12 @@ public final class Client extends GameShell implements Usernamed { var5 = IgnoreList.oculusOrbFocalPointX >> 7; var6 = AbstractArchive.oculusOrbFocalPointY >> 7; - var7 = GraphicsObject.getTileHeight(IgnoreList.oculusOrbFocalPointX, AbstractArchive.oculusOrbFocalPointY, Player.Scene_plane); + var7 = GraphicsObject.getTileHeight(IgnoreList.oculusOrbFocalPointX, AbstractArchive.oculusOrbFocalPointY, Player.Client_plane); var8 = 0; if (var5 > 3 && var6 > 3 && var5 < 100 && var6 < 100) { for (var9 = var5 - 4; var9 <= var5 + 4; ++var9) { for (var10 = var6 - 4; var10 <= var6 + 4; ++var10) { - var11 = Player.Scene_plane; + var11 = Player.Client_plane; if (var11 < 3 && (Tiles.Tiles_renderFlags[1][var9][var10] & 2) == 2) { ++var11; } @@ -4393,7 +4393,7 @@ public final class Client extends GameShell implements Usernamed { field717 += (var9 - field717) / 80; } - Tiles.field497 = GraphicsObject.getTileHeight(class215.localPlayer.x, class215.localPlayer.y, Player.Scene_plane) - camFollowHeight; + Tiles.field497 = GraphicsObject.getTileHeight(class215.localPlayer.x, class215.localPlayer.y, Player.Client_plane) - camFollowHeight; } else if (oculusOrbState == 1) { FontName.method5443(); short var35 = -1; @@ -4697,7 +4697,7 @@ public final class Client extends GameShell implements Usernamed { } } - var1 = Player.Scene_plane; + var1 = Player.Client_plane; var2 = class215.localPlayer.x; var3 = class215.localPlayer.y; int var4 = field693; @@ -5263,15 +5263,15 @@ public final class Client extends GameShell implements Usernamed { for (var16 = SpriteMask.field2501; var16 < SpriteMask.field2501 + 8; ++var16) { for (var5 = GrandExchangeOffer.field61; var5 < GrandExchangeOffer.field61 + 8; ++var5) { - if (groundItems[Player.Scene_plane][var16][var5] != null) { - groundItems[Player.Scene_plane][var16][var5] = null; + if (groundItems[Player.Client_plane][var16][var5] != null) { + groundItems[Player.Client_plane][var16][var5] = null; class4.updateItemPile(var16, var5); } } } for (PendingSpawn var38 = (PendingSpawn)pendingSpawns.last(); var38 != null; var38 = (PendingSpawn)pendingSpawns.previous()) { - if (var38.x >= SpriteMask.field2501 && var38.x < SpriteMask.field2501 + 8 && var38.y >= GrandExchangeOffer.field61 && var38.y < GrandExchangeOffer.field61 + 8 && var38.plane == Player.Scene_plane) { + if (var38.x >= SpriteMask.field2501 && var38.x < SpriteMask.field2501 + 8 && var38.y >= GrandExchangeOffer.field61 && var38.y < GrandExchangeOffer.field61 + 8 && var38.plane == Player.Client_plane) { var38.hitpoints = 0; } } @@ -5602,7 +5602,7 @@ public final class Client extends GameShell implements Usernamed { if (SecureRandomCallable.field510 >= 100) { var16 = AbstractUserComparator.field3583 * 16384 + 64; var5 = class49.field401 * 128 + 64; - var6 = GraphicsObject.getTileHeight(var16, var5, Player.Scene_plane) - ViewportMouse.field1713; + var6 = GraphicsObject.getTileHeight(var16, var5, Player.Client_plane) - ViewportMouse.field1713; var7 = var16 - UrlRequester.cameraX; var8 = var6 - class16.cameraY; var19 = var5 - GrandExchangeOfferAgeComparator.cameraZ; @@ -5951,7 +5951,7 @@ public final class Client extends GameShell implements Usernamed { if (Interpreter.field1068 >= 100) { UrlRequester.cameraX = class14.field88 * 128 + 64; GrandExchangeOfferAgeComparator.cameraZ = class42.field360 * 128 + 64; - class16.cameraY = GraphicsObject.getTileHeight(UrlRequester.cameraX, GrandExchangeOfferAgeComparator.cameraZ, Player.Scene_plane) - WorldMapLabel.field231; + class16.cameraY = GraphicsObject.getTileHeight(UrlRequester.cameraX, GrandExchangeOfferAgeComparator.cameraZ, Player.Client_plane) - WorldMapLabel.field231; } var1.serverPacket = null; @@ -6292,7 +6292,7 @@ public final class Client extends GameShell implements Usernamed { @Export("openMenu") final void openMenu(int var1, int var2) { Decimator.calculateMenuBounds(var1, var2); - WorldMapArea.scene.menuOpen(Player.Scene_plane, var1, var2, false); + WorldMapArea.scene.menuOpen(Player.Client_plane, var1, var2, false); isMenuOpen = true; } diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index a0a44d8393..4dd2bab7f9 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -820,7 +820,7 @@ public class ClientPacket implements class181 { var4.plane = (byte)(var7 + var4.plane & 3); if (Client.localPlayerIndex == var1) { - Player.Scene_plane = var4.Scene_plane; + Player.Client_plane = var4.Client_plane; } } else { @@ -846,7 +846,7 @@ public class ClientPacket implements class181 { var4.plane = (byte)(var7 + var4.plane & 3); if (Client.localPlayerIndex == var1) { - Player.Scene_plane = var4.plane; + Player.Client_plane = var4.plane; } } diff --git a/runescape-client/src/main/java/DevicePcmPlayerProvider.java b/runescape-client/src/main/java/DevicePcmPlayerProvider.java index f18d926a37..04694b554c 100644 --- a/runescape-client/src/main/java/DevicePcmPlayerProvider.java +++ b/runescape-client/src/main/java/DevicePcmPlayerProvider.java @@ -227,7 +227,7 @@ public class DevicePcmPlayerProvider implements class99 { } else { int var5; if (var0 == ScriptOpcodes.COORD) { - var3 = Player.Scene_plane; + var3 = Player.Client_plane; var4 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); var5 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); Interpreter.Interpreter_intStack[++Interpreter.Interpreter_intStackSize - 1] = (var4 << 14) + var5 + (var3 << 28); diff --git a/runescape-client/src/main/java/FontName.java b/runescape-client/src/main/java/FontName.java index 7fb8fa602a..0d19a49f34 100644 --- a/runescape-client/src/main/java/FontName.java +++ b/runescape-client/src/main/java/FontName.java @@ -148,7 +148,7 @@ public class FontName { ) static final void method5442() { for (GraphicsObject var0 = (GraphicsObject)Client.graphicsObjects.last(); var0 != null; var0 = (GraphicsObject)Client.graphicsObjects.previous()) { - if (var0.plane == Player.Scene_plane && !var0.isFinished) { + if (var0.plane == Player.Client_plane && !var0.isFinished) { if (Client.cycle >= var0.cycleStart) { var0.advance(Client.field693); if (var0.isFinished) { @@ -178,7 +178,7 @@ public class FontName { } IgnoreList.oculusOrbFocalPointX = class215.localPlayer.x; - int var2 = GraphicsObject.getTileHeight(class215.localPlayer.x, class215.localPlayer.y, Player.Scene_plane) - Client.camFollowHeight; + int var2 = GraphicsObject.getTileHeight(class215.localPlayer.x, class215.localPlayer.y, Player.Client_plane) - Client.camFollowHeight; if (var2 < Tiles.field497) { Tiles.field497 = var2; } diff --git a/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java b/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java index 866a238575..8bce6cd693 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferNameComparator.java @@ -126,7 +126,7 @@ final class GrandExchangeOfferNameComparator implements Comparator { class247.cameraPitch = var3; WorldMapData_1.cameraYaw = var4; if (Client.oculusOrbState == 1 && Client.staffModLevel >= 2 && Client.cycle % 50 == 0 && (IgnoreList.oculusOrbFocalPointX >> 7 != class215.localPlayer.x >> 7 || AbstractArchive.oculusOrbFocalPointY >> 7 != class215.localPlayer.y >> 7)) { - var12 = class215.localPlayer.Scene_plane; + var12 = class215.localPlayer.Client_plane; var13 = UserComparator8.baseX * 64 + (IgnoreList.oculusOrbFocalPointX >> 7); var14 = HealthBar.baseY * 64 + (AbstractArchive.oculusOrbFocalPointY >> 7); PacketBufferNode var15 = SoundSystem.getPacketBufferNode(ClientPacket.field2228, Client.packetWriter.isaacCipher); @@ -190,7 +190,7 @@ final class GrandExchangeOfferNameComparator implements Comparator { var14 = var14; int var26 = Username.ViewportMouse_unpackX(var8); int var16 = ScriptEvent.method1272(var8); - if (var26 == 2 && WorldMapArea.scene.getObjectFlags(Player.Scene_plane, var24, var14, var9) >= 0) { + if (var26 == 2 && WorldMapArea.scene.getObjectFlags(Player.Client_plane, var24, var14, var9) >= 0) { ObjectDefinition var17 = WorldMapDecorationType.getObjectDefinition(var16); if (var17.transforms != null) { var17 = var17.transform(); @@ -307,7 +307,7 @@ final class GrandExchangeOfferNameComparator implements Comparator { } if (var26 == 3) { - NodeDeque var33 = Client.groundItems[Player.Scene_plane][var24][var14]; + NodeDeque var33 = Client.groundItems[Player.Client_plane][var24][var14]; if (var33 != null) { for (TileItem var37 = (TileItem)var33.first(); var37 != null; var37 = (TileItem)var33.next()) { ItemDefinition var35 = class222.ItemDefinition_get(var37.id); diff --git a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java index f9da6f17da..a23b30e93f 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java @@ -423,7 +423,7 @@ public class GrandExchangeOfferOwnWorldComparator implements Comparator { if (Client.isMenuOpen) { WorldMapArea.scene.setViewportWalking(); } else { - WorldMapArea.scene.menuOpen(Player.Scene_plane, var0, var1, true); + WorldMapArea.scene.menuOpen(Player.Client_plane, var0, var1, true); } } else { PacketBufferNode var11; diff --git a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java index 93fd448737..82277e3454 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java @@ -47,7 +47,7 @@ final class GrandExchangeOfferUnitPriceComparator implements Comparator { @Export("addPendingSpawnToScene") static final void addPendingSpawnToScene(int var0, int var1, int var2, int var3, int var4, int var5, int var6) { if (var2 >= 1 && var3 >= 1 && var2 <= 102 && var3 <= 102) { - if (Client.isLowDetail && var0 != Player.Scene_plane) { + if (Client.isLowDetail && var0 != Player.Client_plane) { return; } diff --git a/runescape-client/src/main/java/JagexCache.java b/runescape-client/src/main/java/JagexCache.java index bbf1f8a5ab..0debb0a49b 100644 --- a/runescape-client/src/main/java/JagexCache.java +++ b/runescape-client/src/main/java/JagexCache.java @@ -60,7 +60,7 @@ public class JagexCache { ) static void method3624() { if (Login.worldMap != null) { - Login.worldMap.method6437(Player.Scene_plane, UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7), HealthBar.baseY * 64 + (class215.localPlayer.y >> 7), false); + Login.worldMap.method6437(Player.Client_plane, UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7), HealthBar.baseY * 64 + (class215.localPlayer.y >> 7), false); Login.worldMap.loadCache(); } diff --git a/runescape-client/src/main/java/Language.java b/runescape-client/src/main/java/Language.java index 27c72765b8..a03058a45d 100644 --- a/runescape-client/src/main/java/Language.java +++ b/runescape-client/src/main/java/Language.java @@ -169,7 +169,7 @@ public class Language implements Enumerated { ) static void method3810(int var0, Coord var1, boolean var2) { WorldMapArea var3 = UserComparator4.getWorldMap().getMapArea(var0); - int var4 = class215.localPlayer.Scene_plane; + int var4 = class215.localPlayer.Client_plane; int var5 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); int var6 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); Coord var7 = new Coord(var4, var5, var6); diff --git a/runescape-client/src/main/java/MouseHandler.java b/runescape-client/src/main/java/MouseHandler.java index 8d8c1c4003..d2053d0fff 100644 --- a/runescape-client/src/main/java/MouseHandler.java +++ b/runescape-client/src/main/java/MouseHandler.java @@ -349,7 +349,7 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi ) static final void method1172() { for (Projectile var0 = (Projectile)Client.projectiles.last(); var0 != null; var0 = (Projectile)Client.projectiles.previous()) { - if (var0.plane == Player.Scene_plane && Client.cycle <= var0.cycleEnd) { + if (var0.plane == Player.Client_plane && Client.cycle <= var0.cycleEnd) { if (Client.cycle >= var0.cycleStart) { if (var0.targetIndex > 0) { NPC var1 = Client.npcs[var0.targetIndex - 1]; @@ -373,7 +373,7 @@ public class MouseHandler implements MouseListener, MouseMotionListener, FocusLi } var0.advance(Client.field693); - WorldMapArea.scene.drawEntity(Player.Scene_plane, (int)var0.x, (int)var0.y, (int)var0.z, 60, var0, var0.yaw, -1L, false); + WorldMapArea.scene.drawEntity(Player.Client_plane, (int)var0.x, (int)var0.y, (int)var0.z, 60, var0, var0.yaw, -1L, false); } } else { var0.remove(); diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index a01f45b714..92d20e8128 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -11,8 +11,8 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = 302709599 ) - @Export("Scene_plane") - static int Scene_plane; + @Export("Client_plane") + static int Client_plane; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lju;" @@ -458,7 +458,7 @@ public final class Player extends Actor { int var6 = super.pathY[0]; int var7 = this.transformedSize(); if (var5 >= var7 && var5 < 104 - var7 && var6 >= var7 && var6 < 104 - var7 && var1 >= var7 && var1 < 104 - var7 && var2 >= var7 && var2 < 104 - var7) { - int var8 = Message.method1311(var5, var6, this.transformedSize(), WorldMapCacheName.method685(var1, var2), Client.collisionMaps[this.Scene_plane], true, Client.field890, Client.field906); + int var8 = Message.method1311(var5, var6, this.transformedSize(), WorldMapCacheName.method685(var1, var2), Client.collisionMaps[this.Client_plane], true, Client.field890, Client.field906); if (var8 >= 1) { for (int var9 = 0; var9 < var8 - 1; ++var9) { var4.method1352(Client.field890[var9], Client.field906[var9], (byte)2); @@ -544,9 +544,9 @@ public final class Player extends Actor { long var4 = class160.calculateTag(0, 0, 0, false, var0.index); if (var0.model0 != null && Client.cycle >= var0.animationCycleStart && Client.cycle < var0.animationCycleEnd) { var0.isUnanimated = false; - var0.tileHeight = GraphicsObject.getTileHeight(var0.x, var0.y, Scene_plane); + var0.tileHeight = GraphicsObject.getTileHeight(var0.x, var0.y, Client_plane); var0.playerCycle = Client.cycle; - WorldMapArea.scene.addNullableObject(Scene_plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.field595, var0.field611, var0.field612, var0.field604); + WorldMapArea.scene.addNullableObject(Client_plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.field595, var0.field611, var0.field612, var0.field604); } else { if ((var0.x & 127) == 64 && (var0.y & 127) == 64) { if (Client.tileLastDrawnActor[var2][var3] == Client.viewportDrawCount) { @@ -556,9 +556,9 @@ public final class Player extends Actor { Client.tileLastDrawnActor[var2][var3] = Client.viewportDrawCount; } - var0.tileHeight = GraphicsObject.getTileHeight(var0.x, var0.y, Scene_plane); + var0.tileHeight = GraphicsObject.getTileHeight(var0.x, var0.y, Client_plane); var0.playerCycle = Client.cycle; - WorldMapArea.scene.drawEntity(Scene_plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.isWalking); + WorldMapArea.scene.drawEntity(Client_plane, var0.x, var0.y, var0.tileHeight, 60, var0, var0.rotation, var4, var0.isWalking); } } } diff --git a/runescape-client/src/main/java/Script.java b/runescape-client/src/main/java/Script.java index 40c2aa6117..c6b300d066 100644 --- a/runescape-client/src/main/java/Script.java +++ b/runescape-client/src/main/java/Script.java @@ -88,7 +88,7 @@ public class Script extends DualNode { static final void method2383() { int var0 = class14.field88 * 128 + 64; int var1 = class42.field360 * 128 + 64; - int var2 = GraphicsObject.getTileHeight(var0, var1, Player.Scene_plane) - WorldMapLabel.field231; + int var2 = GraphicsObject.getTileHeight(var0, var1, Player.Client_plane) - WorldMapLabel.field231; if (UrlRequester.cameraX < var0) { UrlRequester.cameraX = (var0 - UrlRequester.cameraX) * Interpreter.field1068 / 1000 + UrlRequester.cameraX + WorldMapAreaData.field323; if (UrlRequester.cameraX > var0) { @@ -133,7 +133,7 @@ public class Script extends DualNode { var0 = AbstractUserComparator.field3583 * 16384 + 64; var1 = class49.field401 * 128 + 64; - var2 = GraphicsObject.getTileHeight(var0, var1, Player.Scene_plane) - ViewportMouse.field1713; + var2 = GraphicsObject.getTileHeight(var0, var1, Player.Client_plane) - ViewportMouse.field1713; int var3 = var0 - UrlRequester.cameraX; int var4 = var2 - class16.cameraY; int var5 = var1 - GrandExchangeOfferAgeComparator.cameraZ; diff --git a/runescape-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java index 3cc3deab95..a86f6325fe 100644 --- a/runescape-client/src/main/java/ScriptFrame.java +++ b/runescape-client/src/main/java/ScriptFrame.java @@ -289,9 +289,9 @@ public class ScriptFrame { garbageValue = "256" ) static final void method1219() { - if (Player.Scene_plane != Client.field856) { - Client.field856 = Player.Scene_plane; - int var0 = Player.Scene_plane; + if (Player.Client_plane != Client.field856) { + Client.field856 = Player.Client_plane; + int var0 = Player.Client_plane; int[] var1 = FloorDecoration.sceneMinimapSprite.pixels; int var2 = var1.length; @@ -339,7 +339,7 @@ public class ScriptFrame { for (var5 = 0; var5 < 104; ++var5) { for (var6 = 0; var6 < 104; ++var6) { - long var7 = WorldMapArea.scene.getFloorDecorationTag(Player.Scene_plane, var5, var6); + long var7 = WorldMapArea.scene.getFloorDecorationTag(Player.Client_plane, var5, var6); if (0L != var7) { int var9 = UserComparator8.Entity_unpackID(var7); int var10 = WorldMapDecorationType.getObjectDefinition(var9).mapIconId; diff --git a/runescape-client/src/main/java/WallDecoration.java b/runescape-client/src/main/java/WallDecoration.java index c4daf66798..9db0cfef6c 100644 --- a/runescape-client/src/main/java/WallDecoration.java +++ b/runescape-client/src/main/java/WallDecoration.java @@ -185,7 +185,7 @@ public final class WallDecoration { int var14; if (!Client.isCameraLocked) { if (ScriptEvent.clientPreferences.roofsHidden) { - var5 = Player.Scene_plane; + var5 = Player.Client_plane; } else { label525: { var6 = 3; @@ -201,17 +201,17 @@ public final class WallDecoration { var9 = UrlRequester.cameraX >> 7; var10 = GrandExchangeOfferAgeComparator.cameraZ >> 7; if (var9 < 0 || var10 < 0 || var9 >= 104 || var10 >= 104) { - var5 = Player.Scene_plane; + var5 = Player.Client_plane; break label525; } if (var7 < 0 || var8 < 0 || var7 >= 104 || var8 >= 104) { - var5 = Player.Scene_plane; + var5 = Player.Client_plane; break label525; } - if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { - var6 = Player.Scene_plane; + if ((Tiles.Tiles_renderFlags[Player.Client_plane][var9][var10] & 4) != 0) { + var6 = Player.Client_plane; } if (var7 > var9) { @@ -237,8 +237,8 @@ public final class WallDecoration { --var9; } - if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { - var6 = Player.Scene_plane; + if ((Tiles.Tiles_renderFlags[Player.Client_plane][var9][var10] & 4) != 0) { + var6 = Player.Client_plane; } var14 += var13; @@ -250,8 +250,8 @@ public final class WallDecoration { --var10; } - if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { - var6 = Player.Scene_plane; + if ((Tiles.Tiles_renderFlags[Player.Client_plane][var9][var10] & 4) != 0) { + var6 = Player.Client_plane; } } } @@ -266,8 +266,8 @@ public final class WallDecoration { --var10; } - if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { - var6 = Player.Scene_plane; + if ((Tiles.Tiles_renderFlags[Player.Client_plane][var9][var10] & 4) != 0) { + var6 = Player.Client_plane; } var14 += var13; @@ -279,8 +279,8 @@ public final class WallDecoration { --var9; } - if ((Tiles.Tiles_renderFlags[Player.Scene_plane][var9][var10] & 4) != 0) { - var6 = Player.Scene_plane; + if ((Tiles.Tiles_renderFlags[Player.Client_plane][var9][var10] & 4) != 0) { + var6 = Player.Client_plane; } } } @@ -288,13 +288,13 @@ public final class WallDecoration { } if (class215.localPlayer.x >= 0 && class215.localPlayer.y >= 0 && class215.localPlayer.x < 13312 && class215.localPlayer.y < 13312) { - if ((Tiles.Tiles_renderFlags[Player.Scene_plane][class215.localPlayer.x >> 7][class215.localPlayer.y >> 7] & 4) != 0) { - var6 = Player.Scene_plane; + if ((Tiles.Tiles_renderFlags[Player.Client_plane][class215.localPlayer.x >> 7][class215.localPlayer.y >> 7] & 4) != 0) { + var6 = Player.Client_plane; } var5 = var6; } else { - var5 = Player.Scene_plane; + var5 = Player.Client_plane; } } } @@ -302,11 +302,11 @@ public final class WallDecoration { var4 = var5; } else { if (ScriptEvent.clientPreferences.roofsHidden) { - var5 = Player.Scene_plane; + var5 = Player.Client_plane; } else { - var6 = GraphicsObject.getTileHeight(UrlRequester.cameraX, GrandExchangeOfferAgeComparator.cameraZ, Player.Scene_plane); - if (var6 - class16.cameraY < 800 && (Tiles.Tiles_renderFlags[Player.Scene_plane][UrlRequester.cameraX >> 7][GrandExchangeOfferAgeComparator.cameraZ >> 7] & 4) != 0) { - var5 = Player.Scene_plane; + var6 = GraphicsObject.getTileHeight(UrlRequester.cameraX, GrandExchangeOfferAgeComparator.cameraZ, Player.Client_plane); + if (var6 - class16.cameraY < 800 && (Tiles.Tiles_renderFlags[Player.Client_plane][UrlRequester.cameraX >> 7][GrandExchangeOfferAgeComparator.cameraZ >> 7] & 4) != 0) { + var5 = Player.Client_plane; } else { var5 = 3; } diff --git a/runescape-client/src/main/java/WorldMapCacheName.java b/runescape-client/src/main/java/WorldMapCacheName.java index 5ddb4abaaf..5fac25787b 100644 --- a/runescape-client/src/main/java/WorldMapCacheName.java +++ b/runescape-client/src/main/java/WorldMapCacheName.java @@ -141,7 +141,7 @@ public class WorldMapCacheName { @Export("worldToScreen") static final void worldToScreen(int var0, int var1, int var2) { if (var0 >= 128 && var1 >= 128 && var0 <= 13056 && var1 <= 13056) { - int var3 = GraphicsObject.getTileHeight(var0, var1, Player.Scene_plane) - var2; + int var3 = GraphicsObject.getTileHeight(var0, var1, Player.Client_plane) - var2; var0 -= UrlRequester.cameraX; var3 -= class16.cameraY; var1 -= GrandExchangeOfferAgeComparator.cameraZ; diff --git a/runescape-client/src/main/java/WorldMapSprite.java b/runescape-client/src/main/java/WorldMapSprite.java index 442099a392..eb83273041 100644 --- a/runescape-client/src/main/java/WorldMapSprite.java +++ b/runescape-client/src/main/java/WorldMapSprite.java @@ -146,52 +146,52 @@ public final class WorldMapSprite { var37 = Client.field692[var7]; if (var4 >= 0 && var5 >= 0 && var4 < 103 && var5 < 103) { if (var37 == 0) { - BoundaryObject var10 = WorldMapArea.scene.method3225(Player.Scene_plane, var4, var5); + BoundaryObject var10 = WorldMapArea.scene.method3225(Player.Client_plane, var4, var5); if (var10 != null) { var11 = UserComparator8.Entity_unpackID(var10.tag); if (var7 == 2) { - var10.entity1 = new DynamicObject(var11, 2, var8 + 4, Player.Scene_plane, var4, var5, var2, false, var10.entity1); - var10.entity2 = new DynamicObject(var11, 2, var8 + 1 & 3, Player.Scene_plane, var4, var5, var2, false, var10.entity2); + var10.entity1 = new DynamicObject(var11, 2, var8 + 4, Player.Client_plane, var4, var5, var2, false, var10.entity1); + var10.entity2 = new DynamicObject(var11, 2, var8 + 1 & 3, Player.Client_plane, var4, var5, var2, false, var10.entity2); } else { - var10.entity1 = new DynamicObject(var11, var7, var8, Player.Scene_plane, var4, var5, var2, false, var10.entity1); + var10.entity1 = new DynamicObject(var11, var7, var8, Player.Client_plane, var4, var5, var2, false, var10.entity1); } } } if (var37 == 1) { - WallDecoration var38 = WorldMapArea.scene.method3339(Player.Scene_plane, var4, var5); + WallDecoration var38 = WorldMapArea.scene.method3339(Player.Client_plane, var4, var5); if (var38 != null) { var11 = UserComparator8.Entity_unpackID(var38.tag); if (var7 != 4 && var7 != 5) { if (var7 == 6) { - var38.entity1 = new DynamicObject(var11, 4, var8 + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + var38.entity1 = new DynamicObject(var11, 4, var8 + 4, Player.Client_plane, var4, var5, var2, false, var38.entity1); } else if (var7 == 7) { - var38.entity1 = new DynamicObject(var11, 4, (var8 + 2 & 3) + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + var38.entity1 = new DynamicObject(var11, 4, (var8 + 2 & 3) + 4, Player.Client_plane, var4, var5, var2, false, var38.entity1); } else if (var7 == 8) { - var38.entity1 = new DynamicObject(var11, 4, var8 + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity1); - var38.entity2 = new DynamicObject(var11, 4, (var8 + 2 & 3) + 4, Player.Scene_plane, var4, var5, var2, false, var38.entity2); + var38.entity1 = new DynamicObject(var11, 4, var8 + 4, Player.Client_plane, var4, var5, var2, false, var38.entity1); + var38.entity2 = new DynamicObject(var11, 4, (var8 + 2 & 3) + 4, Player.Client_plane, var4, var5, var2, false, var38.entity2); } } else { - var38.entity1 = new DynamicObject(var11, 4, var8, Player.Scene_plane, var4, var5, var2, false, var38.entity1); + var38.entity1 = new DynamicObject(var11, 4, var8, Player.Client_plane, var4, var5, var2, false, var38.entity1); } } } if (var37 == 2) { - GameObject var39 = WorldMapArea.scene.method3227(Player.Scene_plane, var4, var5); + GameObject var39 = WorldMapArea.scene.method3227(Player.Client_plane, var4, var5); if (var7 == 11) { var7 = 10; } if (var39 != null) { - var39.entity = new DynamicObject(UserComparator8.Entity_unpackID(var39.tag), var7, var8, Player.Scene_plane, var4, var5, var2, false, var39.entity); + var39.entity = new DynamicObject(UserComparator8.Entity_unpackID(var39.tag), var7, var8, Player.Client_plane, var4, var5, var2, false, var39.entity); } } if (var37 == 3) { - FloorDecoration var40 = WorldMapArea.scene.getFloorDecoration(Player.Scene_plane, var4, var5); + FloorDecoration var40 = WorldMapArea.scene.getFloorDecoration(Player.Client_plane, var4, var5); if (var40 != null) { - var40.entity = new DynamicObject(UserComparator8.Entity_unpackID(var40.tag), 22, var8, Player.Scene_plane, var4, var5, var2, false, var40.entity); + var40.entity = new DynamicObject(UserComparator8.Entity_unpackID(var40.tag), 22, var8, Player.Client_plane, var4, var5, var2, false, var40.entity); } } } @@ -206,7 +206,7 @@ public final class WorldMapSprite { if (var6 >= 0 && var7 >= 0 && var6 < 104 && var7 < 104) { var6 = var6 * 128 + 64; var7 = var7 * 128 + 64; - GraphicsObject var44 = new GraphicsObject(var4, Player.Scene_plane, var6, var7, GraphicsObject.getTileHeight(var6, var7, Player.Scene_plane) - var2, var3, Client.cycle); + GraphicsObject var44 = new GraphicsObject(var4, Player.Client_plane, var6, var7, GraphicsObject.getTileHeight(var6, var7, Player.Client_plane) - var2, var3, Client.cycle); Client.graphicsObjects.addFirst(var44); } @@ -235,8 +235,8 @@ public final class WorldMapSprite { var8 = var8 * 128 + 64; var11 = var11 * 128 + 64; var12 = var12 * 128 + 64; - Projectile var15 = new Projectile(var5, Player.Scene_plane, var7, var8, GraphicsObject.getTileHeight(var7, var8, Player.Scene_plane) - var4, var32 + Client.cycle, var43 + Client.cycle, var13, var3, var2, var37); - var15.setDestination(var11, var12, GraphicsObject.getTileHeight(var11, var12, Player.Scene_plane) - var37, var32 + Client.cycle); + Projectile var15 = new Projectile(var5, Player.Client_plane, var7, var8, GraphicsObject.getTileHeight(var7, var8, Player.Client_plane) - var4, var32 + Client.cycle, var43 + Client.cycle, var13, var3, var2, var37); + var15.setDestination(var11, var12, GraphicsObject.getTileHeight(var11, var12, Player.Client_plane) - var37, var32 + Client.cycle); Client.projectiles.addFirst(var15); } @@ -252,11 +252,11 @@ public final class WorldMapSprite { var33 = new TileItem(); var33.id = var3; var33.quantity = var2; - if (Client.groundItems[Player.Scene_plane][var5][var6] == null) { - Client.groundItems[Player.Scene_plane][var5][var6] = new NodeDeque(); + if (Client.groundItems[Player.Client_plane][var5][var6] == null) { + Client.groundItems[Player.Client_plane][var5][var6] = new NodeDeque(); } - Client.groundItems[Player.Scene_plane][var5][var6].addFirst(var33); + Client.groundItems[Player.Client_plane][var5][var6].addFirst(var33); class4.updateItemPile(var5, var6); } @@ -300,13 +300,13 @@ public final class WorldMapSprite { int var22 = var11 + (var19 + 1 >> 1); int var23 = var12 + (var20 >> 1); int var24 = var12 + (var20 + 1 >> 1); - int[][] var25 = Tiles.Tiles_heights[Player.Scene_plane]; + int[][] var25 = Tiles.Tiles_heights[Player.Client_plane]; int var26 = var25[var22][var24] + var25[var21][var24] + var25[var22][var23] + var25[var21][var23] >> 2; int var27 = (var11 << 7) + (var19 << 6); int var28 = (var12 << 7) + (var20 << 6); Model var29 = var18.getModel(var5, var6, var25, var27, var26, var28); if (var29 != null) { - GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Scene_plane, var11, var12, var7, -1, 0, 0, var2 + 1, var8 + 1); + GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Client_plane, var11, var12, var7, -1, 0, 0, var2 + 1, var8 + 1); var17.animationCycleStart = var2 + Client.cycle; var17.animationCycleEnd = var8 + Client.cycle; var17.model0 = var29; @@ -343,7 +343,7 @@ public final class WorldMapSprite { var7 = (var6 >> 4 & 7) + SpriteMask.field2501; var8 = (var6 & 7) + GrandExchangeOffer.field61; if (var7 >= 0 && var8 >= 0 && var7 < 104 && var8 < 104) { - GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Scene_plane, var7, var8, var5, -1, var3, var4, 0, -1); + GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Client_plane, var7, var8, var5, -1, var3, var4, 0, -1); } } else if (class185.field2296 == var0) { @@ -356,7 +356,7 @@ public final class WorldMapSprite { var8 = var6 & 3; var37 = Client.field692[var7]; if (var3 >= 0 && var4 >= 0 && var3 < 104 && var4 < 104) { - GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Scene_plane, var3, var4, var37, var5, var7, var8, 0, -1); + GrandExchangeOfferWorldComparator.updatePendingSpawn(Player.Client_plane, var3, var4, var37, var5, var7, var8, 0, -1); } } else if (class185.field2297 == var0) { @@ -367,7 +367,7 @@ public final class WorldMapSprite { var6 = (var4 & 7) + GrandExchangeOffer.field61; var7 = var1.method5647(); if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { - NodeDeque var31 = Client.groundItems[Player.Scene_plane][var5][var6]; + NodeDeque var31 = Client.groundItems[Player.Client_plane][var5][var6]; if (var31 != null) { for (TileItem var35 = (TileItem)var31.last(); var35 != null; var35 = (TileItem)var31.previous()) { if ((var2 & 32767) == var35.id && var7 == var35.quantity) { @@ -409,7 +409,7 @@ public final class WorldMapSprite { var4 = (var3 >> 4 & 7) + SpriteMask.field2501; var5 = (var3 & 7) + GrandExchangeOffer.field61; if (var4 >= 0 && var5 >= 0 && var4 < 104 && var5 < 104) { - NodeDeque var36 = Client.groundItems[Player.Scene_plane][var4][var5]; + NodeDeque var36 = Client.groundItems[Player.Client_plane][var4][var5]; if (var36 != null) { for (var33 = (TileItem)var36.last(); var33 != null; var33 = (TileItem)var36.previous()) { if ((var2 & 32767) == var33.id) { @@ -419,7 +419,7 @@ public final class WorldMapSprite { } if (var36.last() == null) { - Client.groundItems[Player.Scene_plane][var4][var5] = null; + Client.groundItems[Player.Client_plane][var4][var5] = null; } class4.updateItemPile(var4, var5); diff --git a/runescape-client/src/main/java/class4.java b/runescape-client/src/main/java/class4.java index 88e3945ff0..4f708e4a22 100644 --- a/runescape-client/src/main/java/class4.java +++ b/runescape-client/src/main/java/class4.java @@ -383,9 +383,9 @@ final class class4 implements class0 { ) @Export("updateItemPile") static final void updateItemPile(int var0, int var1) { - NodeDeque var2 = Client.groundItems[Player.Scene_plane][var0][var1]; + NodeDeque var2 = Client.groundItems[Player.Client_plane][var0][var1]; if (var2 == null) { - WorldMapArea.scene.removeGroundItemPile(Player.Scene_plane, var0, var1); + WorldMapArea.scene.removeGroundItemPile(Player.Client_plane, var0, var1); } else { long var3 = -99999999L; TileItem var5 = null; @@ -405,7 +405,7 @@ final class class4 implements class0 { } if (var5 == null) { - WorldMapArea.scene.removeGroundItemPile(Player.Scene_plane, var0, var1); + WorldMapArea.scene.removeGroundItemPile(Player.Client_plane, var0, var1); } else { var2.addLast(var5); TileItem var12 = null; @@ -424,7 +424,7 @@ final class class4 implements class0 { } long var9 = class160.calculateTag(var0, var1, 3, false, 0); - WorldMapArea.scene.newGroundItemPile(Player.Scene_plane, var0, var1, GraphicsObject.getTileHeight(var0 * 128 + 64, var1 * 128 + 64, Player.Scene_plane), var5, var9, var12, var11); + WorldMapArea.scene.newGroundItemPile(Player.Client_plane, var0, var1, GraphicsObject.getTileHeight(var0 * 128 + 64, var1 * 128 + 64, Player.Client_plane), var5, var9, var12, var11); } } } @@ -646,7 +646,7 @@ final class class4 implements class0 { int var12; for (var8 = 0; var8 < 104; ++var8) { for (var9 = 0; var9 < 104; ++var9) { - NodeDeque var15 = Client.groundItems[Player.Scene_plane][var8][var9]; + NodeDeque var15 = Client.groundItems[Player.Client_plane][var8][var9]; if (var15 != null) { var11 = var8 * 4 + 2 - class215.localPlayer.x / 32; var12 = var9 * 4 + 2 - class215.localPlayer.y / 32; diff --git a/runescape-client/src/main/java/class40.java b/runescape-client/src/main/java/class40.java index 1157817db6..2e0920fda5 100644 --- a/runescape-client/src/main/java/class40.java +++ b/runescape-client/src/main/java/class40.java @@ -944,7 +944,7 @@ public class class40 { long var5 = class160.calculateTag(0, 0, 1, !var2.definition.isInteractable, Client.npcIndices[var1]); var2.playerCycle = Client.cycle; - WorldMapArea.scene.drawEntity(Player.Scene_plane, var2.x, var2.y, GraphicsObject.getTileHeight(var2.field927 * 64 - 64 + var2.x, var2.field927 * 64 - 64 + var2.y, Player.Scene_plane), var2.field927 * 64 - 64 + 60, var2, var2.rotation, var5, var2.isWalking); + WorldMapArea.scene.drawEntity(Player.Client_plane, var2.x, var2.y, GraphicsObject.getTileHeight(var2.field927 * 64 - 64 + var2.x, var2.field927 * 64 - 64 + var2.y, Player.Client_plane), var2.field927 * 64 - 64 + 60, var2, var2.rotation, var5, var2.isWalking); } } } diff --git a/runescape-client/src/main/java/class43.java b/runescape-client/src/main/java/class43.java index 10eb71b83d..1f412b9e33 100644 --- a/runescape-client/src/main/java/class43.java +++ b/runescape-client/src/main/java/class43.java @@ -92,7 +92,7 @@ public final class class43 { static int method877(int var0, Script var1, boolean var2) { int var3; if (var0 == 6600) { - var3 = Player.Scene_plane; + var3 = Player.Client_plane; int var9 = UserComparator8.baseX * 64 + (class215.localPlayer.x >> 7); int var5 = HealthBar.baseY * 64 + (class215.localPlayer.y >> 7); UserComparator4.getWorldMap().method6437(var3, var9, var5, true); From d795ebdfc2ad6dcb96207fe254d7536b888a0d73 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 31 Oct 2019 17:32:51 +0100 Subject: [PATCH 125/185] revert injector change to do it safe way for now --- .../java/net/runelite/injector/MixinInjector.java | 12 +++++------- .../java/GrandExchangeOfferOwnWorldComparator.java | 2 +- runescape-client/src/main/java/WorldMap.java | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java index fc871fa152..bf4627c785 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java +++ b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java @@ -525,7 +525,7 @@ public class MixinInjector String deobMethodName = (String) replaceAnnotation.getElement().getValue(); ClassFile deobCf = inject.toDeobClass(cf); - Method deobMethod = findDeobMethod(deobCf, deobMethodName, method); + Method deobMethod = findDeobMethod(deobCf, deobMethodName, method.getDescriptor()); if (deobMethod == null) { @@ -739,16 +739,14 @@ public class MixinInjector } } - private Method findDeobMethod(ClassFile deobCf, String deobMethodName, Method mixinMethod) + private Method findDeobMethod(ClassFile deobCf, String deobMethodName, Signature descriptor) throws InjectionException { - final Signature descriptor = mixinMethod.getDescriptor(); - final List matchingMethods = new ArrayList<>(); - final boolean stat = mixinMethod.isStatic(); + List matchingMethods = new ArrayList<>(); for (Method m : deobCf.getMethods()) { - if (!deobMethodName.equals(m.getName()) || m.isStatic() != stat) + if (!deobMethodName.equals(m.getName())) { continue; } @@ -968,7 +966,7 @@ public class MixinInjector String hookName = methodHook.getElement().getString(); boolean end = methodHook.getElements().size() == 2 && methodHook.getElements().get(1).getValue().equals(true); ClassFile deobCf = inject.toDeobClass(cf); - Method targetMethod = findDeobMethod(deobCf, hookName, method); + Method targetMethod = findDeobMethod(deobCf, hookName, method.getDescriptor()); if (targetMethod == null) { diff --git a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java index a23b30e93f..da1be940f5 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferOwnWorldComparator.java @@ -832,7 +832,7 @@ public class GrandExchangeOfferOwnWorldComparator implements Comparator { if (var2 != 1007) { if (var2 == 1011 || var2 == 1008 || var2 == 1010 || var2 == 1009 || var2 == 1012) { - Login.worldMap.menuAction(var2, var3, new Coord(var0), new Coord(var1)); + Login.worldMap.worldMapMenuAction(var2, var3, new Coord(var0), new Coord(var1)); } break label795; } diff --git a/runescape-client/src/main/java/WorldMap.java b/runescape-client/src/main/java/WorldMap.java index 5cfc358139..f72eda916b 100644 --- a/runescape-client/src/main/java/WorldMap.java +++ b/runescape-client/src/main/java/WorldMap.java @@ -1375,8 +1375,8 @@ public class WorldMap { signature = "(IILhf;Lhf;B)V", garbageValue = "0" ) - @Export("menuAction") - public void menuAction(int var1, int var2, Coord var3, Coord var4) { + @Export("worldMapMenuAction") + public void worldMapMenuAction(int var1, int var2, Coord var3, Coord var4) { ScriptEvent var5 = new ScriptEvent(); WorldMapEvent var6 = new WorldMapEvent(var2, var3, var4); var5.setArgs(new Object[]{var6}); From 39f56af3f7f452456687da26575d9aa9389cd1b5 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Thu, 31 Oct 2019 18:42:02 +0100 Subject: [PATCH 126/185] porject: Bump version --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 4f77bbb293..7b852a28d0 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -29,7 +29,7 @@ object ProjectVersions { const val launcherVersion = "2.0.3" const val rlVersion = "1.5.38-SNAPSHOT" - const val openosrsVersion = "2.1.8.0" + const val openosrsVersion = "2.1.9.0" const val rsversion = 185 const val cacheversion = 165 From b8d0f8b664389e808869fa7ee07f9be712e16e8b Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Thu, 31 Oct 2019 19:01:29 +0100 Subject: [PATCH 127/185] client: update modulus --- .../src/main/java/net/runelite/mixins/RSClientMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 497aaff3d0..ef08769073 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1752,7 +1752,7 @@ public abstract class RSClientMixin implements RSClient } @Inject - BigInteger modulus = new BigInteger("a8cda33f9c45f0b9d1675c38ec69da6be4143320190060c229bb35ed91677a4447e09e77031e824aed13bfab51ba180bbda7e279a128f3eb016e9b0dd752a948431798626fc36ac10e036d945f2752d0d874c65a86d3e001a17bf9d63d8bc263b07be4ebc613d01781023a07de698e75248b582e682f1751395f61b9ec1bcbb3", 16); + BigInteger modulus = new BigInteger("8ffe6122bc1531a9d3909c2cefb420d9099dcda7494cf98fcd054d7eac1f32c03cc1cff0955965d35dfb6bd322c5e9201941edfa6f26cfff45524daf4c6b09c8a121f3b0262443ca7164bbad436420e7fd23d9d2b74f228f68f961563e337b95772bf046cf05bb699549141325085c55e5d44ea15e3c7f17dd6c03d521f963f7", 16); @Inject @Override From 23dd23a415698cfbe790627f4d7be0a143c09395 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 31 Oct 2019 19:06:00 +0100 Subject: [PATCH 128/185] update private server stuff to not break all the fucking time --- .../main/java/net/runelite/api/Client.java | 2 - .../privateserver/PrivateServerPlugin.java | 39 +++++++++---------- .../net/runelite/mixins/RSBufferMixin.java | 17 ++++---- .../net/runelite/mixins/RSClientMixin.java | 12 +----- 4 files changed, 31 insertions(+), 39 deletions(-) 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 78e0f58eb1..fd0924ceab 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1795,8 +1795,6 @@ public interface Client extends GameShell */ void removeFriend(String name); - BigInteger getModulus(); - void setModulus(BigInteger modulus); /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/privateserver/PrivateServerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/privateserver/PrivateServerPlugin.java index ca074fd523..b3b19c1a42 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/privateserver/PrivateServerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/privateserver/PrivateServerPlugin.java @@ -70,24 +70,24 @@ public class PrivateServerPlugin extends Plugin @Override protected void startUp() throws Exception { - if (RuneLite.allowPrivateServer) + if (!RuneLite.allowPrivateServer) { - updateConfig(); - addSubscriptions(); + return; } - else + + if (!config.modulus().equals("")) { - client.setModulus(new BigInteger("83ff79a3e258b99ead1a70e1049883e78e513c4cdec538d8da9483879a9f81689c0c7d146d7b82b52d05cf26132b1cda5930eeef894e4ccf3d41eebc3aabe54598c4ca48eb5a31d736bfeea17875a35558b9e3fcd4aebe2a9cc970312a477771b36e173dc2ece6001ab895c553e2770de40073ea278026f36961c94428d8d7db", 16)); + client.setModulus(new BigInteger(config.modulus(), 16)); } + + addSubscriptions(); } @Override protected void shutDown() throws Exception { - if (RuneLite.allowPrivateServer) - { - eventBus.unregister(this); - } + client.setModulus(null); + eventBus.unregister(this); } private void addSubscriptions() @@ -97,12 +97,19 @@ public class PrivateServerPlugin extends Plugin private void onConfigChanged(ConfigChanged event) { - if (event.getGroup().equals("privateserver") && event.getKey().equals("modulus")) + if (!event.getGroup().equals("privateserver")) { - client.setModulus(new BigInteger(config.modulus(), 16)); + return; } - if (event.getGroup().equals("privateserver") && event.getKey().equals("codebase")) + if (event.getKey().equals("modulus")) + { + if (RuneLite.allowPrivateServer && !config.modulus().equals("")) + { + client.setModulus(new BigInteger(config.modulus(), 16)); + } + } + else if (event.getKey().equals("codebase")) { StringFileUtils.writeStringToFile(RuneLite.RUNELITE_DIR + "/codebase", config.codebase()); String message = "Client restart required after codebase change\n"; @@ -110,12 +117,4 @@ public class PrivateServerPlugin extends Plugin JOptionPane.WARNING_MESSAGE); } } - - private void updateConfig() - { - if (!config.modulus().equals("")) - { - client.setModulus(new BigInteger(config.modulus(), 16)); - } - } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java index 8d6e946b7f..a7fe725888 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java @@ -39,17 +39,20 @@ public abstract class RSBufferMixin implements RSBuffer @Shadow("client") private static RSClient client; - @Inject - private static BigInteger exponent = new BigInteger("10001", 16); + @Shadow("modulus") + private static BigInteger modulus; @Copy("encryptRsa") - public void rs$encryptRsa(BigInteger var1, BigInteger var2) - { - } + abstract void rs$encryptRsa(BigInteger var1, BigInteger var2); @Replace("encryptRsa") - public void rl$encryptRsa(BigInteger var1, BigInteger var2) + public void rl$encryptRsa(BigInteger exp, BigInteger mod) { - rs$encryptRsa(exponent, client.getModulus()); + if (modulus != null) + { + mod = modulus; + } + + rs$encryptRsa(exp, mod); } } \ No newline at end of file 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 e9e82eabaa..60e361a942 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1751,21 +1751,13 @@ public abstract class RSClientMixin implements RSClient } @Inject - BigInteger modulus = new BigInteger("a8cda33f9c45f0b9d1675c38ec69da6be4143320190060c229bb35ed91677a4447e09e77031e824aed13bfab51ba180bbda7e279a128f3eb016e9b0dd752a948431798626fc36ac10e036d945f2752d0d874c65a86d3e001a17bf9d63d8bc263b07be4ebc613d01781023a07de698e75248b582e682f1751395f61b9ec1bcbb3", 16); - - @Inject - @Override - public BigInteger getModulus() - { - return modulus; - } - + private static BigInteger modulus; @Inject @Override public void setModulus(BigInteger modulus) { - this.modulus = modulus; + RSClientMixin.modulus = modulus; } @Copy("forceDisconnect") From f838717805a89eb525f78e5cab43033b85212a0d Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Thu, 31 Oct 2019 19:07:01 +0100 Subject: [PATCH 129/185] fernflowerplugin: Add annotations (#1854) --- buildSrc/build.gradle.kts | 2 -- buildSrc/src/main/kotlin/FernflowerTask.kt | 35 ++++++++++++++----- .../gradle-plugins/fernflower.properties | 1 - 3 files changed, 26 insertions(+), 12 deletions(-) delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index e07fbc3103..96df5cfa5f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -25,7 +25,6 @@ plugins { `kotlin-dsl` - groovy } repositories { @@ -35,7 +34,6 @@ repositories { dependencies { implementation(gradleApi()) - implementation(localGroovy()) implementation(group = "net.runelite", name = "fernflower", version = "07082019") } diff --git a/buildSrc/src/main/kotlin/FernflowerTask.kt b/buildSrc/src/main/kotlin/FernflowerTask.kt index 3dbb2ba995..b178b89789 100644 --- a/buildSrc/src/main/kotlin/FernflowerTask.kt +++ b/buildSrc/src/main/kotlin/FernflowerTask.kt @@ -1,26 +1,43 @@ import org.gradle.api.DefaultTask +import org.gradle.api.tasks.CacheableTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskAction import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -import java.io.File +@CacheableTask open class FernflowerTask: DefaultTask() { + @Input + @Optional var extraArgs: List? = null + + @Input + @Optional var inputJar: String? = null + + @Input + @Optional var outputDir: String? = null - fun getInputJar(): File { - return project.file(inputJar ?: project.buildDir.toString() + "/libs/" + project.name + '-' + project.version + ".jar") - } + @InputFile + @PathSensitive(PathSensitivity.ABSOLUTE) + var getInputJar = project.file(inputJar ?: project.buildDir.toString() + "/libs/" + project.name + '-' + + project.version + ".jar") + + @OutputDirectory + @PathSensitive(PathSensitivity.ABSOLUTE) + var getOutputDir = project.file(outputDir ?: project.buildDir.toString() + "/decompiled-sources") - fun getOutputDir(): File { - return project.file(outputDir ?: project.buildDir.toString() + "/decompiled-sources") - } @TaskAction fun decompile() { - getOutputDir().mkdirs() - val args = mutableListOf(getInputJar().toString(), getOutputDir().toString()) + getOutputDir.mkdirs() + val args = mutableListOf(getInputJar.toString(), getOutputDir.toString()) if (extraArgs != null) { args.addAll(extraArgs!!) } diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties deleted file mode 100644 index 6b2628a4c7..0000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/fernflower.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=kt \ No newline at end of file From 79dda8b7d0bc773039e780708908aa2673d1b250 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 31 Oct 2019 18:24:01 -0400 Subject: [PATCH 130/185] npc highlight: use local location for south-west highlight --- .../plugins/npchighlight/NpcSceneOverlay.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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 fef1b03c8a..66b4a97224 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 @@ -148,12 +148,24 @@ public class NpcSceneOverlay extends Overlay switch (config.renderStyle()) { case SOUTH_WEST_TILE: - LocalPoint lp1 = LocalPoint.fromWorld(client, actor.getWorldLocation()); - Polygon tilePoly1 = Perspective.getCanvasTilePoly(client, lp1); + { + int size = 1; + NPCComposition composition = actor.getTransformedComposition(); + if (composition != null) + { + size = composition.getSize(); + } - renderPoly(graphics, color, tilePoly1); + LocalPoint localPoint = actor.getLocalLocation(); + + int x = localPoint.getX() - ((size - 1) * Perspective.LOCAL_TILE_SIZE / 2); + int y = localPoint.getY() - ((size - 1) * Perspective.LOCAL_TILE_SIZE / 2); + + Polygon tilePoly = Perspective.getCanvasTilePoly(client, new LocalPoint(x, y)); + + renderPoly(graphics, color, tilePoly); break; - + } case TILE: int size = 1; NPCComposition composition = actor.getTransformedComposition(); From bbe38dae95ca158ecaa6e6f4560e227094448d63 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 31 Oct 2019 16:55:29 -0400 Subject: [PATCH 131/185] osb exchange service: validate price averages After an update they get reset to 0 for a time and it is overwriting our price cache --- .../http/service/osbuddy/OSBGrandExchangeService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/http-service/src/main/java/net/runelite/http/service/osbuddy/OSBGrandExchangeService.java b/http-service/src/main/java/net/runelite/http/service/osbuddy/OSBGrandExchangeService.java index 797d7e76e2..49e9e4a636 100644 --- a/http-service/src/main/java/net/runelite/http/service/osbuddy/OSBGrandExchangeService.java +++ b/http-service/src/main/java/net/runelite/http/service/osbuddy/OSBGrandExchangeService.java @@ -98,6 +98,11 @@ public class OSBGrandExchangeService Integer itemId = entry.getKey(); OsbuddySummaryItem item = entry.getValue(); + if (item.getBuy_average() <= 0 || item.getSell_average() <= 0 || item.getOverall_average() <= 0) + { + continue; + } + query .addParameter("itemId", itemId) .addParameter("buyAverage", item.getBuy_average()) From dde308f2e8c1908146570cc80234c7747325e39a Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 31 Oct 2019 17:02:05 -0400 Subject: [PATCH 132/185] login screen: remove paste to password Jagex has added this now into their own client --- .../client/plugins/loginscreen/LoginScreenPlugin.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java index bda2e5cdf2..e495afab1d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java @@ -53,7 +53,6 @@ import net.runelite.client.util.OSType; public class LoginScreenPlugin extends Plugin implements KeyListener { private static final int MAX_USERNAME_LENGTH = 254; - private static final int MAX_PASSWORD_LENGTH = 20; private static final int MAX_PIN_LENGTH = 6; @Inject @@ -194,11 +193,6 @@ public class LoginScreenPlugin extends Plugin implements KeyListener // Truncate data to maximum username length if necessary client.setUsername(data.substring(0, Math.min(data.length(), MAX_USERNAME_LENGTH))); } - else - { - // Truncate data to maximum password length if necessary - client.setPassword(data.substring(0, Math.min(data.length(), MAX_PASSWORD_LENGTH))); - } break; // Authenticator form From a103da9118ecc929e0037ff97e66182d24b8b38a Mon Sep 17 00:00:00 2001 From: Ron Young Date: Thu, 31 Oct 2019 12:21:05 -0500 Subject: [PATCH 133/185] grandexchange: rebuild GE item text on rebuild script event Co-authored-by: Adam --- .../grandexchange/GrandExchangePlugin.java | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index b7936c243e..5aa10b539e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -54,13 +54,10 @@ import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.FocusChanged; import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.GameTick; import net.runelite.api.events.GrandExchangeOfferChanged; import net.runelite.api.events.MenuEntryAdded; -import net.runelite.client.events.SessionClose; -import net.runelite.client.events.SessionOpen; -import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; @@ -69,6 +66,8 @@ import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.SessionClose; +import net.runelite.client.events.SessionOpen; import net.runelite.client.game.ItemManager; import net.runelite.client.input.KeyManager; import net.runelite.client.input.MouseManager; @@ -152,6 +151,9 @@ public class GrandExchangePlugin extends Plugin private Widget grandExchangeItem; private Map itemGELimits; + private int osbItem; + private OSBGrandExchangeResult osbGrandExchangeResult; + private GrandExchangeClient grandExchangeClient; private SavedOffer getOffer(int slot) @@ -209,6 +211,9 @@ public class GrandExchangePlugin extends Plugin { grandExchangeClient = new GrandExchangeClient(accountSession.getUuid()); } + + osbItem = -1; + osbGrandExchangeResult = null; } @Override @@ -432,6 +437,11 @@ public class GrandExchangePlugin extends Plugin @Subscribe public void onScriptCallbackEvent(ScriptCallbackEvent event) { + if (event.getEventName().equals("geBuilt")) + { + rebuildGeText(); + } + if (!event.getEventName().equals("setGETitle") || !config.showTotal()) { return; @@ -472,8 +482,7 @@ public class GrandExchangePlugin extends Plugin stringStack[stringStackSize - 1] += titleBuilder.toString(); } - @Subscribe - public void onGameTick(GameTick event) + private void rebuildGeText() { if (grandExchangeText == null || grandExchangeItem == null || grandExchangeItem.isHidden()) { @@ -481,7 +490,6 @@ public class GrandExchangePlugin extends Plugin } final Widget geText = grandExchangeText; - final String geTextString = geText.getText(); final int itemId = grandExchangeItem.getItemId(); if (itemId == OFFER_DEFAULT_ITEM_ID || itemId == -1) @@ -490,39 +498,52 @@ public class GrandExchangePlugin extends Plugin return; } - if (config.enableGELimits() && itemGELimits != null && !geTextString.contains(BUY_LIMIT_GE_TEXT)) + String[] lines = geText.getText().split("
"); + String text = lines[0]; // remove any limit or OSB ge values + + if (config.enableGELimits() && itemGELimits != null) { final Integer itemLimit = itemGELimits.get(itemId); // If we have item buy limit, append it if (itemLimit != null) { - final String text = geText.getText() + BUY_LIMIT_GE_TEXT + QuantityFormatter.formatNumber(itemLimit); - geText.setText(text); + text += BUY_LIMIT_GE_TEXT + QuantityFormatter.formatNumber(itemLimit); } } - if (!config.enableOsbPrices() || geTextString.contains(OSB_GE_TEXT)) + geText.setText(text); + + if (!config.enableOsbPrices()) { - // OSB prices are disabled or price was already looked up, so no need to set it again return; } + // If we already have the result, use it + if (osbGrandExchangeResult != null && osbGrandExchangeResult.getItem_id() == itemId && osbGrandExchangeResult.getOverall_average() > 0) + { + geText.setText(text + OSB_GE_TEXT + QuantityFormatter.formatNumber(osbGrandExchangeResult.getOverall_average())); + } + + if (osbItem == itemId) + { + // avoid starting duplicate lookups + return; + } + + osbItem = itemId; + log.debug("Looking up OSB item price {}", itemId); + final String start = text; executorService.submit(() -> { - if (geText.getText().contains(OSB_GE_TEXT)) - { - // If there are multiple tasks queued and one of them have already added the price - return; - } - try { final OSBGrandExchangeResult result = CLIENT.lookupItem(itemId); - final String text = geText.getText() + OSB_GE_TEXT + QuantityFormatter.formatNumber(result.getOverall_average()); - geText.setText(text); + osbGrandExchangeResult = result; + // Update the text on the widget too + geText.setText(start + OSB_GE_TEXT + QuantityFormatter.formatNumber(result.getOverall_average())); } catch (IOException e) { From a980aa660ce0731ef62f99cdf4dbd6472a67ce2f Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Fri, 1 Nov 2019 07:43:48 +0100 Subject: [PATCH 134/185] Change rasterizer raw injector from depending on hardcoded values --- .../code/instructions/ArrayStore.java | 5 +- .../code/instructions/InvokeStatic.java | 2 +- .../runelite/asm/execution/MethodContext.java | 3 +- .../java/net/runelite/injector/Inject.java | 6 +- .../injector/raw/RasterizerAlpha.java | 268 +++++++++++++ .../runelite/injector/raw/RasterizerHook.java | 371 ------------------ 6 files changed, 274 insertions(+), 381 deletions(-) create mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerAlpha.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/ArrayStore.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/ArrayStore.java index 266cd7f1b1..7acb82c1e5 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/ArrayStore.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/ArrayStore.java @@ -52,8 +52,7 @@ public abstract class ArrayStore extends Instruction implements ArrayStoreInstru if (r.getInstruction() instanceof GetFieldInstruction) { GetFieldInstruction gf = (GetFieldInstruction) r.getInstruction(); - Field f = gf.getMyField(); - return f; + return gf.getMyField(); } return null; @@ -89,7 +88,7 @@ public abstract class ArrayStore extends Instruction implements ArrayStoreInstru Field f1 = gf1.getMyField(), f2 = gf2.getMyField(); - + assert MappingExecutorUtil.isMaybeEqual(f1, f2); if (f1 != null && f2 != null) diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java index f992fb6621..1ad5ea2088 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java @@ -86,7 +86,7 @@ public class InvokeStatic extends Instruction implements InvokeInstruction @SuppressWarnings("unchecked") public List getMethods() { - return myMethod != null ? Arrays.asList(myMethod) : Collections.EMPTY_LIST; + return myMethod != null ? Collections.singletonList(myMethod) : Collections.EMPTY_LIST; } @Override diff --git a/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java b/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java index e55d5e6aeb..4615200f72 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java +++ b/deobfuscator/src/main/java/net/runelite/asm/execution/MethodContext.java @@ -70,10 +70,9 @@ public class MethodContext return contexts.get(i); } - @SuppressWarnings("unchecked") public Collection getInstructionContexts() { - return (Collection) contexts.values(); + return contexts.values(); } public void reset() diff --git a/injector-plugin/src/main/java/net/runelite/injector/Inject.java b/injector-plugin/src/main/java/net/runelite/injector/Inject.java index 9d9b372f07..4a87466311 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/Inject.java +++ b/injector-plugin/src/main/java/net/runelite/injector/Inject.java @@ -49,7 +49,7 @@ import static net.runelite.injector.InjectUtil.getFieldType; import net.runelite.injector.raw.ClearColorBuffer; import net.runelite.injector.raw.DrawAfterWidgets; import net.runelite.injector.raw.Occluder; -import net.runelite.injector.raw.RasterizerHook; +import net.runelite.injector.raw.RasterizerAlpha; import net.runelite.injector.raw.RenderDraw; import net.runelite.injector.raw.ScriptVM; import net.runelite.mapping.Import; @@ -58,8 +58,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.runelite.injector.raw.HidePlayerAttacks; -// import net.runelite.injector.raw.DrawMenu; - public class Inject { public static final java.lang.Class CLIENT_CLASS = RSClient.class; @@ -207,7 +205,7 @@ public class Inject // Has to be done before mixins // well, can be done after really // but why do that when you can do it before - new RasterizerHook(this).inject(); + new RasterizerAlpha(this).inject(); // requires interfaces to be injected mixinInjector.inject(); diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerAlpha.java b/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerAlpha.java new file mode 100644 index 0000000000..724d5769eb --- /dev/null +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerAlpha.java @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2018, Lucas + * 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.injector.raw; + +import com.google.common.collect.Lists; +import net.runelite.asm.ClassFile; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.InstructionType; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instruction.types.FieldInstruction; +import net.runelite.asm.attributes.code.instruction.types.GetFieldInstruction; +import net.runelite.asm.attributes.code.instruction.types.LVTInstruction; +import net.runelite.asm.attributes.code.instruction.types.PushConstantInstruction; +import net.runelite.asm.attributes.code.instructions.GetStatic; +import net.runelite.asm.attributes.code.instructions.IALoad; +import net.runelite.asm.attributes.code.instructions.IAStore; +import net.runelite.asm.attributes.code.instructions.IAdd; +import net.runelite.asm.attributes.code.instructions.ILoad; +import net.runelite.asm.attributes.code.instructions.IOr; +import net.runelite.asm.attributes.code.instructions.IShR; +import net.runelite.asm.attributes.code.instructions.ISub; +import net.runelite.asm.attributes.code.instructions.IUShR; +import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.attributes.code.instructions.LDC; +import net.runelite.asm.attributes.code.instructions.SiPush; +import net.runelite.asm.execution.Execution; +import net.runelite.asm.execution.InstructionContext; +import net.runelite.asm.execution.MethodContext; +import net.runelite.asm.execution.StackContext; +import net.runelite.asm.execution.VariableContext; +import net.runelite.asm.pool.Class; +import net.runelite.asm.signature.Signature; +import net.runelite.injector.Inject; +import net.runelite.injector.InjectUtil; +import net.runelite.injector.InjectionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RasterizerAlpha +{ + private static final Logger logger = LoggerFactory.getLogger(RasterizerAlpha.class); + private static final net.runelite.asm.pool.Method DRAWALPHA = new net.runelite.asm.pool.Method( + new Class("client"), + "drawAlpha", + new Signature("([IIII)V") + ); + private static final int ALPHA = 0xff000000; + + private final Inject inject; + + public RasterizerAlpha(Inject inject) + { + this.inject = inject; + } + + /* + * This class exists cause of removing colour banding. + * + * Push array on stack + * Push array index on stack + * Push colour on stack -> we're interested in where the colour comes from + * Put colour in array, popping array, index and colour + * + * + * + */ + public void inject() throws InjectionException + { + final Field r2dPx = InjectUtil.findDeobField(inject, "Rasterizer2D_pixels", "Rasterizer2D"); + final Method draw = InjectUtil.findMethod(inject, "draw", "Client"); + final ClassFile rasterizer2D = r2dPx.getClassFile(); + final Execution ex = new Execution(rasterizer2D.getGroup()); + ex.staticStep = false; + ex.step = false; + ex.addMethod(draw); + + int[] counts = new int[2]; + + ex.addMethodContextVisitor((MethodContext mc) -> + { + Instructions instrs = getInstrs(mc); + if (instrs == null) + return; + + int count = 0; + int orCount = 0; + + for (InstructionContext ic : mc.getInstructionContexts()) + { + Instruction instruction = ic.getInstruction(); + if (!(instruction instanceof IAStore)) + continue; + + // Field field = astore.getMyField(ic); + // doesn't track into methods so doing it here + StackContext array = ic.getPops().get(2); + + if (!isSameField(r2dPx, array)) + continue; + + // This is the colour that's being set + StackContext colour = ic.getPops().get(0); + + // resolve gets the original value pusher + InstructionContext colPusher = colour.getPushed().resolve(colour); + Instruction colPushI = colPusher.getInstruction(); + + // If it's not a >> or a | we're not interested + if (colPushI instanceof LVTInstruction // when called from a method we didn't execute + || colPushI instanceof PushConstantInstruction && + !((PushConstantInstruction) colPushI).getConstant().equals(0) + || colPushI instanceof IALoad) + { + // OR with 0xFF000000, unless 0 + int storeIdx = instrs.getInstructions().indexOf(instruction); + + instrs.addInstruction(storeIdx++, new LDC(instrs, ALPHA)); + instrs.addInstruction(storeIdx, new IOr(instrs, InstructionType.IOR)); + ++orCount; + continue; + } + else if (!( + colPushI instanceof IShR || + colPushI instanceof IUShR || + colPushI instanceof IAdd)) + { + continue; + } + + // So we know we're dealing with alpha here, now we need the alpha value + // earlier on in the method there's been a 256 - XXX, where xxx is alpha + + for (InstructionContext ins : mc.getInstructionContexts()) + { + if (!(ins.getInstruction() instanceof SiPush)) + continue; + + SiPush pci = (SiPush) ins.getInstruction(); + if ((short) pci.getConstant() != (short) 256) + continue; + + InstructionContext isub = ins.getPushes().get(0).getPopped().get(0); + if (!(isub.getInstruction() instanceof ISub)) + continue; + + StackContext alphaPop = isub.getPops().get(0); + InstructionContext alphaPusher = alphaPop.getPushed().resolve(alphaPop); + InstructionContext isubResult = isub.getPushes().get(0).getPopped().get(0); + + if (pushesToSameField(isubResult, alphaPusher)) + { + alphaPusher = resolveFieldThroughInvokes(alphaPop); + + if (alphaPusher == null) + throw new RuntimeException("Alpha var is overwritten and we don't know what pushed it"); // cheeky unchecked + } + + int storeIdx = instrs.getInstructions().indexOf(instruction); + + Instruction alphaPushI = alphaPusher.getInstruction(); + if (alphaPushI instanceof GetStatic) + { + instrs.addInstruction(storeIdx++, new LDC(instrs, 255)); + instrs.addInstruction(storeIdx++, new GetStatic(instrs, ((GetStatic) alphaPushI).getField())); + instrs.addInstruction(storeIdx++, new ISub(instrs, InstructionType.ISUB)); + } + else if (alphaPushI instanceof LVTInstruction) + { + instrs.addInstruction(storeIdx++, new ILoad(instrs, ((LVTInstruction) alphaPushI).getVariableIndex())); + } + + instrs.getInstructions().set(storeIdx, new InvokeStatic(instrs, DRAWALPHA)); + ++count; + break; + } + } + + if (orCount != 0) + { + counts[0] += orCount; + logger.info("Added {} OR's into {}", orCount, mc.getMethod()); + } + if (count != 0) + { + counts[1] += count; + logger.info("Injected {} DrawAlpha invokes into {}", count, mc.getMethod()); + } + }); + + ex.run(); + logger.info("Injected {} DrawAlpha invokes and {} ors", counts[1], counts[0]); + } + + private static boolean pushesToSameField(InstructionContext cA, InstructionContext cB) + { + if (cA.getInstruction() instanceof FieldInstruction && cB instanceof FieldInstruction) + { + Field a = ((FieldInstruction) cA.getInstruction()).getMyField(); + Field b = ((FieldInstruction) cB.getInstruction()).getMyField(); + + return a == b; + } + + return false; + } + + private static Instructions getInstrs(MethodContext mc) + { + Code c = mc.getMethod().getCode(); + if (c == null) + return null; + + return c.getInstructions(); + } + + private static InstructionContext resolveFieldThroughInvokes(StackContext stackContext) + { + InstructionContext pusher = stackContext.getPushed().resolve(stackContext); + if (pusher.getInstruction() instanceof GetFieldInstruction) + return pusher; + + // No field I wanna trace, rn at least + if (!(pusher.getInstruction() instanceof LVTInstruction)) + return null; + + int vidx = ((LVTInstruction) pusher.getInstruction()).getVariableIndex(); + + VariableContext vc = pusher.getVariables().get(vidx); + stackContext = Lists.reverse(vc.getInstructionWhichStored().getPops()).get(vidx); + + return resolveFieldThroughInvokes(stackContext); + } + + private static boolean isSameField(Field f, StackContext array) + { + InstructionContext ic = resolveFieldThroughInvokes(array); + + if (ic == null) + return false; + + return ((GetFieldInstruction) ic.getInstruction()).getMyField() == f; + } +} diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java b/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java deleted file mode 100644 index df671fff40..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/RasterizerHook.java +++ /dev/null @@ -1,371 +0,0 @@ -package net.runelite.injector.raw; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.InstructionType; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instruction.types.LVTInstruction; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.ArrayStore; -import net.runelite.asm.attributes.code.instructions.GetField; -import net.runelite.asm.attributes.code.instructions.GetStatic; -import net.runelite.asm.attributes.code.instructions.IALoad; -import net.runelite.asm.attributes.code.instructions.IAStore; -import net.runelite.asm.attributes.code.instructions.ILoad; -import net.runelite.asm.attributes.code.instructions.IOr; -import net.runelite.asm.attributes.code.instructions.ISub; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.attributes.code.instructions.LDC; -import net.runelite.asm.execution.Execution; -import net.runelite.asm.execution.InstructionContext; -import net.runelite.asm.pool.Class; -import net.runelite.asm.signature.Signature; -import net.runelite.injector.Inject; -import static net.runelite.injector.InjectUtil.findDeobField; -import static net.runelite.injector.InjectUtil.findStaticMethod; -import net.runelite.injector.InjectionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RasterizerHook -{ - // TODO: Should probably make this better - private static final Logger logger = LoggerFactory.getLogger(ClearColorBuffer.class); - private static final int val = -16777216; - - private static final String font_alpha = "AbstractFont_placeGlyphAlpha"; - private static final String circle_alpha = "Rasterizer2D_drawCircleAlpha"; - private static final String line_alpha = "Rasterizer2D_drawHorizontalLineAlpha"; - private static final String line_alpha2 = "Rasterizer2D_drawVerticalLineAlpha"; - private static final String fill_rect_alpha = "Rasterizer2D_fillRectangleAlpha"; - private static final String r3d_vert = "Rasterizer3D_vertAlpha"; - private static final String r3d_horiz = "Rasterizer3D_horizAlpha"; - private static final String r3d_field = "Rasterizer3D_alpha"; - private static final String sprite_alpha1 = "Sprite_drawTransparent"; - private static final String sprite_alpha2 = "Sprite_drawTransScaled"; - - private static final String font = "AbstractFont_placeGlyph"; - private static final String rast3D = "Rasterizer3D_iDontKnow"; - private static final String rast3D2 = "Rasterizer3D_textureAlpha"; - private static final String sprite = "Sprite_draw"; - private static final String sprite2 = "Sprite_drawScaled"; - private static final String sprite3 = "Sprite_drawTransOverlay"; - private static final String sprite4 = "Sprite_drawTransBg"; - private static final String indexedSprite = "IndexedSprite_something"; - private static final String indexedSprite2 = "IndexedSprite_two"; - - private static final net.runelite.asm.pool.Method drawAlpha = new net.runelite.asm.pool.Method( - new Class("client"), - "drawAlpha", - new Signature("([IIII)V") - ); - private final Inject inject; - private int count; - - public RasterizerHook(Inject inject) - { - this.inject = inject; - } - - public void inject() throws InjectionException - { - runDrawAlpha(); - - logger.info("Injected {} drawAlpha's", count); - assert count == 35 : "Either too many or not enough drawAlpha's were injected"; - - count = 0; - - runVars(); - - run(); - } - - private void runDrawAlpha() throws InjectionException - { - runR3DAlpha(r3d_horiz, 15, r3d_field); - runR3DAlpha(r3d_vert, 12, r3d_field); - runFontAlpha(font_alpha, 1, 9); // speshul cause 255 - var9 - runAlpha(circle_alpha, 2, 4); - runAlpha(line_alpha, 1, 4); - runAlpha(line_alpha2, 1, 4); - runAlpha(fill_rect_alpha, 1, 5); - runAlpha(sprite_alpha1, 1, 9, 0); - runAlpha(sprite_alpha2, 1, 12, 0); - } - - private void runR3DAlpha(String methodName, int req, String fieldName) throws InjectionException - { - Method meth = findStaticMethod(inject, methodName); - Field field = findDeobField(inject, fieldName); - Instructions ins = meth.getCode().getInstructions(); - int varIdx = 0; // This is obviously dumb but I cba making this better - int added = 0; - - List indices = new ArrayList<>(); - for (Instruction i : meth.findLVTInstructionsForVariable(varIdx)) - { - indices.add(ins.getInstructions().indexOf(i)); - } - - if (indices.isEmpty()) - { - throw new InjectionException("Couldn't find hook location in " + methodName); - } - - for (int i : indices) - { - for (int codeIndex = i + added; codeIndex < ins.getInstructions().size(); codeIndex++) - { - if (ins.getInstructions().get(codeIndex) instanceof IAStore) - { - ins.getInstructions().set(codeIndex, new InvokeStatic(ins, drawAlpha)); - - ins.getInstructions().add(codeIndex, new ISub(ins, InstructionType.ISUB)); - ins.getInstructions().add(codeIndex, new GetStatic(ins, field.getPoolField())); - ins.getInstructions().add(codeIndex, new LDC(ins, 255)); - added++; - count++; - break; - } - } - } - } - - private void runAlpha(String methodName, int req, int extraArg) throws InjectionException - { - runAlpha(methodName, req, extraArg, -1); - } - - private void runAlpha(String methodName, int req, int extraArg, int varIndex) throws InjectionException - { - final net.runelite.asm.pool.Field pixels = findDeobField(inject, "Rasterizer2D_pixels").getPoolField(); - Method meth = findStaticMethod(inject, methodName); - if (meth == null) - { - throw new InjectionException(methodName + " couldnt be found"); - } - - Code code = meth.getCode(); - Instructions ins = code.getInstructions(); - int added = 0; - - List indices = new ArrayList<>(); - for (Instruction i : ins.getInstructions()) - { - if (!(i instanceof IALoad) && !(i instanceof GetField) && !(i instanceof ALoad)) - { - continue; - } - - if (i instanceof GetField) - { - if (((GetField) i).getField().equals(pixels)) - { - indices.add(ins.getInstructions().indexOf(i)); - } - } - else if ((i instanceof ALoad) && varIndex >= 0 && ((LVTInstruction) i).getVariableIndex() == varIndex) - { - indices.add(ins.getInstructions().indexOf(i)); - } - else if (varIndex == -1) - { - indices.add(ins.getInstructions().indexOf(i)); - } - } - - if (indices.isEmpty()) - { - throw new InjectionException("Couldn't find hook location in " + methodName); - } - - int oldCount = count; - - for (int i : indices) - { - for (int codeIndex = i + added; codeIndex < ins.getInstructions().size(); codeIndex++) - { - if (ins.getInstructions().get(codeIndex) instanceof IAStore) - { - ins.getInstructions().set(codeIndex, new InvokeStatic(ins, drawAlpha)); - if (extraArg != -1) - { - ins.getInstructions().add(codeIndex, new ILoad(ins, extraArg)); - added++; - } - count++; - break; - } - } - } - - if (count - oldCount > req) - { - throw new InjectionException("Too many drawAlpha's were injected into " + methodName); - } - } - - private void runFontAlpha(String methodName, int req, int extraArg) throws InjectionException - { - Method meth = findStaticMethod(inject, methodName); - Instructions ins = meth.getCode().getInstructions(); - int varIdx = 0; // This is obviously dumb but I cba making this better - int added = 0; - - List indices = new ArrayList<>(); - for (Instruction i : meth.findLVTInstructionsForVariable(varIdx)) - { - indices.add(ins.getInstructions().indexOf(i)); - } - - if (indices.isEmpty()) - { - throw new InjectionException("Couldn't find hook location in " + methodName); - } - - int oldCount = count; - - for (int i : indices) - { - for (int codeIndex = i + added; codeIndex < ins.getInstructions().size(); codeIndex++) - { - if (ins.getInstructions().get(codeIndex) instanceof IAStore) - { - ins.getInstructions().set(codeIndex, new InvokeStatic(ins, drawAlpha)); - - ins.getInstructions().add(codeIndex, new ISub(ins, InstructionType.ISUB)); - ins.getInstructions().add(codeIndex, new ILoad(ins, extraArg)); - ins.getInstructions().add(codeIndex, new LDC(ins, 255)); - added++; - count++; - break; - } - } - } - - if (count - req != oldCount) - { - throw new InjectionException(req != oldCount ? req > count - oldCount ? "Not enough" : "Too many" : "No" + " drawAlpha's were injected into " + methodName); - } - } - - private void runVars() throws InjectionException - { - runOnMethodWithVar(rast3D, 0); - runOnMethodWithVar(rast3D2, 0); - // 36 expected - runOnMethodWithVar(font, 0); - // 5 expected - runOnMethodWithVar(sprite, 1); - runOnMethodWithVar(sprite2, 0); - runOnMethodWithVar(sprite3, 0); - runOnMethodWithVar(sprite4, 0); - // 12 expected - runOnMethodWithVar(indexedSprite, 0); - runOnMethodWithVar(indexedSprite2, 0); - // 6 expected - } - - private void run() throws InjectionException - { - final int startCount = count; // Cause you can't just count shit ty - final net.runelite.asm.pool.Field pixels = findDeobField(inject, "Rasterizer2D_pixels").getPoolField(); - - Execution ex = new Execution(inject.getVanilla()); - ex.populateInitialMethods(); - - Set done = new HashSet<>(); - ex.addExecutionVisitor((InstructionContext ic) -> - { - Instruction i = ic.getInstruction(); - Instructions ins = i.getInstructions(); - Code code = ins.getCode(); - Method method = code.getMethod(); - //logger.debug(i.toString()); - - if (!(i instanceof IAStore)) - { - return; - } - - if (!done.add(i)) - { - return; - } - - ArrayStore as = (ArrayStore) i; - Field fieldBeingSet = as.getMyField(ic); - - if (fieldBeingSet == null) - { - return; - } - - if (!fieldBeingSet.getPoolField().equals(pixels)) - { - return; - } - - int index = ins.getInstructions().indexOf(i); - - if (!(ins.getInstructions().get(index - 1) instanceof ILoad) && !ic.getPops().get(0).getValue().isUnknownOrNull()) - { - if ((int) ic.getPops().get(0).getValue().getValue() == 0) - { - logger.debug("Didn't add hook in method {}.{}. {} added, {} total, value 0", method.getClassFile().getClassName(), method.getName(), count - startCount, count); - return; - } - } - - ins.getInstructions().add(index, new IOr(ins, InstructionType.IOR)); // Add instructions backwards - ins.getInstructions().add(index, new LDC(ins, val)); - count++; - logger.debug("Added hook in method {}.{}. {} added, {} total", method.getClassFile().getClassName(), method.getName(), count - startCount, count); - }); - - ex.run(); - } - - private void runOnMethodWithVar(String meth, int varIndex) throws InjectionException - { - Method method = findStaticMethod(inject, meth); - - Instructions ins = method.getCode().getInstructions(); - List indices = new ArrayList<>(); - - for (Instruction i : method.findLVTInstructionsForVariable(varIndex)) - { - int index = ins.getInstructions().indexOf(i); - - assert index != -1; - assert ins.getInstructions().get(index + 1) instanceof ILoad; // Index in the array - - indices.add(index); - } - - int added = 0; - for (int i : indices) - { - for (int codeIndex = i + added; codeIndex < ins.getInstructions().size(); codeIndex++) - { - if (ins.getInstructions().get(codeIndex) instanceof IAStore) - { - added += 2; - count++; - ins.addInstruction(codeIndex, new IOr(ins, InstructionType.IOR)); // Add instructions backwards - ins.addInstruction(codeIndex, new LDC(ins, val)); - break; - } - } - } - - logger.info("Added {} instructions in {}. {} total", added >>> 1, meth, count); - } -} From e8f49ea27bf5706da2bceb48ec4836d7927b80e6 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Fri, 1 Nov 2019 07:53:04 +0100 Subject: [PATCH 135/185] checkstyle --- .../runelite/asm/attributes/code/instructions/InvokeStatic.java | 1 - 1 file changed, 1 deletion(-) diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java index 1ad5ea2088..7d01d0d38c 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeStatic.java @@ -24,7 +24,6 @@ */ package net.runelite.asm.attributes.code.instructions; -import java.util.Arrays; import java.util.Collections; import java.util.List; import net.runelite.asm.ClassFile; From 047f5fe371e0e4f8619a13f88361a18245f6c365 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 1 Nov 2019 08:54:50 +0100 Subject: [PATCH 136/185] Update Dependencies.kt --- buildSrc/src/main/kotlin/Dependencies.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index c8d7b375c6..f3bc0f0c3d 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -26,7 +26,7 @@ const val kotlinVersion = "1.3.50" object ProjectVersions { - const val launcherVersion = "2.0.3" + const val launcherVersion = "2.0.4" const val rlVersion = "1.5.39-SNAPSHOT" const val openosrsVersion = "2.1.9.0" @@ -190,4 +190,4 @@ object Libraries { const val substance = "net.runelite.pushingpixels:substance:${Versions.substance}" const val trident = "net.runelite.pushingpixels:trident:${Versions.trident}" const val vanilla = "net.runelite.rs:vanilla:${ProjectVersions.rsversion}" -} \ No newline at end of file +} From 5fd7a2ad3e0e7fc772bd14a1d8a209d469cfc47e Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Fri, 1 Nov 2019 09:05:12 +0100 Subject: [PATCH 137/185] fix floating people --- runescape-api/src/main/java/net/runelite/rs/api/RSClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b755d8ef93..a726a2a385 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 @@ -907,7 +907,7 @@ public interface RSClient extends RSGameShell, Client @Import("Scene_cameraYTile") void setScreenCenterZ(int screenCenterZ); // <-- This is correct! - @Import("Client_plane") + @Import("Scene_plane") void setScenePlane(int scenePlane); @Import("Scene_cameraXTileMin") From ddae743f489edbb5365fb6403fcf7b7cb4fa6856 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 1 Nov 2019 09:09:58 +0100 Subject: [PATCH 138/185] mixins: checkstyle --- .../src/main/java/net/runelite/mixins/RSBufferMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java index a7fe725888..550361ee7b 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSBufferMixin.java @@ -26,7 +26,6 @@ package net.runelite.mixins; import java.math.BigInteger; import net.runelite.api.mixins.Copy; -import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; From ec0858548ff52986a0e84706472b85180df22ac1 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 1 Nov 2019 10:14:44 -0400 Subject: [PATCH 139/185] container calculation: fix overflow computing ge price --- .../runelite/client/plugins/bank/ContainerCalculation.java | 2 +- .../client/plugins/bank/ContainerCalculationTest.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/ContainerCalculation.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/ContainerCalculation.java index d78298b213..ca383bc81a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/ContainerCalculation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/ContainerCalculation.java @@ -86,7 +86,7 @@ class ContainerCalculation final long storePrice = itemManager.getItemComposition(id).getPrice(); final long alchPrice = (long) (storePrice * Constants.HIGH_ALCHEMY_MULTIPLIER); alch += alchPrice * qty; - ge += itemManager.getItemPrice(id) * qty; + ge += (long) itemManager.getItemPrice(id) * qty; break; } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java index ca52a5bff2..1f220f4b64 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/bank/ContainerCalculationTest.java @@ -81,11 +81,13 @@ public class ContainerCalculationTest .thenReturn(7); // 7 * .6 = 4, 4 * 1m overflows when(itemManager.getItemComposition(ItemID.ABYSSAL_WHIP)) .thenReturn(whipComp); + when(itemManager.getItemPrice(ItemID.ABYSSAL_WHIP)) + .thenReturn(3); // 1b * 3 overflows final ContainerPrices prices = containerCalculation.calculate(items); assertNotNull(prices); - long value = prices.getHighAlchPrice(); - assertTrue(value > Integer.MAX_VALUE); + assertTrue(prices.getHighAlchPrice() > Integer.MAX_VALUE); + assertTrue(prices.getGePrice() > Integer.MAX_VALUE); } } From 789e41c30f24b32c20b6a97d31df2cc85f1653e5 Mon Sep 17 00:00:00 2001 From: OpenOSRS Date: Sat, 2 Nov 2019 00:15:49 +0000 Subject: [PATCH 140/185] project: Update gradle wrapper --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3a54a3332e..0ebb3108e2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From bb179f07c776bf9fb9cb3444d85cd6ae0ec0147c Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 2 Nov 2019 04:34:45 +0100 Subject: [PATCH 141/185] gradle: Bootstrap plugin --- build.gradle.kts | 1 - buildSrc/build.gradle.kts | 1 + buildSrc/src/main/kotlin/BootstrapPlugin.kt | 87 ++++++++++++++++ buildSrc/src/main/kotlin/BootstrapTask.kt | 101 +++++++++++++++++++ buildSrc/src/main/kotlin/FernflowerPlugin.kt | 4 +- buildSrc/src/main/kotlin/FernflowerTask.kt | 6 +- buildSrc/src/main/kotlin/JsonBuilder.kt | 55 ++++++++++ injected-client/injected-client.gradle.kts | 3 + runelite-client/runelite-client.gradle.kts | 10 +- 9 files changed, 255 insertions(+), 13 deletions(-) create mode 100644 buildSrc/src/main/kotlin/BootstrapPlugin.kt create mode 100644 buildSrc/src/main/kotlin/BootstrapTask.kt create mode 100644 buildSrc/src/main/kotlin/JsonBuilder.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4469cd42e7..0ecb568649 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -74,7 +74,6 @@ subprojects { apply() apply() apply(plugin = Plugins.testLogger.first) - apply() if (this.name != "rs-client") apply(plugin = "checkstyle") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 96df5cfa5f..00e689a37d 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -35,6 +35,7 @@ repositories { dependencies { implementation(gradleApi()) implementation(group = "net.runelite", name = "fernflower", version = "07082019") + implementation(group = "org.json", name = "json", version = "20190722") } kotlinDslPluginOptions { diff --git a/buildSrc/src/main/kotlin/BootstrapPlugin.kt b/buildSrc/src/main/kotlin/BootstrapPlugin.kt new file mode 100644 index 0000000000..ff90211c7f --- /dev/null +++ b/buildSrc/src/main/kotlin/BootstrapPlugin.kt @@ -0,0 +1,87 @@ +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.register +import java.io.File + +class BootstrapPlugin : Plugin { + override fun apply(project: Project) { + project.tasks.register("bootstrapStaging") { + dependsOn("jar") + dependsOn("shadowJar") + + type = "staging" + clientJar = project.tasks["jar"].outputs.files.singleFile + + dependsOn(project.parent!!.project(":runelite-api").tasks["jar"]) + dependsOn(project.parent!!.project(":runescape-api").tasks["jar"]) + dependsOn(project.parent!!.project(":http-api").tasks["jar"]) + dependsOn(project.parent!!.project(":injected-client").tasks["jar"]) + + doLast { + + project.copy { + from(project.tasks["jar"]) + from(project.parent!!.project(":runelite-api").tasks["jar"]) + from(project.parent!!.project(":runescape-api").tasks["jar"]) + from(project.parent!!.project(":http-api").tasks["jar"]) + from(project.parent!!.project(":injected-client").tasks["jar"]) + + into("${project.buildDir}/bootstrap/${type}/") + } + } + } + + project.tasks.register("bootstrapStable") { + dependsOn("jar") + dependsOn("shadowJar") + + type = "stable" + clientJar = project.tasks["jar"].outputs.files.singleFile + + dependsOn(project.parent!!.project(":runelite-api").tasks["jar"]) + dependsOn(project.parent!!.project(":runescape-api").tasks["jar"]) + dependsOn(project.parent!!.project(":http-api").tasks["jar"]) + dependsOn(project.parent!!.project(":injected-client").tasks["jar"]) + + doLast { + + project.copy { + from(project.tasks["jar"]) + from(project.parent!!.project(":runelite-api").tasks["jar"]) + from(project.parent!!.project(":runescape-api").tasks["jar"]) + from(project.parent!!.project(":http-api").tasks["jar"]) + from(project.parent!!.project(":injected-client").tasks["jar"]) + + into("${project.buildDir}/bootstrap/${type}/") + } + } + } + + project.tasks.register("bootstrapNightly") { + dependsOn("jar") + dependsOn("shadowJar") + + type = "nightly" + clientJar = project.tasks["jar"].outputs.files.singleFile + + dependsOn(project.parent!!.project(":runelite-api").tasks["jar"]) + dependsOn(project.parent!!.project(":runescape-api").tasks["jar"]) + dependsOn(project.parent!!.project(":http-api").tasks["jar"]) + dependsOn(project.parent!!.project(":injected-client").tasks["jar"]) + + doLast { + + project.copy { + from(project.tasks["jar"]) + from(project.parent!!.project(":runelite-api").tasks["jar"]) + from(project.parent!!.project(":runescape-api").tasks["jar"]) + from(project.parent!!.project(":http-api").tasks["jar"]) + from(project.parent!!.project(":injected-client").tasks["jar"]) + + into("${project.buildDir}/bootstrap/${type}/") + } + } + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/BootstrapTask.kt b/buildSrc/src/main/kotlin/BootstrapTask.kt new file mode 100644 index 0000000000..1e09a65c79 --- /dev/null +++ b/buildSrc/src/main/kotlin/BootstrapTask.kt @@ -0,0 +1,101 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.get +import java.io.File +import java.security.MessageDigest + +open class BootstrapTask : DefaultTask() { + + @Input + @Optional + var type: String? = "stable" + + @InputFile + @PathSensitive(PathSensitivity.ABSOLUTE) + var clientJar: File? = null + + @Input + val launcherJvm11Arguments = arrayOf("-XX:+DisableAttachMechanism", "-Drunelite.launcher.nojvm=true", "-Xmx512m", "-Xss2m", "-XX:CompileThreshold=1500", "-Djna.nosys=true") + + @Input + val launcherArguments = arrayOf("-XX:+DisableAttachMechanism", "-Drunelite.launcher.nojvm=true", "-Xmx512m", "-Xss2m", "-XX:CompileThreshold=1500", "-Xincgc", "-XX:+UseConcMarkSweepGC", "-XX:+UseParNewGC", "-Djna.nosys=true") + + @Input + val clientJvmArguments = arrayOf("-XX:+DisableAttachMechanism", "-Xmx512m", "-Xss2m", "-XX:CompileThreshold=1500", "-Xincgc", "-XX:+UseConcMarkSweepGC", "-XX:+UseParNewGC", "-Djna.nosys=true") + + @Input + val clientJvm9Arguments = arrayOf("-XX:+DisableAttachMechanism", "-Xmx512m", "-Xss2m", "-XX:CompileThreshold=1500", "-Djna.nosys=true") + + private fun hash(file: ByteArray): String { + return MessageDigest.getInstance("SHA-256").digest(file).fold("", { str, it -> str + "%02x".format(it) }) + } + + private fun getArtifacts(): Array { + val artifacts = ArrayList() + + project.configurations["runtimeClasspath"].resolvedConfiguration.resolvedArtifacts.forEach { + val module = it.moduleVersion.id.toString() + + val name = module.split(":")[1] + val group = module.split(":")[0] + val version = module.split(":")[2] + var path = "" + + if (it.file.name.contains(ProjectVersions.rlVersion)) { + path = "https://github.com/open-osrs/hosting/raw/master/${type}/${it.file.name}" + } else if (!group.contains("runelite")) { + path = "https://repo.maven.apache.org/maven2/" + group.replace(".", "/") + "/${name}/$version/${name}-$version" + if (it.classifier != null && it.classifier != "no_aop") { + path += "-${it.classifier}" + } + path += ".jar" + } else if (it.file.name.contains("trident") || it.file.name.contains("discord") || it.file.name.contains("substance")) { + path = "https://repo.runelite.net/net/runelite/" + if (!it.file.name.contains("discord")) { + path += "pushingpixels/" + } + path += "${name}/$version/${name}-$version.jar" + } + + val artifactFile = File(it.file.absolutePath) + + artifacts.add(JsonBuilder( + "name" to it.file.name, + "path" to path, + "size" to artifactFile.length(), + "hash" to hash(artifactFile.readBytes()) + )) + } + + artifacts.add(JsonBuilder( + "name" to clientJar!!.name, + "path" to "https://github.com/open-osrs/hosting/raw/master/${type}/${clientJar!!.name}", + "size" to clientJar!!.length(), + "hash" to hash(clientJar!!.readBytes()) + )) + + return artifacts.toTypedArray() + } + + @TaskAction + fun boostrap() { + val json = JsonBuilder( + "projectVersion" to ProjectVersions.openosrsVersion, + "minimumLauncherVersion" to ProjectVersions.launcherVersion, + "launcherJvm11Arguments" to launcherJvm11Arguments, + "launcherArguments" to launcherArguments, + "clientJvmArguments" to clientJvmArguments, + "clientJvm9Arguments" to clientJvm9Arguments, + "buildCommit" to project.extra["gitCommit"], + "artifacts" to getArtifacts() + ).toString() + + project.file("${project.buildDir}/bootstrap/bootstrap-${type}.json").writeText(json) + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/FernflowerPlugin.kt b/buildSrc/src/main/kotlin/FernflowerPlugin.kt index 36c5778d04..d1cf9ebb94 100644 --- a/buildSrc/src/main/kotlin/FernflowerPlugin.kt +++ b/buildSrc/src/main/kotlin/FernflowerPlugin.kt @@ -1,10 +1,12 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.StopExecutionException +import org.gradle.api.tasks.diagnostics.DependencyReportTask +import org.gradle.kotlin.dsl.register class FernflowerPlugin : Plugin { override fun apply(project: Project) { - project.tasks.create("decompile", FernflowerTask::class.java).run { + project.tasks.register("decompile") { dependsOn(project.tasks.getByName("jar")) doFirst { diff --git a/buildSrc/src/main/kotlin/FernflowerTask.kt b/buildSrc/src/main/kotlin/FernflowerTask.kt index b178b89789..cdf76679c8 100644 --- a/buildSrc/src/main/kotlin/FernflowerTask.kt +++ b/buildSrc/src/main/kotlin/FernflowerTask.kt @@ -26,12 +26,10 @@ open class FernflowerTask: DefaultTask() { @InputFile @PathSensitive(PathSensitivity.ABSOLUTE) - var getInputJar = project.file(inputJar ?: project.buildDir.toString() + "/libs/" + project.name + '-' - + project.version + ".jar") + var getInputJar = project.file(inputJar ?: "${project.buildDir}/libs/${project.name}-${project.version}.jar") @OutputDirectory - @PathSensitive(PathSensitivity.ABSOLUTE) - var getOutputDir = project.file(outputDir ?: project.buildDir.toString() + "/decompiled-sources") + var getOutputDir = project.file(outputDir ?: "${project.buildDir}/decompiled-sources") @TaskAction diff --git a/buildSrc/src/main/kotlin/JsonBuilder.kt b/buildSrc/src/main/kotlin/JsonBuilder.kt new file mode 100644 index 0000000000..51a90ade36 --- /dev/null +++ b/buildSrc/src/main/kotlin/JsonBuilder.kt @@ -0,0 +1,55 @@ +import org.json.JSONArray +import org.json.JSONObject + +class JsonBuilder() { + private var json = JSONObject() + + constructor(vararg pairs: Pair) : this() { + add(*pairs) + } + + fun add(vararg pairs: Pair) { + for ((key, value) in pairs) { + when (value) { + is Boolean -> json.put(key, value) + is Number -> add(key, value) + is String -> json.put(key, value) + is JsonBuilder -> json.put(key, value.json) + is Array<*> -> add(key, value) + is JSONObject -> json.put(key, value) + is JSONArray -> json.put(key, value) + } + } + } + + fun add(key: String, value: Number): JsonBuilder { + when (value) { + is Int -> json.put(key, value) + is Long -> json.put(key, value) + is Float -> json.put(key, value) + is Double -> json.put(key, value) + else -> {} + } + + return this + } + + fun add(key: String, items: Array): JsonBuilder { + val jsonArray = JSONArray() + items.forEach { + when (it) { + is String,is Long,is Int, is Boolean -> jsonArray.put(it) + is JsonBuilder -> jsonArray.put(it.json) + else -> try {jsonArray.put(it)} catch (ignored:Exception) { + + } + } + } + + json.put(key, jsonArray) + + return this + } + + override fun toString() = json.toString() +} \ No newline at end of file diff --git a/injected-client/injected-client.gradle.kts b/injected-client/injected-client.gradle.kts index a736dab534..41b48b47f1 100644 --- a/injected-client/injected-client.gradle.kts +++ b/injected-client/injected-client.gradle.kts @@ -24,8 +24,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +apply() + description = "Injected Client" + tasks { compileJava { dependsOn(":injector-plugin:assemble") diff --git a/runelite-client/runelite-client.gradle.kts b/runelite-client/runelite-client.gradle.kts index 27f6e1cefa..61969b357b 100644 --- a/runelite-client/runelite-client.gradle.kts +++ b/runelite-client/runelite-client.gradle.kts @@ -38,6 +38,9 @@ plugins { java } + +apply() + description = "RuneLite Client" dependencies { @@ -110,11 +113,6 @@ fun formatDate(date: Date?) = with(date ?: Date()) { } tasks { - register("dependencyReportFile") { - outputFile = file("dependencies.txt") - setConfiguration("runtimeClasspath") - } - build { finalizedBy("shadowJar") } @@ -144,8 +142,6 @@ tasks { } shadowJar { - dependsOn("dependencyReportFile") - archiveClassifier.set("shaded") exclude("net/runelite/injector/**") From 529a10f786b9a97fc1a9d91f0bee4f7bd544277e Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 2 Nov 2019 05:43:12 +0100 Subject: [PATCH 142/185] gradle: Create bootstrap dir before writing --- buildSrc/src/main/kotlin/BootstrapTask.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/BootstrapTask.kt b/buildSrc/src/main/kotlin/BootstrapTask.kt index 1e09a65c79..a6e0652cea 100644 --- a/buildSrc/src/main/kotlin/BootstrapTask.kt +++ b/buildSrc/src/main/kotlin/BootstrapTask.kt @@ -96,6 +96,11 @@ open class BootstrapTask : DefaultTask() { "artifacts" to getArtifacts() ).toString() - project.file("${project.buildDir}/bootstrap/bootstrap-${type}.json").writeText(json) + val bootstrapDir = File("${project.buildDir}/bootstrap") + bootstrapDir.mkdirs() + + File(bootstrapDir, "bootstrap-${type}.json").printWriter().use { out -> + out.println(json) + } } } \ No newline at end of file From c13511a6ba371f51022df32154f187a2aa2426a8 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 2 Nov 2019 06:27:44 +0100 Subject: [PATCH 143/185] actions: Fix --- .github/workflows/pr.yml | 43 ++++++++++++++++++---- .github/workflows/{build.yml => push.yml} | 44 ++++------------------- .github/workflows/scraper.yml | 2 +- 3 files changed, 44 insertions(+), 45 deletions(-) rename .github/workflows/{build.yml => push.yml} (56%) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9a5991ea50..cd8a8df639 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,11 +1,19 @@ -name: OpenOSRS - CI (push) +name: OpenOSRS - CI (PR) -on: - push: - branches: - - master +on: pull_request jobs: + pr-lint: + name: PR title + runs-on: ubuntu-latest + + steps: + - name: PR title lint + if: github.event_name == 'pull_request' + uses: seferov/pr-lint-action@master + with: + title-regex: '^([\w-/]+): \w+' + build: runs-on: ubuntu-latest name: Build @@ -55,4 +63,27 @@ jobs: - name: Assembling run: ./gradlew assemble --console=plain - name: Checking code conventions - run: ./gradlew checkstyleMain --console=plain \ No newline at end of file + run: ./gradlew checkstyleMain --console=plain + + approve: + name: Approve + needs: [build, test, checkstyle] + runs-on: ubuntu-latest + + steps: + - name: Approve pull request + if: github.event_name == 'pull_request' && github.actor == 'OpenOSRS' + uses: hmarr/auto-approve-action@v2.0.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + merge: + name: Merge + needs: approve + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - uses: maxkomarychev/merge-pal-action@v0.1.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/push.yml similarity index 56% rename from .github/workflows/build.yml rename to .github/workflows/push.yml index 0c57b34b2c..9a5991ea50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/push.yml @@ -1,19 +1,11 @@ -name: OpenOSRS - CI (PR) +name: OpenOSRS - CI (push) -on: pull_request +on: + push: + branches: + - master jobs: - pr-lint: - name: PR title - runs-on: ubuntu-latest - - steps: - - name: PR title lint - if: github.event_name == 'pull_request' - uses: seferov/pr-lint-action@master - with: - title-regex: '^([\w-/]+): \w+' - build: runs-on: ubuntu-latest name: Build @@ -63,28 +55,4 @@ jobs: - name: Assembling run: ./gradlew assemble --console=plain - name: Checking code conventions - run: ./gradlew checkstyleMain --console=plain - - approve: - name: Approve - needs: [build, test, checkstyle] - runs-on: ubuntu-latest - - steps: - - name: Approve pull request - if: github.event_name == 'pull_request' && github.actor == 'OpenOSRS' - uses: hmarr/auto-approve-action@v2.0.0 - with: - github-token: "${{ secrets.GITHUB_TOKEN }}" - - automerge: - name: Automerge - needs: approve - runs-on: ubuntu-latest - - steps: - - name: automerge - uses: pascalgn/automerge-action@f84dd310ea4a19890c70a4ff11ab282a872fb94b - env: - AUTOMERGE: "automated pull request" - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" \ No newline at end of file + run: ./gradlew checkstyleMain --console=plain \ No newline at end of file diff --git a/.github/workflows/scraper.yml b/.github/workflows/scraper.yml index 591bbd73f6..762e79bb67 100644 --- a/.github/workflows/scraper.yml +++ b/.github/workflows/scraper.yml @@ -25,7 +25,7 @@ jobs: - name: Building scraper run: ./gradlew :wiki-scraper:build --console=plain - name: Downloading jagex cache - run: ./gradlew :cache-client:update --console=plain + run: ./gradlew :cache-client:download --console=plain - name: Scraping NPC stats run: ./gradlew :wiki-scraper:npcStatsScrape --console=plain - name: Create NPC stats Pull Request From 866659e653d6d97844843ef53b8e197fb532a041 Mon Sep 17 00:00:00 2001 From: benjaminlgur Date: Sat, 2 Nov 2019 01:57:06 -0400 Subject: [PATCH 144/185] woodcutting: added gpearned for woodcutting --- .../woodcutting/WoodcuttingConfig.java | 11 ++++ .../woodcutting/WoodcuttingOverlay.java | 8 +++ .../woodcutting/WoodcuttingPlugin.java | 61 +++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java index 55cb5e3637..4c58fe4369 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingConfig.java @@ -74,4 +74,15 @@ public interface WoodcuttingConfig extends Config { return true; } + + @ConfigItem( + position = 5, + keyName = "showGPEarned", + name = "Show GP earned", + description = "Configures whether to show amount of gp earned by chopping trees" + ) + default boolean showGPEarned() + { + return false; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java index 9bb29e9824..a7408d5ea3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java @@ -42,6 +42,7 @@ import net.runelite.client.ui.overlay.components.TitleComponent; import net.runelite.client.ui.overlay.components.table.TableAlignment; import net.runelite.client.ui.overlay.components.table.TableComponent; + @Singleton class WoodcuttingOverlay extends Overlay { @@ -50,6 +51,7 @@ class WoodcuttingOverlay extends Overlay private final XpTrackerService xpTrackerService; private final PanelComponent panelComponent = new PanelComponent(); + @Inject private WoodcuttingOverlay(final Client client, final WoodcuttingPlugin plugin, final XpTrackerService xpTrackerService) { @@ -101,6 +103,11 @@ class WoodcuttingOverlay extends Overlay { tableComponent.addRow("Logs cut:", Integer.toString(actions)); + if (plugin.isShowGPEarned()) + { + tableComponent.addRow("GP earned", Integer.toString((plugin.getGpEarned()))); + } + if (actions > 2) { tableComponent.addRow("Logs/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING))); @@ -112,4 +119,5 @@ class WoodcuttingOverlay extends Overlay return panelComponent.render(graphics); } + } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java index 7bc066283c..3ad7a7fe84 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java @@ -37,6 +37,8 @@ import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.GameState; +import net.runelite.api.Item; +import net.runelite.api.ItemID; import net.runelite.api.Player; import net.runelite.api.events.AnimationChanged; import net.runelite.api.events.ChatMessage; @@ -49,6 +51,7 @@ import net.runelite.api.events.GameTick; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; +import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDependency; import net.runelite.client.plugins.PluginDescriptor; @@ -82,6 +85,9 @@ public class WoodcuttingPlugin extends Plugin @Inject private WoodcuttingConfig config; + @Inject + private ItemManager itemManager; + @Inject private EventBus eventBus; @@ -100,6 +106,12 @@ public class WoodcuttingPlugin extends Plugin private boolean showWoodcuttingStats; @Getter(AccessLevel.PACKAGE) private boolean showRedwoodTrees; + @Getter(AccessLevel.PACKAGE) + private boolean showGPEarned; + + private int treeTypeID; + @Getter(AccessLevel.PACKAGE) + private int gpEarned; @Provides WoodcuttingConfig getConfig(ConfigManager configManager) @@ -167,9 +179,13 @@ public class WoodcuttingPlugin extends Plugin if (session == null) { session = new WoodcuttingSession(); + gpEarned = 0; } session.setLastLogCut(); + + typeOfLogCut(event); + gpEarned = gpEarned + itemManager.getItemPrice(treeTypeID); } if (event.getMessage().contains("A bird's nest falls out of the tree") && this.showNestNotification) @@ -179,6 +195,50 @@ public class WoodcuttingPlugin extends Plugin } } + private void typeOfLogCut(ChatMessage event) + { + if (event.getMessage().contains("mushrooms.")) + { + return; //TO DO Add valuation for scullicep mushroom cutting. + } + else if (event.getMessage().contains("oak")) + { + treeTypeID = ItemID.OAK_LOGS; + } + else if (event.getMessage().contains("willow")) + { + treeTypeID = ItemID.WILLOW_LOGS; + } + else if (event.getMessage().contains("yew")) + { + treeTypeID = ItemID.YEW_LOGS; + } + else if (event.getMessage().contains("redwood")) + { + treeTypeID = ItemID.REDWOOD_LOGS; + } + else if (event.getMessage().contains("magic")) + { + treeTypeID = ItemID.MAGIC_LOGS; + } + else if (event.getMessage().contains("teak")) + { + treeTypeID = ItemID.TEAK_LOGS; + } + else if (event.getMessage().contains("mahogany")) + { + treeTypeID = ItemID.MAHOGANY_LOGS; + } + else if (event.getMessage().contains("maple")) + { + treeTypeID = ItemID.MAPLE_LOGS; + } + else + { + treeTypeID = ItemID.LOGS; + } + } + private void onGameObjectSpawned(final GameObjectSpawned event) { GameObject gameObject = event.getGameObject(); @@ -241,5 +301,6 @@ public class WoodcuttingPlugin extends Plugin this.showNestNotification = config.showNestNotification(); this.showWoodcuttingStats = config.showWoodcuttingStats(); this.showRedwoodTrees = config.showRedwoodTrees(); + this.showGPEarned = config.showGPEarned(); } } \ No newline at end of file From 13e280e6ae7bd1989941005c519a2d4f3c9b56c4 Mon Sep 17 00:00:00 2001 From: benjaminlgur Date: Sat, 2 Nov 2019 02:08:23 -0400 Subject: [PATCH 145/185] checkstyle fix --- .../runelite/client/plugins/woodcutting/WoodcuttingPlugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java index 3ad7a7fe84..e9bd610e38 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java @@ -37,7 +37,6 @@ import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.GameState; -import net.runelite.api.Item; import net.runelite.api.ItemID; import net.runelite.api.Player; import net.runelite.api.events.AnimationChanged; From 856e37bec4c66defcca2f997486abdfc287c92be Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 2 Nov 2019 12:01:58 +0100 Subject: [PATCH 146/185] actions: merge --- .github/workflows/gradle.yml | 4 ++-- .github/workflows/merge.yml | 20 ++++++++++++++++++++ .github/workflows/pr.yml | 13 +------------ .github/workflows/scraper.yml | 2 +- 4 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/merge.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index b478c70501..f16ec08572 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -22,7 +22,7 @@ jobs: PULL_REQUEST_TITLE: 'project: Update gradle wrapper' PULL_REQUEST_BODY: This is an auto-generated PR with an updated gradle version COMMIT_MESSAGE: 'project: Update gradle wrapper' - PULL_REQUEST_LABELS: automated pull request, gradle + PULL_REQUEST_LABELS: automated-pull-request, gradle update-dependencies: runs-on: ubuntu-latest @@ -41,4 +41,4 @@ jobs: PULL_REQUEST_TITLE: 'project: Update gradle dependencies' PULL_REQUEST_BODY: This is an auto-generated PR with an updated gradle dependencies versions COMMIT_MESSAGE: 'project: Update gradle dependencies' - PULL_REQUEST_LABELS: automated pull request, gradle \ No newline at end of file + PULL_REQUEST_LABELS: automated-pull-request, gradle \ No newline at end of file diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml new file mode 100644 index 0000000000..343a3f14e7 --- /dev/null +++ b/.github/workflows/merge.yml @@ -0,0 +1,20 @@ +name: OpenOSRS - Auto merge + +on: + pull_request_review: + types: + - submitted + +jobs: + automerge: + name: Auto merge + runs-on: ubuntu-latest + + steps: + - name: automerge + uses: pascalgn/automerge-action@f84dd310ea4a19890c70a4ff11ab282a872fb94b + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MERGE_FORKS: false + LABELS: automated-pull-request + AUTOMERGE: automated-pull-request \ No newline at end of file diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index cd8a8df639..c0752922b0 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -75,15 +75,4 @@ jobs: if: github.event_name == 'pull_request' && github.actor == 'OpenOSRS' uses: hmarr/auto-approve-action@v2.0.0 with: - github-token: "${{ secrets.GITHUB_TOKEN }}" - - merge: - name: Merge - needs: approve - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - uses: maxkomarychev/merge-pal-action@v0.1.0 - with: - token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + github-token: ${{ secrets.Owain }} \ No newline at end of file diff --git a/.github/workflows/scraper.yml b/.github/workflows/scraper.yml index 762e79bb67..17223979bf 100644 --- a/.github/workflows/scraper.yml +++ b/.github/workflows/scraper.yml @@ -36,4 +36,4 @@ jobs: PULL_REQUEST_TITLE: 'Client: Update NPC stats' PULL_REQUEST_BODY: This is an auto-generated PR with changes from the OSRS wiki COMMIT_MESSAGE: 'Client: Update NPC stats' - PULL_REQUEST_LABELS: automated pull request, NPC stats \ No newline at end of file + PULL_REQUEST_LABELS: automated-pull-request, NPC stats \ No newline at end of file From 71e548052470332a25c56d26e6f1d70b0ea9bac5 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 1 Nov 2019 15:49:12 +0100 Subject: [PATCH 147/185] Fix ScreenshotPlugin Kingdom of Miscellania double screenshot --- .../net/runelite/client/plugins/screenshot/ScreenshotPlugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 27a78a59d4..c32ae795e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -451,7 +451,6 @@ public class ScreenshotPlugin extends Plugin case KINGDOM_GROUP_ID: { fileName = "Kingdom " + LocalDate.now(); - takeScreenshot(fileName); break; } case CHAMBERS_OF_XERIC_REWARD_GROUP_ID: From d898fa1fc3d56ee5cb8e4f40c6438f24215284e2 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 2 Nov 2019 15:59:05 -0400 Subject: [PATCH 148/185] sessionmanager: correct ponging of the ping. (#1878) * sessionmanager: correct ponging of the ping. * sessionmanager: use declared methods over methods. --- .../src/main/java/net/runelite/client/ClientSessionManager.java | 2 +- .../src/main/java/net/runelite/client/task/Scheduler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java index 3cbea08ba0..057a386b13 100644 --- a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java @@ -58,7 +58,7 @@ public class ClientSessionManager } @Schedule(period = 10, unit = ChronoUnit.MINUTES, asynchronous = true) - private void ping() + public void ping() { if (sessionId == null) { diff --git a/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java b/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java index 3a4926c7cb..7cf6b0796f 100644 --- a/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java +++ b/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java @@ -62,7 +62,7 @@ public class Scheduler public void registerObject(Object obj) { - for (Method method : obj.getClass().getMethods()) + for (Method method : obj.getClass().getDeclaredMethods()) { Schedule schedule = method.getAnnotation(Schedule.class); if (schedule == null) From c1c546cb9aa27ee4a56532bb67fea6449c0fcdfe Mon Sep 17 00:00:00 2001 From: benjaminlgur Date: Sat, 2 Nov 2019 16:43:43 -0400 Subject: [PATCH 149/185] added colon for consistancy --- .../runelite/client/plugins/woodcutting/WoodcuttingOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java index a7408d5ea3..697f82d6ac 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java @@ -105,7 +105,7 @@ class WoodcuttingOverlay extends Overlay if (plugin.isShowGPEarned()) { - tableComponent.addRow("GP earned", Integer.toString((plugin.getGpEarned()))); + tableComponent.addRow("GP earned:", Integer.toString((plugin.getGpEarned()))); } if (actions > 2) From 68943b823a87c72c63bf71b20b27b273a467c93b Mon Sep 17 00:00:00 2001 From: benjaminlgur Date: Sat, 2 Nov 2019 16:48:18 -0400 Subject: [PATCH 150/185] Made requested changes --- .../woodcutting/WoodcuttingPlugin.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java index e9bd610e38..5fa67a2d65 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java @@ -183,8 +183,8 @@ public class WoodcuttingPlugin extends Plugin session.setLastLogCut(); - typeOfLogCut(event); - gpEarned = gpEarned + itemManager.getItemPrice(treeTypeID); + typeOfLogCut(event.getMessage()); + gpEarned += itemManager.getItemPrice(treeTypeID); } if (event.getMessage().contains("A bird's nest falls out of the tree") && this.showNestNotification) @@ -194,41 +194,41 @@ public class WoodcuttingPlugin extends Plugin } } - private void typeOfLogCut(ChatMessage event) + private void typeOfLogCut(String message) { - if (event.getMessage().contains("mushrooms.")) + if (message.contains("mushrooms.")) { return; //TO DO Add valuation for scullicep mushroom cutting. } - else if (event.getMessage().contains("oak")) + else if (message.contains("oak")) { treeTypeID = ItemID.OAK_LOGS; } - else if (event.getMessage().contains("willow")) + else if (message.contains("willow")) { treeTypeID = ItemID.WILLOW_LOGS; } - else if (event.getMessage().contains("yew")) + else if (message.contains("yew")) { treeTypeID = ItemID.YEW_LOGS; } - else if (event.getMessage().contains("redwood")) + else if (message.contains("redwood")) { treeTypeID = ItemID.REDWOOD_LOGS; } - else if (event.getMessage().contains("magic")) + else if (message.contains("magic")) { treeTypeID = ItemID.MAGIC_LOGS; } - else if (event.getMessage().contains("teak")) + else if (message.contains("teak")) { treeTypeID = ItemID.TEAK_LOGS; } - else if (event.getMessage().contains("mahogany")) + else if (message.contains("mahogany")) { treeTypeID = ItemID.MAHOGANY_LOGS; } - else if (event.getMessage().contains("maple")) + else if (message.contains("maple")) { treeTypeID = ItemID.MAPLE_LOGS; } From 4adb74a4fdf7a490baca543762b2d38a951c7f85 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sun, 3 Nov 2019 02:23:45 +0100 Subject: [PATCH 151/185] actions: Fix scraper --- cache-client/cache-client.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cache-client/cache-client.gradle.kts b/cache-client/cache-client.gradle.kts index 8b96c87357..794a19ab8e 100644 --- a/cache-client/cache-client.gradle.kts +++ b/cache-client/cache-client.gradle.kts @@ -40,7 +40,7 @@ dependencies { tasks { register("download") { - dependsOn("copyVanilla") + dependsOn(":cache-client:build") classpath = project.sourceSets.main.get().runtimeClasspath main = "net.runelite.cache.client.CacheClient" From 796bc816ee36ac042157d70363d0ad62820f7d2c Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 30 Oct 2019 10:08:37 +0100 Subject: [PATCH 152/185] Change RS api types to the ones used in rsclient --- .../src/main/java/net/runelite/rs/api/RSClient.java | 6 +++--- .../src/main/java/net/runelite/rs/api/RSWidget.java | 2 +- .../main/java/net/runelite/rs/api/RSWorldMapElement.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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 a726a2a385..c0f8542430 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 @@ -454,11 +454,11 @@ public interface RSClient extends RSGameShell, Client @Import("archive8") @Override - RSAbstractArchive getIndexSprites(); + RSArchive getIndexSprites(); @Import("archive12") @Override - RSAbstractArchive getIndexScripts(); + RSArchive getIndexScripts(); @Import("widgetClickMasks") @Override @@ -1040,7 +1040,7 @@ public interface RSClient extends RSGameShell, Client RSPcmStreamMixer getSoundEffectAudioQueue(); @Import("archive4") - RSAbstractArchive getIndexCache4(); + RSArchive getIndexCache4(); @Import("decimator") RSDecimator getSoundEffectResampler(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index f292e9c117..78ec802de9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -446,7 +446,7 @@ public interface RSWidget extends Widget @Import("getFont") @Override - RSAbstractFont getFont(); + RSFont getFont(); @Import("fill") @Override diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java index f627dd8a63..297da4c8e9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWorldMapElement.java @@ -5,7 +5,7 @@ import net.runelite.mapping.Import; public interface RSWorldMapElement extends RSDualNode, MapElementConfig { - @Import("getSprite") + @Import("getSpriteBool") @Override RSSprite getMapIcon(boolean var1); } From e9991bccdccac41d1c4e609b0ebfc056d7f0ec47 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 30 Oct 2019 10:09:59 +0100 Subject: [PATCH 153/185] Change rs api package to openosrs --- runescape-api/runescape-api.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runescape-api/runescape-api.gradle.kts b/runescape-api/runescape-api.gradle.kts index 5746b30ae4..2d9532a92e 100644 --- a/runescape-api/runescape-api.gradle.kts +++ b/runescape-api/runescape-api.gradle.kts @@ -23,7 +23,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -group = "us.runelitepl.rs" +group = "com.openosrs.rs" description = "RuneScape API" dependencies { From c84f0d5b10c2caf0cf7ea288a07e1ce0f97c6bcc Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 30 Oct 2019 10:13:08 +0100 Subject: [PATCH 154/185] Add annotations dep to deob --- deobfuscator/deobfuscator.gradle.kts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/deobfuscator/deobfuscator.gradle.kts b/deobfuscator/deobfuscator.gradle.kts index c818fa5808..a307aa9b04 100644 --- a/deobfuscator/deobfuscator.gradle.kts +++ b/deobfuscator/deobfuscator.gradle.kts @@ -35,11 +35,12 @@ dependencies { deobjars(group = "net.runelite.rs", name = "vanilla", version = ProjectVersions.rsversion.toString()) deobjars(project(":runescape-client")) - implementation(Libraries.gson) - implementation(Libraries.guava) - implementation(Libraries.fernflower) + implementation(Libraries.annotations) implementation(Libraries.asmAll) implementation(Libraries.asmUtil) + implementation(Libraries.fernflower) + implementation(Libraries.gson) + implementation(Libraries.guava) implementation(Libraries.slf4jApi) implementation(project(":runelite-api")) implementation(project(":runescape-api")) From f93984a743cb8c3a8870513675807867d72c727f Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 30 Oct 2019 10:30:37 +0100 Subject: [PATCH 155/185] Deob changes for injector and general usability --- .../main/java/net/runelite/asm/Annotated.java | 17 +++++ .../main/java/net/runelite/asm/ClassFile.java | 8 +-- .../java/net/runelite/asm/ClassGroup.java | 18 ++++- .../src/main/java/net/runelite/asm/Field.java | 9 +-- .../java/net/runelite/asm/Interfaces.java | 10 ++- .../main/java/net/runelite/asm/Method.java | 6 +- .../src/main/java/net/runelite/asm/Named.java | 6 ++ .../runelite/asm/attributes/Annotations.java | 27 +++++--- .../net/runelite/asm/attributes/Code.java | 19 +++--- .../asm/attributes/annotation/Annotation.java | 61 +++++++++++------ .../attributes/annotation/ArrayElement.java | 42 ++++++++++++ .../asm/attributes/annotation/Element.java | 57 +++++++++++----- .../attributes/annotation/SimpleElement.java | 15 ++++ .../asm/attributes/code/Instructions.java | 26 ++++++- ...tor.java => AnnotationElementVisitor.java} | 59 ++++++++++------ .../asm/visitors/ClassAnnotationVisitor.java | 68 ------------------- .../asm/visitors/ClassFieldVisitor.java | 24 +++---- .../asm/visitors/ClassFileVisitor.java | 9 ++- .../runelite/asm/visitors/CodeVisitor.java | 14 ++-- .../asm/visitors/FieldAnnotationVisitor.java | 68 ------------------- .../net/runelite/deob/DeobAnnotations.java | 2 +- .../runelite/deob/deobfuscators/Renamer.java | 1 + .../constparam/ConstantParameter.java | 10 ++- .../mapping/AnnotationMapper.java | 15 ++-- .../deob/updater/AnnotationAdder.java | 23 +++---- .../deob/updater/AnnotationCopier.java | 10 ++- .../deob/updater/AnnotationRenamer.java | 4 -- .../java/net/runelite/deob/util/JarUtil.java | 37 ++++++++++ .../java/net/runelite/osb/HookImporter.java | 5 +- 29 files changed, 365 insertions(+), 305 deletions(-) create mode 100644 deobfuscator/src/main/java/net/runelite/asm/Annotated.java create mode 100644 deobfuscator/src/main/java/net/runelite/asm/Named.java create mode 100644 deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/ArrayElement.java create mode 100644 deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/SimpleElement.java rename deobfuscator/src/main/java/net/runelite/asm/visitors/{MethodAnnotationVisitor.java => AnnotationElementVisitor.java} (62%) delete mode 100644 deobfuscator/src/main/java/net/runelite/asm/visitors/ClassAnnotationVisitor.java delete mode 100644 deobfuscator/src/main/java/net/runelite/asm/visitors/FieldAnnotationVisitor.java diff --git a/deobfuscator/src/main/java/net/runelite/asm/Annotated.java b/deobfuscator/src/main/java/net/runelite/asm/Annotated.java new file mode 100644 index 0000000000..4645fa23a2 --- /dev/null +++ b/deobfuscator/src/main/java/net/runelite/asm/Annotated.java @@ -0,0 +1,17 @@ +package net.runelite.asm; + +import java.util.Iterator; +import net.runelite.asm.attributes.Annotations; +import net.runelite.asm.attributes.annotation.Annotation; +import org.jetbrains.annotations.NotNull; + +public interface Annotated extends Iterable +{ + Annotations getAnnotations(); + + @NotNull + default Iterator iterator() + { + return getAnnotations().iterator(); + } +} diff --git a/deobfuscator/src/main/java/net/runelite/asm/ClassFile.java b/deobfuscator/src/main/java/net/runelite/asm/ClassFile.java index a5f3a6ecb6..fd2ba5a40a 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/ClassFile.java +++ b/deobfuscator/src/main/java/net/runelite/asm/ClassFile.java @@ -31,13 +31,12 @@ import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.pool.Class; import net.runelite.asm.signature.Signature; import static net.runelite.deob.DeobAnnotations.*; -import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -public class ClassFile +public class ClassFile implements Annotated, Named { private ClassGroup group; @@ -100,10 +99,9 @@ public class ClassFile visitor.visit(version, access, name.getName(), null, super_class.getName(), ints); visitor.visitSource(source, null); - for (Annotation annotation : annotations.getAnnotations()) + for (Annotation annotation : annotations) { - AnnotationVisitor av = visitor.visitAnnotation(annotation.getType().toString(), true); - annotation.accept(av); + annotation.accept(visitor.visitAnnotation(annotation.getType().toString(), true)); } for (Field field : fields) diff --git a/deobfuscator/src/main/java/net/runelite/asm/ClassGroup.java b/deobfuscator/src/main/java/net/runelite/asm/ClassGroup.java index 33ab161acc..fabde88742 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/ClassGroup.java +++ b/deobfuscator/src/main/java/net/runelite/asm/ClassGroup.java @@ -27,13 +27,16 @@ package net.runelite.asm; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import net.runelite.asm.attributes.Code; import net.runelite.asm.signature.Signature; import static net.runelite.deob.DeobAnnotations.*; +import org.jetbrains.annotations.NotNull; -public class ClassGroup +public class ClassGroup implements Iterable { private final List classes = new ArrayList<>(); // to keep order private final Map classMap = new HashMap<>(); @@ -156,4 +159,17 @@ public class ClassGroup return findClass(name); } + + @NotNull + @Override + public Iterator iterator() + { + return this.classes.iterator(); + } + + @Override + public void forEach(Consumer action) + { + this.classes.forEach(action); + } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/Field.java b/deobfuscator/src/main/java/net/runelite/asm/Field.java index 39590b021c..1a9fd7a776 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/Field.java +++ b/deobfuscator/src/main/java/net/runelite/asm/Field.java @@ -27,15 +27,13 @@ package net.runelite.asm; import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.deob.DeobAnnotations; -import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Opcodes; - import static org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.objectweb.asm.Opcodes.ACC_PROTECTED; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -public class Field +public class Field implements Annotated, Named { public static final int ACCESS_MODIFIERS = ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED; @@ -53,15 +51,14 @@ public class Field this.name = name; this.type = type; - annotations = new Annotations(); + this.annotations = new Annotations(); } public void accept(FieldVisitor visitor) { for (Annotation annotation : annotations.getAnnotations()) { - AnnotationVisitor av = visitor.visitAnnotation(annotation.getType().toString(), true); - annotation.accept(av); + annotation.accept(visitor.visitAnnotation(annotation.getType().toString(), true)); } visitor.visitEnd(); diff --git a/deobfuscator/src/main/java/net/runelite/asm/Interfaces.java b/deobfuscator/src/main/java/net/runelite/asm/Interfaces.java index f5994ad1d3..9bc15d5100 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/Interfaces.java +++ b/deobfuscator/src/main/java/net/runelite/asm/Interfaces.java @@ -25,12 +25,14 @@ package net.runelite.asm; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; import net.runelite.asm.pool.Class; import net.runelite.deob.DeobAnnotations; +import org.jetbrains.annotations.NotNull; -public class Interfaces +public class Interfaces implements Iterable { private final ClassFile classFile; @@ -107,4 +109,10 @@ public class Interfaces return names; } + + @NotNull + public Iterator iterator() + { + return this.interfaces.iterator(); + } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/Method.java b/deobfuscator/src/main/java/net/runelite/asm/Method.java index ad7394c7be..b13e98aa3f 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/Method.java +++ b/deobfuscator/src/main/java/net/runelite/asm/Method.java @@ -36,7 +36,6 @@ import net.runelite.asm.attributes.code.Parameter; import net.runelite.asm.attributes.code.instruction.types.LVTInstruction; import net.runelite.asm.signature.Signature; import net.runelite.deob.DeobAnnotations; -import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import static org.objectweb.asm.Opcodes.ACC_FINAL; @@ -47,7 +46,7 @@ import static org.objectweb.asm.Opcodes.ACC_PUBLIC; import static org.objectweb.asm.Opcodes.ACC_STATIC; import static org.objectweb.asm.Opcodes.ACC_SYNCHRONIZED; -public class Method +public class Method implements Annotated, Named { public static final int ACCESS_MODIFIERS = ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED; @@ -92,8 +91,7 @@ public class Method for (Annotation annotation : annotations.getAnnotations()) { - AnnotationVisitor av = visitor.visitAnnotation(annotation.getType().toString(), true); - annotation.accept(av); + annotation.accept(visitor.visitAnnotation(annotation.getType().toString(), true)); } if (code != null) diff --git a/deobfuscator/src/main/java/net/runelite/asm/Named.java b/deobfuscator/src/main/java/net/runelite/asm/Named.java new file mode 100644 index 0000000000..ec2bc0b6a9 --- /dev/null +++ b/deobfuscator/src/main/java/net/runelite/asm/Named.java @@ -0,0 +1,6 @@ +package net.runelite.asm; + +public interface Named +{ + String getName(); +} diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/Annotations.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/Annotations.java index b14d761c28..7c1a6ba535 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/Annotations.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/Annotations.java @@ -26,13 +26,16 @@ package net.runelite.asm.attributes; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import net.runelite.asm.Type; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.attributes.annotation.SimpleElement; +import org.jetbrains.annotations.NotNull; -public class Annotations +public class Annotations implements Iterable { private final List annotations = new ArrayList<>(); @@ -40,7 +43,7 @@ public class Annotations { return annotations; } - + public void addAnnotation(Annotation annotation) { annotations.add(annotation); @@ -55,7 +58,7 @@ public class Annotations { annotations.clear(); } - + public Annotation find(Type type) { for (Annotation a : annotations) @@ -68,18 +71,22 @@ public class Annotations { return annotations.size(); } - + public Annotation addAnnotation(Type type, String name, Object value) { - Annotation annotation = new Annotation(this); - annotation.setType(type); + Annotation annotation = new Annotation(type); addAnnotation(annotation); - - Element element = new Element(annotation); - element.setName(name); - element.setValue(value); + + Element element = new SimpleElement(name, value); annotation.addElement(element); return annotation; } + + @NotNull + @Override + public Iterator iterator() + { + return this.annotations.iterator(); + } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/Code.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/Code.java index b20c183fea..58c759844a 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/Code.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/Code.java @@ -41,11 +41,11 @@ public class Code private int maxStack; private Instructions instructions; private final Exceptions exceptions; - + public Code(Method method) { this.method = method; - + exceptions = new Exceptions(this); instructions = new Instructions(this); } @@ -59,12 +59,12 @@ public class Code { return maxStack; } - + public void setMaxStack(int maxStack) { this.maxStack = maxStack; } - + private int getMaxLocalsFromSig() { Method m = getMethod(); @@ -77,12 +77,11 @@ public class Code /** * calculates the size of the lvt required for this method - * @return */ public int getMaxLocals() { int max = -1; - + for (Instruction ins : instructions.getInstructions()) { if (ins instanceof LVTInstruction) @@ -96,19 +95,19 @@ public class Code } } } - + int fromSig = getMaxLocalsFromSig(); if (fromSig > max) max = fromSig; - + return max; } - + public Exceptions getExceptions() { return exceptions; } - + public Instructions getInstructions() { return instructions; diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Annotation.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Annotation.java index 7c727eb788..6f3a459eb3 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Annotation.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Annotation.java @@ -26,30 +26,26 @@ package net.runelite.asm.attributes.annotation; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; - import net.runelite.asm.Type; -import net.runelite.asm.attributes.Annotations; +import org.jetbrains.annotations.NotNull; import org.objectweb.asm.AnnotationVisitor; -public class Annotation +public class Annotation extends Element> implements Iterable { - private final Annotations annotations; - private Type type; - private final List elements = new ArrayList<>(); + private final Type type; - public Annotation(Annotations annotations) + public Annotation(Type type) { - this.annotations = annotations; + this.value = new ArrayList<>(); + this.type = type; } - public Annotations getAnnotations() - { - return annotations; - } - - public void setType(Type type) + public Annotation(String name, Type type) { + this.value = new ArrayList<>(); + this.name = name; this.type = type; } @@ -60,23 +56,44 @@ public class Annotation public List getElements() { - return elements; + return value; } - + public Element getElement() { - return elements.get(0); + return value.get(0); } - + public void addElement(Element element) { - elements.add(element); + value.add(element); } - + + @Override + public final void setValue(List value) + { + throw new UnsupportedOperationException(); + } + public void accept(AnnotationVisitor visitor) { - for (Element element : elements) - visitor.visit(element.getName(), element.getValue()); + if (visitor == null) + { + return; + } + + for (Element element : this) + { + accept(visitor, element.name, element.value); + } + visitor.visitEnd(); } + + @NotNull + @Override + public Iterator iterator() + { + return this.value.iterator(); + } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/ArrayElement.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/ArrayElement.java new file mode 100644 index 0000000000..b7e2b7ef84 --- /dev/null +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/ArrayElement.java @@ -0,0 +1,42 @@ +package net.runelite.asm.attributes.annotation; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Stream; +import org.jetbrains.annotations.NotNull; + +public class ArrayElement extends Element implements Iterable +{ + public ArrayElement(String name) + { + this.name = name; + this.value = new ArrayList<>(); + } + + @SuppressWarnings("unchecked") + public void addValue(Object value) + { + this.value.add(value); + } + + @Override + public final void setValue(List value) + { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + @SuppressWarnings("unchecked") + public Iterator iterator() + { + return this.value.iterator(); + } + + @SuppressWarnings("unchecked") + public Stream stream() + { + return this.value.stream(); + } +} diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Element.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Element.java index 18fdfa33f4..10b59b5b27 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Element.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/Element.java @@ -25,21 +25,14 @@ package net.runelite.asm.attributes.annotation; -public class Element -{ - private final Annotation annotation; - private String name; - private Object value; - - public Element(Annotation annotation) - { - this.annotation = annotation; - } +import java.util.List; +import org.objectweb.asm.AnnotationVisitor; - public Annotation getAnnotation() - { - return annotation; - } +public abstract class Element +{ + String name = "value"; + + T value; public String getName() { @@ -51,18 +44,48 @@ public class Element this.name = name; } - public Object getValue() + public T getValue() { return value; } - public void setValue(Object value) + public void setValue(T value) { this.value = value; } - + public String getString() { return value.toString(); } + + public static void accept(AnnotationVisitor visitor, final String name, final Object value) + { + if (visitor == null) + { + return; + } + + if (value instanceof Annotation) + { + Annotation annotation = (Annotation) value; + annotation.accept(visitor.visitAnnotation(name, annotation.getType().toString())); + } + else if (value instanceof List) + { + AnnotationVisitor arr = visitor.visitArray(name); + List arrayValue = (List) value; + + for (Object o : arrayValue) + { + accept(arr, null, o); + } + + arr.visitEnd(); + } + else + { + visitor.visit(name, value); + } + } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/SimpleElement.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/SimpleElement.java new file mode 100644 index 0000000000..52e25e295c --- /dev/null +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/annotation/SimpleElement.java @@ -0,0 +1,15 @@ +package net.runelite.asm.attributes.annotation; + +public class SimpleElement extends Element +{ + public SimpleElement(Object value) + { + this.value = value; + } + + public SimpleElement(String name, Object value) + { + this.name = name; + this.value = value; + } +} diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/Instructions.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/Instructions.java index a528950d0a..212c168998 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/Instructions.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/Instructions.java @@ -26,11 +26,14 @@ package net.runelite.asm.attributes.code; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Map; import net.runelite.asm.attributes.Code; +import org.jetbrains.annotations.NotNull; -public class Instructions +public class Instructions implements Iterable { private final Code code; private final List instructions = new ArrayList<>(); @@ -186,4 +189,25 @@ public class Instructions return i; } + + public int size() + { + return this.instructions.size(); + } + + @NotNull + public Iterator iterator() + { + return this.instructions.iterator(); + } + + public ListIterator listIterator() + { + return this.instructions.listIterator(); + } + + public ListIterator listIterator(int i) + { + return this.instructions.listIterator(i); + } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/visitors/MethodAnnotationVisitor.java b/deobfuscator/src/main/java/net/runelite/asm/visitors/AnnotationElementVisitor.java similarity index 62% rename from deobfuscator/src/main/java/net/runelite/asm/visitors/MethodAnnotationVisitor.java rename to deobfuscator/src/main/java/net/runelite/asm/visitors/AnnotationElementVisitor.java index bcce61aedd..7bd5811813 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/visitors/MethodAnnotationVisitor.java +++ b/deobfuscator/src/main/java/net/runelite/asm/visitors/AnnotationElementVisitor.java @@ -25,44 +25,59 @@ package net.runelite.asm.visitors; -import net.runelite.asm.Method; import net.runelite.asm.Type; import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.attributes.annotation.ArrayElement; +import net.runelite.asm.attributes.annotation.SimpleElement; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Opcodes; -public class MethodAnnotationVisitor extends AnnotationVisitor +public class AnnotationElementVisitor extends AnnotationVisitor { - private final Method method; - private final Type type; private final Annotation annotation; - - public MethodAnnotationVisitor(Method method, Type type) + + AnnotationElementVisitor(Annotation annotation) { super(Opcodes.ASM5); - - this.method = method; - this.type = type; - - annotation = new Annotation(method.getAnnotations()); - annotation.setType(type); + + this.annotation = annotation; } - + @Override public void visit(String name, Object value) { - Element element = new Element(annotation); - - element.setName(name); - element.setValue(value); - + SimpleElement element = new SimpleElement(name, value); annotation.addElement(element); } - + @Override - public void visitEnd() + public AnnotationVisitor visitArray(String name) { - method.getAnnotations().addAnnotation(annotation); + ArrayElement element = new ArrayElement(name); + this.annotation.addElement(element); + return new AnnotationVisitor(Opcodes.ASM5) + { + @Override + public void visit(String name, Object value) + { + element.addValue(value); + } + + @Override + public AnnotationVisitor visitAnnotation(String name, String descriptor) + { + Annotation annotation = new Annotation(name, new Type(descriptor)); + element.addValue(annotation); + return new AnnotationElementVisitor(annotation); + } + }; + } + + @Override + public AnnotationVisitor visitAnnotation(String name, String descriptor) + { + Annotation annotation = new Annotation(name, new Type(descriptor)); + this.annotation.addElement(annotation); + return new AnnotationElementVisitor(annotation); } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassAnnotationVisitor.java b/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassAnnotationVisitor.java deleted file mode 100644 index f9f62fc82a..0000000000 --- a/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassAnnotationVisitor.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package net.runelite.asm.visitors; - -import net.runelite.asm.ClassFile; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.attributes.annotation.Element; -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.Opcodes; - -public class ClassAnnotationVisitor extends AnnotationVisitor -{ - private final ClassFile classFile; - private final Type type; - private final Annotation annotation; - - public ClassAnnotationVisitor(ClassFile classFile, Type type) - { - super(Opcodes.ASM5); - - this.classFile = classFile; - this.type = type; - - annotation = new Annotation(classFile.getAnnotations()); - annotation.setType(type); - } - - @Override - public void visit(String name, Object value) - { - Element element = new Element(annotation); - - element.setName(name); - element.setValue(value); - - annotation.addElement(element); - } - - @Override - public void visitEnd() - { - classFile.getAnnotations().addAnnotation(annotation); - } -} diff --git a/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFieldVisitor.java b/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFieldVisitor.java index 37478d26e3..c9012b162c 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFieldVisitor.java +++ b/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFieldVisitor.java @@ -22,12 +22,12 @@ * (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.asm.visitors; import net.runelite.asm.ClassFile; import net.runelite.asm.Field; import net.runelite.asm.Type; +import net.runelite.asm.attributes.annotation.Annotation; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.FieldVisitor; @@ -35,25 +35,25 @@ import org.objectweb.asm.Opcodes; public class ClassFieldVisitor extends FieldVisitor { - private final ClassFile classFile; private final Field field; - public ClassFieldVisitor(ClassFile cf, int access, String name, Type desc, Object value) + ClassFieldVisitor(ClassFile cf, int access, String name, Type desc, Object value) { super(Opcodes.ASM5); - this.classFile = cf; + this.field = new Field(cf, name, desc); + this.field.setAccessFlags(access); + this.field.setValue(value); - field = new Field(cf, name, desc); - field.setAccessFlags(access); - field.setValue(value); + cf.addField(field); } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - Type type = new Type(desc); - return new FieldAnnotationVisitor(field, type); + Annotation element = new Annotation(new Type(desc)); + this.field.getAnnotations().addAnnotation(element); + return new AnnotationElementVisitor(element); } @Override @@ -61,10 +61,4 @@ public class ClassFieldVisitor extends FieldVisitor { System.out.println(attr); } - - @Override - public void visitEnd() - { - classFile.addField(field); - } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFileVisitor.java b/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFileVisitor.java index abaf4e919d..d96ec550b1 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFileVisitor.java +++ b/deobfuscator/src/main/java/net/runelite/asm/visitors/ClassFileVisitor.java @@ -27,6 +27,7 @@ package net.runelite.asm.visitors; import net.runelite.asm.ClassFile; import net.runelite.asm.Type; +import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.signature.Signature; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassVisitor; @@ -55,7 +56,7 @@ public class ClassFileVisitor extends ClassVisitor classFile.setSuperName(superName); classFile.setVersion(version); classFile.setAccess(access); - + for (String inter : interfaces) classFile.getInterfaces().addInterface(new net.runelite.asm.pool.Class(inter)); } @@ -69,8 +70,10 @@ public class ClassFileVisitor extends ClassVisitor @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - Type type = new Type(desc); - return new ClassAnnotationVisitor(classFile, type); + Annotation annotation = new Annotation(new Type(desc)); + classFile.getAnnotations().addAnnotation(annotation); + + return new AnnotationElementVisitor(annotation); } @Override diff --git a/deobfuscator/src/main/java/net/runelite/asm/visitors/CodeVisitor.java b/deobfuscator/src/main/java/net/runelite/asm/visitors/CodeVisitor.java index d01873b83b..7746cd7a7a 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/visitors/CodeVisitor.java +++ b/deobfuscator/src/main/java/net/runelite/asm/visitors/CodeVisitor.java @@ -32,6 +32,7 @@ import net.runelite.asm.ClassFile; import net.runelite.asm.Method; import net.runelite.asm.Type; import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.attributes.code.Exceptions; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.InstructionType; @@ -72,18 +73,14 @@ import static org.objectweb.asm.Opcodes.ICONST_5; import static org.objectweb.asm.Opcodes.ICONST_M1; import static org.objectweb.asm.Opcodes.LCONST_0; import static org.objectweb.asm.Opcodes.LCONST_1; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class CodeVisitor extends MethodVisitor { - private static final Logger logger = LoggerFactory.getLogger(CodeVisitor.class); - private final ClassFile classFile; private final Method method; private Code code; - public CodeVisitor(ClassFile classFile, int access, String name, Signature signature, String[] sexceptions) + CodeVisitor(ClassFile classFile, int access, String name, Signature signature, String[] sexceptions) { super(Opcodes.ASM5); @@ -111,8 +108,9 @@ public class CodeVisitor extends MethodVisitor @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - Type type = new Type(desc); - return new MethodAnnotationVisitor(method, type); + Annotation element = new Annotation(new Type(desc)); + this.method.getAnnotations().addAnnotation(element); + return new AnnotationElementVisitor(element); } @Override @@ -333,7 +331,7 @@ public class CodeVisitor extends MethodVisitor if (cst instanceof org.objectweb.asm.Type) { org.objectweb.asm.Type t = (org.objectweb.asm.Type) cst; - entry = new net.runelite.asm.pool.Class((String) t.getClassName()); + entry = new net.runelite.asm.pool.Class(t.getClassName()); } LDC ldc = new LDC(code.getInstructions(), entry); diff --git a/deobfuscator/src/main/java/net/runelite/asm/visitors/FieldAnnotationVisitor.java b/deobfuscator/src/main/java/net/runelite/asm/visitors/FieldAnnotationVisitor.java deleted file mode 100644 index 962328f272..0000000000 --- a/deobfuscator/src/main/java/net/runelite/asm/visitors/FieldAnnotationVisitor.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package net.runelite.asm.visitors; - -import net.runelite.asm.Field; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.attributes.annotation.Element; -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.Opcodes; - -public class FieldAnnotationVisitor extends AnnotationVisitor -{ - private final Field field; - private final Type type; - private final Annotation annotation; - - public FieldAnnotationVisitor(Field field, Type type) - { - super(Opcodes.ASM5); - - this.field = field; - this.type = type; - - annotation = new Annotation(field.getAnnotations()); - annotation.setType(type); - } - - @Override - public void visit(String name, Object value) - { - Element element = new Element(annotation); - - element.setName(name); - element.setValue(value); - - annotation.addElement(element); - } - - @Override - public void visitEnd() - { - field.getAnnotations().addAnnotation(annotation); - } -} diff --git a/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java b/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java index 2881148caa..6294574e74 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java +++ b/deobfuscator/src/main/java/net/runelite/deob/DeobAnnotations.java @@ -95,7 +95,7 @@ public class DeobAnnotations { return null; } - + return (Number) an.getElement().getValue(); } diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/Renamer.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/Renamer.java index 418802ef5a..588b840918 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/Renamer.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/Renamer.java @@ -193,6 +193,7 @@ public class Renamer implements Deobfuscator } @Override + @SuppressWarnings("unchecked") public void run(ClassGroup group) { group.buildClassGraph(); diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java index 0970a9b3e1..b2a0c369b3 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/constparam/ConstantParameter.java @@ -37,6 +37,7 @@ import net.runelite.asm.Method; import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.attributes.annotation.SimpleElement; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.InstructionType; import net.runelite.asm.attributes.code.Instructions; @@ -113,7 +114,6 @@ public class ConstantParameter implements Deobfuscator List pops = invokeCtx.getPops(); - outer: // object is popped first, then param 1, 2, 3, etc. double and long take two slots. for (int lvtOffset = offset, parameterIndex = 0; parameterIndex < method.getDescriptor().size(); @@ -451,9 +451,7 @@ public class ConstantParameter implements Deobfuscator } // Add garbage value - Element element = new Element(obfuscatedSignature); - element.setName("garbageValue"); - element.setValue(value.toString()); + Element element = new SimpleElement("garbageValue", value.toString()); obfuscatedSignature.addElement(element); } } @@ -464,12 +462,12 @@ public class ConstantParameter implements Deobfuscator public void run(ClassGroup group) { Execution execution = new Execution(group); - execution.addExecutionVisitor(i -> findParameters(i)); + execution.addExecutionVisitor(this::findParameters); execution.populateInitialMethods(); execution.run(); execution = new Execution(group); - execution.addMethodContextVisitor(mc -> findDeadParameters(mc)); + execution.addMethodContextVisitor(this::findDeadParameters); execution.populateInitialMethods(); execution.run(); diff --git a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationMapper.java b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationMapper.java index 87e01ac4ae..bd60ec165e 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationMapper.java +++ b/deobfuscator/src/main/java/net/runelite/deob/deobfuscators/mapping/AnnotationMapper.java @@ -32,6 +32,7 @@ import net.runelite.asm.Method; import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.attributes.annotation.SimpleElement; import net.runelite.deob.DeobAnnotations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +40,7 @@ import org.slf4j.LoggerFactory; public class AnnotationMapper { private static final Logger logger = LoggerFactory.getLogger(AnnotationMapper.class); - + private final ClassGroup source, target; private final ParallelExecutorMapping mapping; @@ -119,20 +120,17 @@ public class AnnotationMapper if (from.getAnnotations() == null) return count; - + for (Annotation a : from.getAnnotations()) { if (isCopyable(a)) { - Annotation annotation = new Annotation(to); - annotation.setType(a.getType()); + Annotation annotation = new Annotation(a.getType()); to.addAnnotation(annotation); for (Element e : a.getElements()) { - Element element = new Element(annotation); - element.setName(e.getName()); - element.setValue(e.getValue()); + Element element = new SimpleElement(e.getName(), e.getValue()); annotation.addElement(element); } @@ -155,7 +153,6 @@ public class AnnotationMapper private boolean isCopyable(Annotation a) { return a.getType().equals(DeobAnnotations.EXPORT) - || a.getType().equals(DeobAnnotations.IMPLEMENTS) - || a.getType().equals(DeobAnnotations.HOOK); + || a.getType().equals(DeobAnnotations.IMPLEMENTS); } } diff --git a/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationAdder.java b/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationAdder.java index a01628d863..d2c3d62034 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationAdder.java +++ b/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationAdder.java @@ -8,6 +8,7 @@ import net.runelite.asm.Method; import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.attributes.annotation.SimpleElement; import net.runelite.deob.Deob; import net.runelite.deob.DeobAnnotations; import org.slf4j.Logger; @@ -23,6 +24,7 @@ public class AnnotationAdder private final ClassGroup group; private final Logger log = LoggerFactory.getLogger(AnnotationAdder.class); + @SuppressWarnings("unchecked") public void run() { int impl = 0; @@ -50,12 +52,9 @@ public class AnnotationAdder { Annotations an = c.getAnnotations(); - Annotation implAn = new Annotation(an); - implAn.setType(DeobAnnotations.IMPLEMENTS); + Annotation implAn = new Annotation(DeobAnnotations.IMPLEMENTS); - Element value = new Element(implAn); - value.setValue(c.getClassName()); - value.setName("value"); + Element value = new SimpleElement(c.getClassName()); implAn.addElement(value); an.addAnnotation(implAn); @@ -81,12 +80,9 @@ public class AnnotationAdder Annotation a = an.find(DeobAnnotations.EXPORT); if (a == null) { - a = new Annotation(an); - a.setType(DeobAnnotations.EXPORT); + a = new Annotation(DeobAnnotations.EXPORT); - Element value = new Element(a); - value.setValue(fieldName); - value.setName("value"); + Element value = new SimpleElement(fieldName); a.addElement(value); an.addAnnotation(a); @@ -114,12 +110,9 @@ public class AnnotationAdder Annotation a = an.find(DeobAnnotations.EXPORT); if (a == null) { - a = new Annotation(an); - a.setType(DeobAnnotations.EXPORT); + a = new Annotation(DeobAnnotations.EXPORT); - Element value = new Element(a); - value.setValue(methodName); - value.setName("value"); + Element value = new SimpleElement(methodName); a.addElement(value); an.addAnnotation(a); diff --git a/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationCopier.java b/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationCopier.java index 0c594cfe19..5d495b9029 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationCopier.java +++ b/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationCopier.java @@ -34,6 +34,7 @@ import net.runelite.asm.Type; import net.runelite.asm.attributes.Annotations; import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.asm.attributes.annotation.Element; +import net.runelite.asm.attributes.annotation.SimpleElement; public class AnnotationCopier { @@ -97,15 +98,12 @@ public class AnnotationCopier { if (!isType(a.getType())) continue; - - Annotation a2 = new Annotation(an2); - a2.setType(a.getType()); + + Annotation a2 = new Annotation(a.getType()); for (Element element : a.getElements()) { - Element element2 = new Element(a2); - element2.setName(element.getName()); - element2.setValue(element.getValue()); + Element element2 = new SimpleElement(element.getName(), element.getValue()); a2.addElement(element2); } diff --git a/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationRenamer.java b/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationRenamer.java index 7d0f2f03d2..da920899bc 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationRenamer.java +++ b/deobfuscator/src/main/java/net/runelite/deob/updater/AnnotationRenamer.java @@ -34,13 +34,9 @@ import net.runelite.asm.attributes.annotation.Annotation; import net.runelite.deob.DeobAnnotations; import net.runelite.deob.deobfuscators.Renamer; import net.runelite.deob.util.NameMappings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class AnnotationRenamer { - private static final Logger logger = LoggerFactory.getLogger(AnnotationRenamer.class); - private ClassGroup group; public AnnotationRenamer(ClassGroup group) diff --git a/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java b/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java index 1b0435d3d0..67364468c0 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java +++ b/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java @@ -25,9 +25,11 @@ package net.runelite.deob.util; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Collection; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -79,6 +81,41 @@ public class JarUtil return group; } + public static ClassFile loadClass(byte[] bytes) + { + ClassReader reader = new ClassReader(bytes); + ClassFileVisitor cv = new ClassFileVisitor(); + reader.accept(cv, ClassReader.SKIP_FRAMES); + return cv.getClassFile(); + } + + public static ClassGroup loadClasses(Collection files) throws IOException + { + final ClassGroup group = new ClassGroup(); + + for (File file : files) + { + if (!file.getName().endsWith(".class")) + { + continue; + } + + try (InputStream is = new FileInputStream(file)) + { + ClassReader reader = new ClassReader(is); + ClassFileVisitor cv = new ClassFileVisitor(); + + reader.accept(cv, ClassReader.SKIP_FRAMES); + + group.addClass(cv.getClassFile()); + } + } + + group.initialize(); + + return group; + } + public static void saveJar(ClassGroup group, File jarfile) throws IOException { try (JarOutputStream jout = new JarOutputStream(new FileOutputStream(jarfile), new Manifest())) diff --git a/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java b/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java index bf8e2bed2b..dbb17bfe55 100644 --- a/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java +++ b/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java @@ -276,8 +276,7 @@ public class HookImporter { for (Element e : a.getElements()) { - String str = (String) e.getValue(); - return str; + return (String) e.getValue(); } } } @@ -288,7 +287,7 @@ public class HookImporter private Signature getObfuscatedMethodSignature(Method method) { String sig = getAnnotation(method.getAnnotations(), OBFUSCATED_SIGNATURE); - if (sig.isEmpty() == false) + if (!sig.isEmpty()) { return toObSignature(new Signature(sig)); // if it is annoted, use that } From 3b36541b30060738348ea858952dab9faeaaa763 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 30 Oct 2019 10:31:44 +0100 Subject: [PATCH 156/185] Remove duplicate api annotations --- .../java/net/runelite/mapping/Export.java | 40 ------------------- .../java/net/runelite/mapping/Import.java | 40 ------------------- .../runelite/mapping/ObfuscatedGetter.java | 39 ------------------ .../java/net/runelite/mapping/Protect.java | 40 ------------------- 4 files changed, 159 deletions(-) delete mode 100644 runelite-api/src/main/java/net/runelite/mapping/Export.java delete mode 100644 runelite-api/src/main/java/net/runelite/mapping/Import.java delete mode 100644 runelite-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java delete mode 100644 runelite-api/src/main/java/net/runelite/mapping/Protect.java diff --git a/runelite-api/src/main/java/net/runelite/mapping/Export.java b/runelite-api/src/main/java/net/runelite/mapping/Export.java deleted file mode 100644 index cd789618cd..0000000000 --- a/runelite-api/src/main/java/net/runelite/mapping/Export.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.mapping; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target( -{ - ElementType.FIELD, ElementType.METHOD -}) -public @interface Export -{ - String value(); -} diff --git a/runelite-api/src/main/java/net/runelite/mapping/Import.java b/runelite-api/src/main/java/net/runelite/mapping/Import.java deleted file mode 100644 index 97e4e81d7f..0000000000 --- a/runelite-api/src/main/java/net/runelite/mapping/Import.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.mapping; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target( -{ - ElementType.FIELD, ElementType.METHOD -}) -public @interface Import -{ - String value(); -} diff --git a/runelite-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java b/runelite-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java deleted file mode 100644 index b8e2873006..0000000000 --- a/runelite-api/src/main/java/net/runelite/mapping/ObfuscatedGetter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.mapping; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface ObfuscatedGetter -{ - int intValue() default 0; - - long longValue() default 0L; -} diff --git a/runelite-api/src/main/java/net/runelite/mapping/Protect.java b/runelite-api/src/main/java/net/runelite/mapping/Protect.java deleted file mode 100644 index a5c780a94d..0000000000 --- a/runelite-api/src/main/java/net/runelite/mapping/Protect.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2018, Lotto - * 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.mapping; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Used to indicate a method can only be called from within mixins. - * Calling methods annotated with this annotation outside mixins results in a AbstractMethodError. - * Only works in net.runelite.rs.api.* - */ -@Documented -@Retention(RetentionPolicy.RUNTIME) -public @interface Protect -{ -} From e0142c7f77f08d1672788b807cd06ecd5643051d Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Thu, 31 Oct 2019 01:00:10 +0100 Subject: [PATCH 157/185] Remove injector plugin --- injector-plugin/injector-plugin.gradle.kts | 83 -- .../java/net/runelite/injector/Inject.java | 580 ---------- .../runelite/injector/InjectConstruct.java | 171 --- .../net/runelite/injector/InjectGetter.java | 155 --- .../net/runelite/injector/InjectHook.java | 396 ------- .../runelite/injector/InjectHookMethod.java | 255 ----- .../net/runelite/injector/InjectInvoker.java | 291 ----- .../net/runelite/injector/InjectMojo.java | 152 --- .../net/runelite/injector/InjectSetter.java | 158 --- .../net/runelite/injector/InjectUtil.java | 281 ----- .../runelite/injector/InjectionException.java | 44 - .../java/net/runelite/injector/Injector.java | 85 -- .../runelite/injector/InjectorValidator.java | 196 ---- .../net/runelite/injector/MixinInjector.java | 998 ------------------ .../injector/raw/ClearColorBuffer.java | 124 --- .../injector/raw/DrawAfterWidgets.java | 264 ----- .../net/runelite/injector/raw/DrawMenu.java | 135 --- .../injector/raw/HidePlayerAttacks.java | 202 ---- .../net/runelite/injector/raw/Occluder.java | 83 -- .../net/runelite/injector/raw/RenderDraw.java | 86 -- .../net/runelite/injector/raw/ScriptVM.java | 306 ------ .../injector/InjectConstructTest.java | 63 -- .../runelite/injector/InjectSetterTest.java | 116 -- .../net/runelite/injector/InjectTest.java | 74 -- .../runelite/injector/MixinInjectorTest.java | 267 ----- .../injector/raw/DrawAfterWidgetsTest.java | 80 -- .../drawafterwidgets/Client_deob153.class | Bin 103334 -> 0 bytes .../drawafterwidgets/Client_deob160.class | Bin 126443 -> 0 bytes .../drawafterwidgets/Client_deob180.class | Bin 119603 -> 0 bytes .../drawafterwidgets/Client_ob153.class | Bin 645897 -> 0 bytes .../drawafterwidgets/Client_ob160.class | Bin 691407 -> 0 bytes .../drawafterwidgets/Client_ob180.class | Bin 705642 -> 0 bytes .../Rasterizer2D_deob153.class | Bin 16462 -> 0 bytes .../Rasterizer2D_deob160.class | Bin 16628 -> 0 bytes .../Rasterizer2D_deob180.class | Bin 13344 -> 0 bytes .../drawafterwidgets/Rasterizer2D_ob153.class | Bin 52056 -> 0 bytes .../drawafterwidgets/Rasterizer2D_ob160.class | Bin 50268 -> 0 bytes .../drawafterwidgets/Rasterizer2D_ob180.class | Bin 43336 -> 0 bytes runelite-client/runelite-client.gradle.kts | 2 - 39 files changed, 5647 deletions(-) delete mode 100644 injector-plugin/injector-plugin.gradle.kts delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/Inject.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectHook.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectionException.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/Injector.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/DrawMenu.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/HidePlayerAttacks.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java delete mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/ScriptVM.java delete mode 100644 injector-plugin/src/test/java/net/runelite/injector/InjectConstructTest.java delete mode 100644 injector-plugin/src/test/java/net/runelite/injector/InjectSetterTest.java delete mode 100644 injector-plugin/src/test/java/net/runelite/injector/InjectTest.java delete mode 100644 injector-plugin/src/test/java/net/runelite/injector/MixinInjectorTest.java delete mode 100644 injector-plugin/src/test/java/net/runelite/injector/raw/DrawAfterWidgetsTest.java delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Client_deob153.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Client_deob160.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Client_deob180.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Client_ob153.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Client_ob160.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Client_ob180.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob153.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob160.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_deob180.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob153.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob160.class delete mode 100644 injector-plugin/src/test/resources/drawafterwidgets/Rasterizer2D_ob180.class diff --git a/injector-plugin/injector-plugin.gradle.kts b/injector-plugin/injector-plugin.gradle.kts deleted file mode 100644 index 97d3974575..0000000000 --- a/injector-plugin/injector-plugin.gradle.kts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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. - */ - -group = "com.openosrs.rs" -description = "Injector" - -val deobfuscatedJar = "${project.extra["rootPath"]}/runescape-client/build/libs/runescape-client-${ProjectVersions.rlVersion}.jar" -val vanillaJar = "${buildDir}/vanilla-${ProjectVersions.rsversion}.jar" - -val vanilla = configurations.create("vanilla") - -dependencies { - annotationProcessor(Libraries.sisu) - - compileOnly(Libraries.mavenPluginAnnotations) - - implementation(Libraries.guava) - implementation(Libraries.mavenPluginApi) - implementation(Libraries.asmAll) - implementation(Libraries.asmUtil) - implementation(project(":deobfuscator")) - implementation(project(":runelite-mixins")) - implementation(project(":runelite-api")) - implementation(project(":runescape-api")) - - testImplementation(Libraries.junit) - testImplementation(Libraries.mockitoCore) - testImplementation(project(":deobfuscator")) - testImplementation(project(path = ":deobfuscator", configuration = "testArchives")) - - vanilla(Libraries.vanilla) -} - -tasks { - register("copyVanilla") { - copy { - from(configurations.get("vanilla")) - into("$buildDir") - } - } - - register("inject") { - dependsOn("copyVanilla") - - classpath = project.sourceSets.main.get().runtimeClasspath - main = "net.runelite.injector.Injector" - args(listOf(deobfuscatedJar, vanillaJar, project.extra["injectedClassesPath"])) - } - - compileJava { - dependsOn(":runescape-client:build") - - inputs.dir(project(":runescape-client").projectDir.absolutePath) - inputs.dir(project(":runescape-api").projectDir.absolutePath) - inputs.dir(project(":runelite-mixins").projectDir.absolutePath) - } - - jar { - dependsOn("inject") - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/Inject.java b/injector-plugin/src/main/java/net/runelite/injector/Inject.java deleted file mode 100644 index 4a87466311..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/Inject.java +++ /dev/null @@ -1,580 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.util.HashMap; -import java.util.Map; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.asm.Field; -import net.runelite.asm.Interfaces; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Annotations; -import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.DLoad; -import net.runelite.asm.attributes.code.instructions.FLoad; -import net.runelite.asm.attributes.code.instructions.ILoad; -import net.runelite.asm.attributes.code.instructions.LLoad; -import net.runelite.asm.pool.Class; -import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; -import net.runelite.deob.deobfuscators.arithmetic.DMath; -import static net.runelite.injector.InjectUtil.getFieldType; -import net.runelite.injector.raw.ClearColorBuffer; -import net.runelite.injector.raw.DrawAfterWidgets; -import net.runelite.injector.raw.Occluder; -import net.runelite.injector.raw.RasterizerAlpha; -import net.runelite.injector.raw.RenderDraw; -import net.runelite.injector.raw.ScriptVM; -import net.runelite.mapping.Import; -import net.runelite.rs.api.RSClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import net.runelite.injector.raw.HidePlayerAttacks; - -public class Inject -{ - public static final java.lang.Class CLIENT_CLASS = RSClient.class; - public static final String API_PACKAGE_BASE = "net.runelite.rs.api.RS"; - public static final String RL_API_PACKAGE_BASE = "net.runelite.api."; - private static final Logger logger = LoggerFactory.getLogger(Inject.class); - private final InjectHookMethod hookMethod = new InjectHookMethod(this); - - private final InjectGetter getters = new InjectGetter(this); - private final InjectSetter setters = new InjectSetter(this); - private final InjectInvoker invokes = new InjectInvoker(this); - private final InjectConstruct construct = new InjectConstruct(this); - - private final MixinInjector mixinInjector = new MixinInjector(this); - - // deobfuscated contains exports etc to apply to vanilla - private final ClassGroup deobfuscated, vanilla; - - public Inject(ClassGroup deobfuscated, ClassGroup vanilla) - { - this.deobfuscated = deobfuscated; - this.vanilla = vanilla; - } - - /** - * Convert a java.lang.Class to a Type - * - * @param c - * @return - */ - public static Type classToType(java.lang.Class c) - { - int dimms = 0; - while (c.isArray()) - { - c = c.getComponentType(); - ++dimms; - } - - if (c.isPrimitive()) - { - String s; - - switch (c.getName()) - { - case "int": - s = "I"; - break; - case "long": - s = "J"; - break; - case "boolean": - s = "Z"; - break; - case "char": - s = "C"; - break; - case "short": - s = "S"; - break; - case "float": - s = "F"; - break; - case "double": - s = "D"; - break; - case "byte": - s = "B"; - break; - case "void": - s = "V"; - break; - default: - throw new RuntimeException("unknown primitive type " + c.getName()); - } - - return Type.getType(s, dimms); - } - - return Type.getType("L" + c.getName().replace('.', '/') + ";", dimms); - } - - public Signature getMethodSignature(Method m) - { - Signature signature = m.getDescriptor(); - - Annotation obfSignature = m.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE); - if (obfSignature != null) - { - //Annotation exists. Signature was updated by us during deobfuscation - signature = DeobAnnotations.getObfuscatedSignature(m); - } - - return signature; - } - - /** - * Build a Signature from a java method - * - * @param method - * @return - */ - public Signature javaMethodToSignature(java.lang.reflect.Method method) - { - Signature.Builder builder = new Signature.Builder() - .setReturnType(classToType(method.getReturnType())); - for (java.lang.Class clazz : method.getParameterTypes()) - { - builder.addArgument(classToType(clazz)); - } - return builder.build(); - } - - public void run() throws InjectionException - { - Map implemented = new HashMap<>(); - - // inject interfaces first, so the validateTypeIsConvertibleTo - // check below works - for (ClassFile cf : deobfuscated.getClasses()) - { - Annotations an = cf.getAnnotations(); - - if (an == null || an.size() == 0) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(an); - if (obfuscatedName == null) - { - obfuscatedName = cf.getName(); - } - - ClassFile other = vanilla.findClass(obfuscatedName); - assert other != null : "unable to find vanilla class from obfuscated name: " + obfuscatedName; - - java.lang.Class implementingClass = injectInterface(cf, other); - // it can not implement an interface but still have exported static fields, which are - // moved to client - - implemented.put(cf, implementingClass); - } - - // Has to be done before mixins - // well, can be done after really - // but why do that when you can do it before - new RasterizerAlpha(this).inject(); - - // requires interfaces to be injected - mixinInjector.inject(); - construct.inject(implemented); - - for (ClassFile cf : deobfuscated.getClasses()) - { - java.lang.Class implementingClass = implemented.get(cf); - Annotations an = cf.getAnnotations(); - - if (an == null || an.size() == 0) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(an); - if (obfuscatedName == null) - { - obfuscatedName = cf.getName(); - } - - ClassFile other = vanilla.findClass(obfuscatedName); - assert other != null : "unable to find vanilla class from obfuscated name: " + obfuscatedName; - - for (Field f : cf.getFields()) - { - an = f.getAnnotations(); - - if (an == null || an.find(DeobAnnotations.EXPORT) == null) - { - continue; // not an exported field - } - - Annotation exportAnnotation = an.find(DeobAnnotations.EXPORT); - String exportedName = exportAnnotation.getElement().getString(); - - obfuscatedName = DeobAnnotations.getObfuscatedName(an); - - Annotation getterAnnotation = an.find(DeobAnnotations.OBFUSCATED_GETTER); - Number getter = null; - if (getterAnnotation != null) - { - getter = (Number) getterAnnotation.getElement().getValue(); - } - // the ob jar is the same as the vanilla so this field must exist in this class. - - Type obType = getFieldType(f); - Field otherf = other.findField(obfuscatedName, obType); - assert otherf != null; - - assert f.isStatic() == otherf.isStatic(); - - ClassFile targetClass = f.isStatic() ? vanilla.findClass("client") : other; // target class for getter - java.lang.Class targetApiClass = f.isStatic() ? CLIENT_CLASS : implementingClass; // target api class for getter - if (targetApiClass == null) - { - assert !f.isStatic(); - - // non static field exported on non exported interface - // logger.debug("Non static exported field {} on non exported interface", exportedName); - continue; - } - - java.lang.reflect.Method apiMethod = findImportMethodOnApi(targetApiClass, exportedName, true); - if (apiMethod != null) - { - Number setter = null; - if (getter != null) - { - setter = DMath.modInverse(getter); // inverse getter to get the setter - } - - setters.injectSetter(targetClass, targetApiClass, otherf, exportedName, setter); - } - - apiMethod = findImportMethodOnApi(targetApiClass, exportedName, false); - if (apiMethod == null) - { - //logger.debug("Unable to find import method on api class {} with imported name {}, not injecting getter", targetApiClass, exportedName); - continue; - } - - // check that otherf is converable to apiMethod's - // return type - Type fieldType = otherf.getType(); - Type returnType = classToType(apiMethod.getReturnType()); - if (!validateTypeIsConvertibleTo(fieldType, returnType)) - { - throw new InjectionException("Type " + fieldType + " is not convertable to " + returnType + " for getter " + apiMethod); - } - - getters.injectGetter(targetClass, apiMethod, otherf, getter); - } - - for (Method m : cf.getMethods()) - { - hookMethod.process(m); - invokes.process(m, other, implementingClass); - } - } - - logger.info("Injected {} getters, {} setters, {} invokers", - getters.getInjectedGetters(), - setters.getInjectedSetters(), invokes.getInjectedInvokers()); - - new DrawAfterWidgets(this).inject(); - new ScriptVM(this).inject(); - new ClearColorBuffer(this).inject(); - new RenderDraw(this).inject(); - // new DrawMenu(this).inject(); - new Occluder(this).inject(); - new HidePlayerAttacks(this).inject(); - } - - private java.lang.Class injectInterface(ClassFile cf, ClassFile other) - { - Annotations an = cf.getAnnotations(); - if (an == null) - { - return null; - } - - Annotation a = an.find(DeobAnnotations.IMPLEMENTS); - if (a == null) - { - return null; - } - - String ifaceName = API_PACKAGE_BASE + a.getElement().getString(); - java.lang.Class apiClass; - - try - { - apiClass = java.lang.Class.forName(ifaceName); - } - catch (ClassNotFoundException ex) - { - logger.trace("Class {} implements nonexistent interface {}, skipping interface injection", - cf.getName(), - ifaceName); - return null; - } - - String ifaceNameInternal = ifaceName.replace('.', '/'); // to internal name - Class clazz = new Class(ifaceNameInternal); - - Interfaces interfaces = other.getInterfaces(); - interfaces.addInterface(clazz); - - return apiClass; - } - - public java.lang.reflect.Method findImportMethodOnApi(java.lang.Class clazz, String name, Boolean setter) - { - for (java.lang.reflect.Method method : clazz.getDeclaredMethods()) - { - if (method.isSynthetic()) - { - /* - * If you override an interface method in another interface - * with a return type that is a child of the overriden methods - * return type, both methods end up in the interface, and both - * are *annotated*. But the base one is synthetic. - */ - continue; - } - - Import i = method.getAnnotation(Import.class); - - if (i == null || !name.equals(i.value()) || (setter != null && (method.getParameterCount() > 0) != setter)) - { - continue; - } - - return method; - } - - return null; - } - - /** - * create a load instruction for a variable of type from a given index - * - * @param instructions - * @param type - * @param index - * @return - */ - public Instruction createLoadForTypeIndex(Instructions instructions, Type type, int index) - { - if (type.getDimensions() > 0 || !type.isPrimitive()) - { - return new ALoad(instructions, index); - } - - switch (type.toString()) - { - case "B": - case "C": - case "I": - case "S": - case "Z": - return new ILoad(instructions, index); - case "D": - return new DLoad(instructions, index); - case "F": - return new FLoad(instructions, index); - case "J": - return new LLoad(instructions, index); - default: - throw new RuntimeException("Unknown type"); - } - } - - ClassFile toDeobClass(ClassFile obClass) - { - for (ClassFile cf : deobfuscated.getClasses()) - { - String obfuscatedName = DeobAnnotations.getObfuscatedName(cf.getAnnotations()); - - if (obClass.getName().equalsIgnoreCase(obfuscatedName)) - { - return cf; - } - } - - return null; - } - - Type deobfuscatedTypeToApiType(Type type) throws InjectionException - { - if (type.isPrimitive()) - { - return type; - } - - ClassFile cf = deobfuscated.findClass(type.getInternalName()); - if (cf == null) - { - return type; // not my type - } - - java.lang.Class rsApiType; - try - { - rsApiType = java.lang.Class.forName(API_PACKAGE_BASE + cf.getName().replace("/", ".")); - } - catch (ClassNotFoundException ex) - { - throw new InjectionException("Deobfuscated type " + type.getInternalName() + " has no API type", ex); - } - - java.lang.Class rlApiType = null; - - for (java.lang.Class inter : rsApiType.getInterfaces()) - { - if (inter.getName().startsWith(RL_API_PACKAGE_BASE)) - { - rlApiType = inter; - } - } - - // if (rlApiType == null) - // { - // throw new InjectionException("RS API type " + rsApiType + " does not extend RL API interface"); - // } - - final java.lang.Class finalType = rlApiType == null ? rsApiType : rlApiType; - - return Type.getType("L" + finalType.getName().replace('.', '/') + ";", type.getDimensions()); - } - - Type apiTypeToDeobfuscatedType(Type type) - { - if (type.isPrimitive()) - { - return type; - } - - String internalName = type.getInternalName().replace('/', '.'); - if (!internalName.startsWith(API_PACKAGE_BASE)) - { - return type; // not an rs api type - } - - return Type.getType("L" + type.getInternalName().substring(API_PACKAGE_BASE.length()) + ";", type.getDimensions()); - } - - ClassFile findVanillaForInterface(java.lang.Class clazz) - { - String className = clazz.getName().replace('.', '/'); - for (ClassFile cf : getVanilla().getClasses()) - { - for (net.runelite.asm.pool.Class cl : cf.getInterfaces().getInterfaces()) - { - if (cl.getName().equals(className)) - { - return cf; - } - } - } - return null; - } - - private boolean validateTypeIsConvertibleTo(Type from, Type to) throws InjectionException - { - if (from.getDimensions() != to.getDimensions()) - { - throw new InjectionException("Array dimension mismatch"); - } - - if (from.isPrimitive()) - { - return true; - } - - ClassFile vanillaClass = vanilla.findClass(from.getInternalName()); - if (vanillaClass == null) - { - return true; - } - - boolean okay = false; - for (Class inter : vanillaClass.getInterfaces().getInterfaces()) - { - java.lang.Class c; - - try - { - c = java.lang.Class.forName(inter.getName().replace('/', '.')); - } - catch (ClassNotFoundException ex) - { - continue; - } - - okay |= check(c, to); - } - - return okay; - } - - private boolean check(java.lang.Class c, Type type) - { - String s = type.getInternalName() - .replace('/', '.'); - - if (c.getName().equals(s)) - { - return true; - } - - for (java.lang.Class c2 : c.getInterfaces()) - { - if (check(c2, type)) - { - return true; - } - } - return false; - } - - public final ClassGroup getDeobfuscated() - { - return deobfuscated; - } - - public final ClassGroup getVanilla() - { - return vanilla; - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java b/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java deleted file mode 100644 index 8a87451da6..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectConstruct.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.CheckCast; -import net.runelite.asm.attributes.code.instructions.Dup; -import net.runelite.asm.attributes.code.instructions.InvokeSpecial; -import net.runelite.asm.attributes.code.instructions.New; -import net.runelite.asm.attributes.code.instructions.Return; -import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; -import net.runelite.mapping.Construct; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class InjectConstruct -{ - private static final Logger logger = LoggerFactory.getLogger(InjectConstruct.class); - - private final Inject inject; - - InjectConstruct(Inject inject) - { - this.inject = inject; - } - - public void inject(Map implemented) throws InjectionException - { - for (Entry entry : implemented.entrySet()) - { - Class clazz = entry.getValue(); - ClassFile cf = entry.getKey(); - - if (clazz == null) - { - continue; - } - - for (java.lang.reflect.Method method : clazz.getDeclaredMethods()) - { - if (method.isSynthetic()) - { - continue; - } - - Construct construct = method.getAnnotation(Construct.class); - if (construct == null) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(cf.getAnnotations()); - if (obfuscatedName == null) - { - obfuscatedName = cf.getName(); - } - - ClassGroup vanilla = inject.getVanilla(); - ClassFile other = vanilla.findClass(obfuscatedName); - assert other != null : "unable to find vanilla class from obfuscated name: " + obfuscatedName; - - injectConstruct(other, method); - } - } - } - - void injectConstruct(ClassFile targetClass, java.lang.reflect.Method apiMethod) throws InjectionException - { - logger.info("Injecting construct for {}", apiMethod); - - assert targetClass.findMethod(apiMethod.getName()) == null; - - Class typeToConstruct = apiMethod.getReturnType(); - ClassFile vanillaClass = inject.findVanillaForInterface(typeToConstruct); - if (vanillaClass == null) - { - throw new InjectionException("Unable to find vanilla class which implements interface " + typeToConstruct); - } - - Signature sig = inject.javaMethodToSignature(apiMethod); - - Signature constructorSig = new Signature.Builder() - .addArguments(Stream.of(apiMethod.getParameterTypes()) - .map(arg -> - { - ClassFile vanilla = inject.findVanillaForInterface(arg); - if (vanilla != null) - { - return new Type("L" + vanilla.getName() + ";"); - } - return Inject.classToType(arg); - }) - .collect(Collectors.toList())) - .setReturnType(Type.VOID) - .build(); - Method vanillaConstructor = vanillaClass.findMethod("", constructorSig); - if (vanillaConstructor == null) - { - throw new InjectionException("Unable to find constructor for " + vanillaClass.getName() + "." + constructorSig); - } - - Method setterMethod = new Method(targetClass, apiMethod.getName(), sig); - setterMethod.setAccessFlags(ACC_PUBLIC); - targetClass.addMethod(setterMethod); - - Code code = new Code(setterMethod); - setterMethod.setCode(code); - - Instructions instructions = code.getInstructions(); - List ins = instructions.getInstructions(); - - ins.add(new New(instructions, vanillaClass.getPoolClass())); - ins.add(new Dup(instructions)); - int idx = 1; - int parameter = 0; - for (Type type : vanillaConstructor.getDescriptor().getArguments()) - { - Instruction load = inject.createLoadForTypeIndex(instructions, type, idx); - idx += type.getSize(); - ins.add(load); - - Type paramType = sig.getTypeOfArg(parameter); - if (!type.equals(paramType)) - { - CheckCast checkCast = new CheckCast(instructions); - checkCast.setType(type); - ins.add(checkCast); - } - - ++parameter; - } - ins.add(new InvokeSpecial(instructions, vanillaConstructor.getPoolMethod())); - ins.add(new Return(instructions)); - - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java b/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java deleted file mode 100644 index cd94ee80d8..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectGetter.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.util.List; -import net.runelite.asm.ClassFile; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.InstructionType; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.GetField; -import net.runelite.asm.attributes.code.instructions.GetStatic; -import net.runelite.asm.attributes.code.instructions.IMul; -import net.runelite.asm.attributes.code.instructions.LDC; -import net.runelite.asm.attributes.code.instructions.LMul; -import net.runelite.asm.attributes.code.instructions.Return; -import net.runelite.asm.signature.Signature; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class InjectGetter -{ - private static final Logger logger = LoggerFactory.getLogger(InjectGetter.class); - - private final Inject inject; - - private int injectedGetters; - - InjectGetter(Inject inject) - { - this.inject = inject; - } - - void injectGetter(ClassFile clazz, java.lang.reflect.Method method, Field field, Number getter) - { - // clazz = class file we're injecting the method into. - // method = api method (java reflect) that we're overriding - // field = field we're getting. might not be in this class if static. - // getter = encryption getter - - assert clazz.findMethod(method.getName()) == null; - assert field.isStatic() || field.getClassFile() == clazz; - - Signature sig = new Signature.Builder() - .setReturnType(Inject.classToType(method.getReturnType())) - .build(); - Method getterMethod = new Method(clazz, method.getName(), sig); - getterMethod.setAccessFlags(ACC_PUBLIC); - - // create code - Code code = new Code(getterMethod); - getterMethod.setCode(code); - - Instructions instructions = code.getInstructions(); - List ins = instructions.getInstructions(); - - if (field.isStatic()) - { - code.setMaxStack(1); - - ins.add(new GetStatic(instructions, field.getPoolField())); - } - else - { - code.setMaxStack(2); - - ins.add(new ALoad(instructions, 0)); - ins.add(new GetField(instructions, field.getPoolField())); - } - - if (getter != null) - { - code.setMaxStack(2); - - assert getter instanceof Integer || getter instanceof Long; - - if (getter instanceof Integer) - { - ins.add(new LDC(instructions, (int) getter)); - ins.add(new IMul(instructions)); - } - else - { - ins.add(new LDC(instructions, (long) getter)); - ins.add(new LMul(instructions)); - } - } - - InstructionType returnType; - if (field.getType().isPrimitive() && field.getType().getDimensions() == 0) - { - switch (field.getType().toString()) - { - case "B": - case "C": - case "I": - case "S": - case "Z": - returnType = InstructionType.IRETURN; - break; - case "D": - returnType = InstructionType.DRETURN; - break; - case "F": - returnType = InstructionType.FRETURN; - break; - case "J": - returnType = InstructionType.LRETURN; - break; - default: - throw new RuntimeException("Unknown type"); - } - } - else - { - returnType = InstructionType.ARETURN; - } - - ins.add(new Return(instructions, returnType)); - - clazz.addMethod(getterMethod); - ++injectedGetters; - } - - int getInjectedGetters() - { - return injectedGetters; - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java b/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java deleted file mode 100644 index 19ae3a3df6..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectHook.java +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import com.google.common.collect.Lists; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.InstructionType; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instruction.types.DupInstruction; -import net.runelite.asm.attributes.code.instruction.types.SetFieldInstruction; -import net.runelite.asm.attributes.code.instructions.ArrayStore; -import net.runelite.asm.attributes.code.instructions.CheckCast; -import net.runelite.asm.attributes.code.instructions.Dup; -import net.runelite.asm.attributes.code.instructions.IMul; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.attributes.code.instructions.InvokeVirtual; -import net.runelite.asm.attributes.code.instructions.LDC; -import net.runelite.asm.attributes.code.instructions.LMul; -import net.runelite.asm.attributes.code.instructions.PutField; -import net.runelite.asm.attributes.code.instructions.Swap; -import net.runelite.asm.execution.Execution; -import net.runelite.asm.execution.InstructionContext; -import net.runelite.asm.execution.StackContext; -import net.runelite.asm.signature.Signature; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class InjectHook -{ - private static final Logger logger = LoggerFactory.getLogger(InjectHook.class); - private static final String HOOK_METHOD_SIGNATURE = "(I)V"; - private static final String CLINIT = ""; - private final Inject inject; - private final Map hooked = new HashMap<>(); - private int injectedHooks; - - InjectHook(Inject inject) - { - this.inject = inject; - } - - void hook(Field field, HookInfo hookInfo) - { - hooked.put(field, hookInfo); - } - - void run() - { - Execution e = new Execution(inject.getVanilla()); - e.populateInitialMethods(); - - Set done = new HashSet<>(); - Set doneIh = new HashSet<>(); - - e.addExecutionVisitor((InstructionContext ic) -> - { - Instruction i = ic.getInstruction(); - Instructions ins = i.getInstructions(); - Code code = ins.getCode(); - Method method = code.getMethod(); - - if (method.getName().equals(CLINIT)) - { - return; - } - - if (!(i instanceof SetFieldInstruction)) - { - return; - } - - if (!done.add(i)) - { - return; - } - - SetFieldInstruction sfi = (SetFieldInstruction) i; - Field fieldBeingSet = sfi.getMyField(); - - if (fieldBeingSet == null) - { - return; - } - - HookInfo hookInfo = hooked.get(fieldBeingSet); - if (hookInfo == null) - { - return; - } - - String hookName = hookInfo.fieldName; - assert hookName != null; - - logger.trace("Found injection location for hook {} at instruction {}", hookName, sfi); - ++injectedHooks; - - StackContext value = ic.getPops().get(0); - - StackContext objectStackContext = null; - if (sfi instanceof PutField) - { - objectStackContext = ic.getPops().get(1); - } - - int idx = ins.getInstructions().indexOf(sfi); - assert idx != -1; - - try - { - if (hookInfo.before) - { - injectCallbackBefore(ins, idx, hookInfo, null, objectStackContext, value); - } - else - { - // idx + 1 to insert after the set - injectCallback(ins, idx + 1, hookInfo, null, objectStackContext); - } - } - catch (InjectionException ex) - { - throw new RuntimeException(ex); - } - }); - - // these look like: - // getfield - // iload_0 - // iconst_0 - // iastore - e.addExecutionVisitor((InstructionContext ic) -> - { - Instruction i = ic.getInstruction(); - Instructions ins = i.getInstructions(); - Code code = ins.getCode(); - Method method = code.getMethod(); - - if (method.getName().equals(CLINIT)) - { - return; - } - - if (!(i instanceof ArrayStore)) - { - return; - } - - if (!doneIh.add(i)) - { - return; - } - - ArrayStore as = (ArrayStore) i; - - Field fieldBeingSet = as.getMyField(ic); - if (fieldBeingSet == null) - { - return; - } - - HookInfo hookInfo = hooked.get(fieldBeingSet); - if (hookInfo == null) - { - return; - } - - String hookName = hookInfo.fieldName; - - StackContext value = ic.getPops().get(0); - StackContext index = ic.getPops().get(1); - - StackContext arrayReference = ic.getPops().get(2); - InstructionContext arrayReferencePushed = arrayReference.getPushed(); - - StackContext objectStackContext = null; - if (arrayReferencePushed.getInstruction().getType() == InstructionType.GETFIELD) - { - objectStackContext = arrayReferencePushed.getPops().get(0); - } - - // inject hook after 'i' - logger.info("Found array injection location for hook {} at instruction {}", hookName, i); - ++injectedHooks; - - int idx = ins.getInstructions().indexOf(i); - assert idx != -1; - - try - { - if (hookInfo.before) - { - injectCallbackBefore(ins, idx, hookInfo, index, objectStackContext, value); - } - else - { - injectCallback(ins, idx + 1, hookInfo, index, objectStackContext); - } - } - catch (InjectionException ex) - { - throw new RuntimeException(ex); - } - }); - - e.run(); - } - - private void injectCallbackBefore(Instructions ins, int idx, HookInfo hookInfo, StackContext index, StackContext object, StackContext value) throws InjectionException - { - Signature signature = hookInfo.method.getDescriptor(); - Type methodArgumentType = signature.getTypeOfArg(0); - - if (!hookInfo.method.isStatic()) - { - if (object == null) - { - throw new InjectionException("null object"); - } - - ins.getInstructions().add(idx++, new Dup(ins)); // dup value - idx = recursivelyPush(ins, idx, object); - ins.getInstructions().add(idx++, new Swap(ins)); - if (hookInfo.getter != null) - { - assert hookInfo.getter instanceof Integer || hookInfo.getter instanceof Long; - - if (hookInfo.getter instanceof Integer) - { - ins.getInstructions().add(idx++, new LDC(ins, (int) hookInfo.getter)); - ins.getInstructions().add(idx++, new IMul(ins)); - } - else - { - ins.getInstructions().add(idx++, new LDC(ins, (long) hookInfo.getter)); - ins.getInstructions().add(idx++, new LMul(ins)); - } - } - if (!value.type.equals(methodArgumentType)) - { - CheckCast checkCast = new CheckCast(ins); - checkCast.setType(methodArgumentType); - ins.getInstructions().add(idx++, checkCast); - } - if (index != null) - { - idx = recursivelyPush(ins, idx, index); - } - - InvokeVirtual invoke = new InvokeVirtual(ins, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(hookInfo.clazz), - hookInfo.method.getName(), - signature - ) - ); - ins.getInstructions().add(idx++, invoke); - } - else - { - ins.getInstructions().add(idx++, new Dup(ins)); // dup value - if (!value.type.equals(methodArgumentType)) - { - CheckCast checkCast = new CheckCast(ins); - checkCast.setType(methodArgumentType); - ins.getInstructions().add(idx++, checkCast); - } - if (index != null) - { - idx = recursivelyPush(ins, idx, index); - } - - InvokeStatic invoke = new InvokeStatic(ins, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(hookInfo.clazz), - hookInfo.method.getName(), - signature - ) - ); - ins.getInstructions().add(idx++, invoke); - } - } - - private int recursivelyPush(Instructions ins, int idx, StackContext sctx) - { - InstructionContext ctx = sctx.getPushed(); - if (ctx.getInstruction() instanceof DupInstruction) - { - DupInstruction dupInstruction = (DupInstruction) ctx.getInstruction(); - sctx = dupInstruction.getOriginal(sctx); - ctx = sctx.getPushed(); - } - - for (StackContext s : Lists.reverse(ctx.getPops())) - { - idx = recursivelyPush(ins, idx, s); - } - - ins.getInstructions().add(idx++, ctx.getInstruction().clone()); - return idx; - } - - private void injectCallback(Instructions ins, int idx, HookInfo hookInfo, StackContext index, StackContext objectPusher) throws InjectionException - { - if (!hookInfo.method.isStatic()) - { - if (objectPusher == null) - { - throw new InjectionException("Null object pusher"); - } - - idx = recursivelyPush(ins, idx, objectPusher); - if (index != null) - { - idx = recursivelyPush(ins, idx, index); - } - else - { - ins.getInstructions().add(idx++, new LDC(ins, -1)); - } - - InvokeVirtual invoke = new InvokeVirtual(ins, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(hookInfo.clazz), - hookInfo.method.getName(), - new Signature(HOOK_METHOD_SIGNATURE) - ) - ); - ins.getInstructions().add(idx++, invoke); - - } - else - { - if (index != null) - { - idx = recursivelyPush(ins, idx, index); - } - else - { - ins.getInstructions().add(idx++, new LDC(ins, -1)); - } - - InvokeStatic invoke = new InvokeStatic(ins, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(hookInfo.clazz), - hookInfo.method.getName(), - new Signature(HOOK_METHOD_SIGNATURE) - ) - ); - ins.getInstructions().add(idx++, invoke); - } - } - - int getInjectedHooks() - { - return injectedHooks; - } - - static class HookInfo - { - String fieldName; - String clazz; - Method method; - boolean before; - Number getter; - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java b/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java deleted file mode 100644 index 3c304807be..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectHookMethod.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Annotations; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.InstructionType; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instruction.types.InvokeInstruction; -import net.runelite.asm.attributes.code.instruction.types.ReturnInstruction; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.attributes.code.instructions.InvokeVirtual; -import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class InjectHookMethod -{ - public static final String HOOKS = "net/runelite/client/callback/Hooks"; - private static final Logger logger = LoggerFactory.getLogger(InjectHookMethod.class); - private final Inject inject; - - InjectHookMethod(Inject inject) - { - this.inject = inject; - } - - void process(Method method) throws InjectionException - { - Annotations an = method.getAnnotations(); - if (an == null) - { - return; - } - - Annotation a = an.find(DeobAnnotations.HOOK); - if (a == null) - { - return; - } - - String hookName = a.getElement().getString(); - boolean end = a.getElements().size() == 2 && a.getElements().get(1).getValue().equals(true); - - inject(null, method, hookName, end, true); - } - - public void inject(Method hookMethod, Method method, String name, boolean end, boolean useHooks) throws InjectionException - { - Annotations an = method.getAnnotations(); - - // Method is hooked - // Find equivalent method in vanilla, and insert callback at the beginning - ClassFile cf = method.getClassFile(); - String obfuscatedMethodName = DeobAnnotations.getObfuscatedName(an), - obfuscatedClassName = DeobAnnotations.getObfuscatedName(cf.getAnnotations()); - - // might be a constructor - if (obfuscatedMethodName == null) - { - obfuscatedMethodName = method.getName(); - } - - assert obfuscatedClassName != null : "hook on method in class with no obfuscated name"; - assert obfuscatedMethodName != null : "hook on method with no obfuscated name"; - - Signature obfuscatedSignature = inject.getMethodSignature(method); - - ClassGroup vanilla = inject.getVanilla(); - ClassFile vanillaClass = vanilla.findClass(obfuscatedClassName); - Method vanillaMethod = vanillaClass.findMethod(obfuscatedMethodName, obfuscatedSignature); - assert method.isStatic() == vanillaMethod.isStatic(); - - // Insert instructions at beginning of method - injectHookMethod(hookMethod, name, end, method, vanillaMethod, useHooks); - } - - private void injectHookMethod(Method hookMethod, String hookName, boolean end, Method deobMethod, Method vanillaMethod, boolean useHooks) throws InjectionException - { - Code code = vanillaMethod.getCode(); - if (code == null) - { - logger.warn(vanillaMethod + " code is null"); - } - Instructions instructions = code.getInstructions(); - - Signature.Builder builder = new Signature.Builder() - .setReturnType(Type.VOID); // Hooks always return void - - for (Type type : deobMethod.getDescriptor().getArguments()) - { - builder.addArgument(inject.deobfuscatedTypeToApiType(type)); - } - - assert deobMethod.isStatic() == vanillaMethod.isStatic(); - - boolean modifiedSignature = false; - if (!deobMethod.isStatic() && useHooks) - { - // Add variable to signature - builder.addArgument(0, inject.deobfuscatedTypeToApiType(new Type(deobMethod.getClassFile().getName()))); - modifiedSignature = true; - } - - Signature signature = builder.build(); - - List insertIndexes = findHookLocations(hookName, end, vanillaMethod); - insertIndexes.sort((a, b) -> Integer.compare(b, a)); - - for (int insertPos : insertIndexes) - { - if (!deobMethod.isStatic()) - { - instructions.addInstruction(insertPos++, new ALoad(instructions, 0)); - } - - int signatureStart = modifiedSignature ? 1 : 0; - int index = deobMethod.isStatic() ? 0 : 1; // current variable index - - for (int i = signatureStart; i < signature.size(); ++i) - { - Type type = signature.getTypeOfArg(i); - - Instruction load = inject.createLoadForTypeIndex(instructions, type, index); - instructions.addInstruction(insertPos++, load); - - index += type.getSize(); - } - - InvokeInstruction invoke; - - // use old Hooks callback - if (useHooks) - { - // Invoke callback - invoke = new InvokeStatic(instructions, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(HOOKS), - hookName, - signature - ) - ); - } - else - { - // Invoke methodhook - assert hookMethod != null; - - if (vanillaMethod.isStatic()) - { - invoke = new InvokeStatic(instructions, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class("client"), // Static methods are in client - hookMethod.getName(), - signature - ) - ); - } - else - { - // otherwise invoke member function - //instructions.addInstruction(insertPos++, new ALoad(instructions, 0)); - invoke = new InvokeVirtual(instructions, - new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(vanillaMethod.getClassFile().getName()), - hookMethod.getName(), - hookMethod.getDescriptor() - ) - ); - } - } - - instructions.addInstruction(insertPos++, (Instruction) invoke); - } - - logger.info("Injected method hook {} in {} with {} args: {}", - hookName, vanillaMethod, signature.size(), - signature.getArguments()); - } - - private List findHookLocations(String hookName, boolean end, Method vanillaMethod) throws InjectionException - { - Instructions instructions = vanillaMethod.getCode().getInstructions(); - - if (end) - { - // find return - List returns = instructions.getInstructions().stream() - .filter(i -> i instanceof ReturnInstruction) - .collect(Collectors.toList()); - List indexes = new ArrayList<>(); - - for (Instruction ret : returns) - { - int idx = instructions.getInstructions().indexOf(ret); - assert idx != -1; - indexes.add(idx); - } - - return indexes; - } - - if (!vanillaMethod.getName().equals("")) - { - return Arrays.asList(0); - } - - // Find index after invokespecial - for (int i = 0; i < instructions.getInstructions().size(); ++i) - { - Instruction in = instructions.getInstructions().get(i); - - if (in.getType() == InstructionType.INVOKESPECIAL) - { - return Arrays.asList(i + 1); // one after - } - } - - throw new IllegalStateException("constructor with no invokespecial"); - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java b/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java deleted file mode 100644 index 3367b26c7a..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectInvoker.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.util.List; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Annotations; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.InstructionType; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.BiPush; -import net.runelite.asm.attributes.code.instructions.CheckCast; -import net.runelite.asm.attributes.code.instructions.DLoad; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.attributes.code.instructions.InvokeVirtual; -import net.runelite.asm.attributes.code.instructions.LDC; -import net.runelite.asm.attributes.code.instructions.LLoad; -import net.runelite.asm.attributes.code.instructions.Return; -import net.runelite.asm.attributes.code.instructions.SiPush; -import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; -import static net.runelite.deob.DeobAnnotations.EXPORT; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class InjectInvoker -{ - private static final Logger logger = LoggerFactory.getLogger(InjectInvoker.class); - - private final Inject inject; - - private int injectedInvokers; - - InjectInvoker(Inject inject) - { - this.inject = inject; - } - - /** - * Inject an invoker for a method - * - * @param m Method in the deobfuscated client to inject an invoker for - * @param other Class in the vanilla client of the same class m is a - * member of - * @param implementingClass Java class for the API interface the class - * will implement - */ - void process(Method m, ClassFile other, java.lang.Class implementingClass) - { - Annotations an = m.getAnnotations(); - - if (an == null || an.find(EXPORT) == null) - { - return; // not an exported method - } - - String exportedName = DeobAnnotations.getExportedName(an); - String obfuscatedName = DeobAnnotations.getObfuscatedName(an); - - if (obfuscatedName == null) - { - obfuscatedName = m.getName(); - } - - String garbage = DeobAnnotations.getDecoder(m); - Method otherm = other.findMethod(obfuscatedName, inject.getMethodSignature(m)); - - assert otherm != null; - assert m.isStatic() == otherm.isStatic(); - - ClassGroup vanilla = inject.getVanilla(); - - ClassFile targetClass = m.isStatic() ? vanilla.findClass("client") : other; - - // Place into implementing class, unless the method is static - java.lang.Class targetClassJava = m.isStatic() ? Inject.CLIENT_CLASS : implementingClass; - - if (targetClassJava == null) - { - assert !m.isStatic(); - - // non static exported method on non exported interface, weird. - // logger.debug("Non static exported method {} on non exported interface", exportedName); - return; - } - - java.lang.reflect.Method apiMethod = inject.findImportMethodOnApi(targetClassJava, exportedName, null); // api method to invoke 'otherm' - if (apiMethod == null) - { - // logger.debug("Unable to find api method on {} with imported name {}, not injecting invoker", targetClassJava, exportedName); - return; - } - - injectInvoker(targetClass, apiMethod, m, otherm, garbage); - ++injectedInvokers; - } - - private void injectInvoker(ClassFile clazz, java.lang.reflect.Method method, Method deobfuscatedMethod, Method invokeMethod, String garbage) - { - // clazz = clazz to add invoker to - // method = api method to override - // deobfuscatedMethod = deobfuscated method, used to get the deobfuscated signature - // invokeMethod = method to invoke, obfuscated - - if (clazz.findMethod(method.getName(), deobfuscatedMethod.getDescriptor()) != null) - { - logger.warn("Not injecting method {} because it already exists!", method); - return; // this can happen from exporting a field and method with the same name - } - - assert invokeMethod.isStatic() == deobfuscatedMethod.isStatic(); - assert invokeMethod.isStatic() || invokeMethod.getClassFile() == clazz; - - Type lastGarbageArgumentType = null; - - if (deobfuscatedMethod.getDescriptor().getArguments().size() != invokeMethod.getDescriptor().getArguments().size()) - { - // allow for obfuscated method to have a single bogus signature at the end - assert deobfuscatedMethod.getDescriptor().size() + 1 == invokeMethod.getDescriptor().size(); - - List arguments = invokeMethod.getDescriptor().getArguments(); - lastGarbageArgumentType = arguments.get(arguments.size() - 1); - } - - // Injected method signature is always the same as the API - Signature apiSignature = inject.javaMethodToSignature(method); - Method invokerMethodSignature = new Method(clazz, method.getName(), apiSignature); - invokerMethodSignature.setAccessFlags(ACC_PUBLIC); - - // create code attribute - Code code = new Code(invokerMethodSignature); - invokerMethodSignature.setCode(code); - - Instructions instructions = code.getInstructions(); - List ins = instructions.getInstructions(); - - code.setMaxStack(1 + invokeMethod.getDescriptor().size()); // this + arguments - - // load function arguments onto the stack. - int index = 0; - if (!invokeMethod.isStatic()) - { - ins.add(new ALoad(instructions, index++)); // this - } - else - { - ++index; // this method is always non static - } - for (int i = 0; i < deobfuscatedMethod.getDescriptor().size(); ++i) - { - Type type = deobfuscatedMethod.getDescriptor().getTypeOfArg(i); - - Instruction loadInstruction = inject.createLoadForTypeIndex(instructions, type, index); - ins.add(loadInstruction); - - Signature invokeDesc = invokeMethod.getDescriptor(); - Type obType = invokeDesc.getTypeOfArg(i); - if (!type.equals(obType)) - { - CheckCast checkCast = new CheckCast(instructions); - checkCast.setType(obType); - ins.add(checkCast); - } - - if (loadInstruction instanceof DLoad || loadInstruction instanceof LLoad) - { - index += 2; - } - else - { - index += 1; - } - } - - if (lastGarbageArgumentType != null) - { - // function requires garbage value - - // if garbage is null here it might just be an unused parameter, not part of the obfuscation - if (garbage == null) - { - garbage = "0"; - } - - switch (lastGarbageArgumentType.toString()) - { - case "Z": - case "B": - case "C": - ins.add(new BiPush(instructions, Byte.parseByte(garbage))); - break; - case "S": - ins.add(new SiPush(instructions, Short.parseShort(garbage))); - break; - case "I": - ins.add(new LDC(instructions, Integer.parseInt(garbage))); - break; - case "D": - ins.add(new LDC(instructions, Double.parseDouble(garbage))); - break; - case "F": - ins.add(new LDC(instructions, Float.parseFloat(garbage))); - break; - case "J": - ins.add(new LDC(instructions, Long.parseLong(garbage))); - break; - default: - throw new RuntimeException("Unknown type"); - } - } - - if (invokeMethod.isStatic()) - { - ins.add(new InvokeStatic(instructions, invokeMethod.getPoolMethod())); - } - else - { - ins.add(new InvokeVirtual(instructions, invokeMethod.getPoolMethod())); - } - - Type returnValue = invokeMethod.getDescriptor().getReturnValue(); - InstructionType returnType; - - if (returnValue.isPrimitive() && returnValue.getDimensions() == 0) - { - switch (returnValue.toString()) - { - case "Z": - case "I": - returnType = InstructionType.IRETURN; - break; - case "J": - returnType = InstructionType.LRETURN; - break; - case "F": - returnType = InstructionType.FRETURN; - break; - case "D": - returnType = InstructionType.DRETURN; - break; - case "V": - returnType = InstructionType.RETURN; - break; - default: - assert false; - return; - } - } - else - { - returnType = InstructionType.ARETURN; - } - - ins.add(new Return(instructions, returnType)); - - clazz.addMethod(invokerMethodSignature); - } - - int getInjectedInvokers() - { - return injectedInvokers; - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java b/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java deleted file mode 100644 index b7c22194fe..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectMojo.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.deob.clientver.ClientVersion; -import net.runelite.deob.util.JarUtil; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; - -@Mojo( - name = "runelite-injector", - defaultPhase = LifecyclePhase.GENERATE_RESOURCES -) -public class InjectMojo extends AbstractMojo -{ - private final Log log = getLog(); - @Parameter(defaultValue = "${project.build.outputDirectory}") - private File outputDirectory; - @Parameter(defaultValue = "./runescape-client/target/rs-client-${project.version}.jar", readonly = true, required = true) - private String rsClientPath; - @Parameter(defaultValue = "${net.runelite.rs:vanilla:jar}", readonly = true, required = true) - private String vanillaPath; - - @Override - public void execute() throws MojoExecutionException, MojoFailureException - { - ClientVersion ver = new ClientVersion(new File(vanillaPath)); - int version; - try - { - version = ver.getVersion(); - } - catch (IOException ex) - { - throw new MojoExecutionException("Unable to read vanilla client version", ex); - } - - log.info("Vanilla client version " + version); - - ClassGroup rs; - ClassGroup vanilla; - - try - { - rs = JarUtil.loadJar(new File(rsClientPath)); - vanilla = JarUtil.loadJar(new File(vanillaPath)); - } - catch (IOException ex) - { - throw new MojoExecutionException("Unable to load dependency jars", ex); - } - - Injector injector = new Injector(rs, vanilla); - try - { - injector.inject(); - } - catch (InjectionException ex) - { - throw new MojoExecutionException("Error injecting client", ex); - } - - InjectorValidator iv = new InjectorValidator(vanilla); - iv.validate(); - - if (iv.getError() > 0) - { - throw new MojoExecutionException("Error building injected jar"); - } - - if (iv.getMissing() > 0) - { - throw new MojoExecutionException("Unable to inject all methods"); - } - - try - { - writeClasses(vanilla, outputDirectory); - } - catch (IOException ex) - { - throw new MojoExecutionException("Unable to write classes", ex); - } - - log.info("Injector wrote " + vanilla.getClasses().size() + " classes, " + iv.getOkay() + " injected methods"); - } - - private void writeClasses(ClassGroup group, File outputDirectory) throws IOException - { - for (ClassFile cf : group.getClasses()) - { - File classFile = getClassFile(outputDirectory, cf); - byte[] classData = JarUtil.writeClass(group, cf); - - try (FileOutputStream fout = new FileOutputStream(classFile, false)) - { - fout.write(classData); - } - } - } - - private File getClassFile(File base, ClassFile cf) - { - File f = base; - - String[] parts = cf.getName().split("/"); - for (int i = 0; i < parts.length - 1; ++i) - { - String part = parts[i]; - - f = new File(f, part); - } - - f.mkdirs(); - f = new File(f, parts[parts.length - 1] + ".class"); - - return f; - } - -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java b/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java deleted file mode 100644 index 58c225fa87..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectSetter.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.util.List; -import net.runelite.asm.ClassFile; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.CheckCast; -import net.runelite.asm.attributes.code.instructions.IMul; -import net.runelite.asm.attributes.code.instructions.LDC; -import net.runelite.asm.attributes.code.instructions.LMul; -import net.runelite.asm.attributes.code.instructions.PutField; -import net.runelite.asm.attributes.code.instructions.PutStatic; -import net.runelite.asm.attributes.code.instructions.VReturn; -import net.runelite.asm.signature.Signature; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class InjectSetter -{ - private static final Logger logger = LoggerFactory.getLogger(InjectSetter.class); - - private final Inject inject; - - private int injectedSetters; - - InjectSetter(Inject inject) - { - this.inject = inject; - } - - /** - * inject a setter into the vanilla classgroup - * - * @param targetClass Class where to inject the setter (field's class, - * or client) - * @param targetApiClass API targetClass implements, which may have the - * setter declared - * @param field Field of vanilla that will be set - * @param exportedName exported name of field - */ - void injectSetter(ClassFile targetClass, Class targetApiClass, Field field, String exportedName, Number setter) - { - java.lang.reflect.Method method = inject.findImportMethodOnApi(targetApiClass, exportedName, true); - if (method == null) - { - logger.warn("Setter injection for field {} but an API method was not found on {}", exportedName, targetApiClass); - return; - } - - if (method.getParameterCount() != 1) - { - logger.warn("Setter {} with not parameter count != 1?", exportedName); - return; - } - - logger.info("Injecting setter for {} on {}", exportedName, targetApiClass); - - assert targetClass.findMethod(method.getName()) == null; - assert field.isStatic() || field.getClassFile() == targetClass; - - Signature sig = new Signature.Builder() - .setReturnType(Type.VOID) - .addArgument(Inject.classToType(method.getParameterTypes()[0])) - .build(); - - Method setterMethod = new Method(targetClass, method.getName(), sig); - setterMethod.setAccessFlags(ACC_PUBLIC); - targetClass.addMethod(setterMethod); - ++injectedSetters; - - Code code = new Code(setterMethod); - setterMethod.setCode(code); - - Instructions instructions = code.getInstructions(); - List ins = instructions.getInstructions(); - - // load this - if (!field.isStatic()) - { - ins.add(new ALoad(instructions, 0)); - } - - // load argument - Type argumentType = sig.getTypeOfArg(0); - ins.add(inject.createLoadForTypeIndex(instructions, argumentType, 1)); - - // cast argument to field type - Type fieldType = field.getType(); - if (!argumentType.equals(fieldType)) - { - CheckCast checkCast = new CheckCast(instructions); - checkCast.setType(fieldType); - ins.add(checkCast); - } - - if (setter != null) - { - assert setter instanceof Integer || setter instanceof Long; - - if (setter instanceof Integer) - { - ins.add(new LDC(instructions, (int) setter)); - ins.add(new IMul(instructions)); - } - else - { - ins.add(new LDC(instructions, (long) setter)); - ins.add(new LMul(instructions)); - } - } - - if (field.isStatic()) - { - ins.add(new PutStatic(instructions, field)); - } - else - { - ins.add(new PutField(instructions, field)); - } - - ins.add(new VReturn(instructions)); - } - - int getInjectedSetters() - { - return injectedSetters; - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java b/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java deleted file mode 100644 index 2292b349ab..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java +++ /dev/null @@ -1,281 +0,0 @@ -package net.runelite.injector; - -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.signature.Signature; -import net.runelite.deob.DeobAnnotations; - -public class InjectUtil -{ - public static ClassFile toObClass(final ClassGroup vanilla, final ClassFile deobCf) throws InjectionException - { - final String obfuscatedName = DeobAnnotations.getObfuscatedName(deobCf.getAnnotations()); - final ClassFile obCf = vanilla.findClass(obfuscatedName); - - if (obCf == null) - { - throw new InjectionException(String.format("ClassFile \"%s\" could not be found.", obfuscatedName)); - } - - return obCf; - } - - public static Field toObField(final ClassGroup vanilla, final Field field) throws InjectionException - { - String obfuscatedClassName = DeobAnnotations.getObfuscatedName(field.getClassFile().getAnnotations()); - String obfuscatedFieldName = DeobAnnotations.getObfuscatedName(field.getAnnotations()); // obfuscated name of field - Type type = getFieldType(field); - - ClassFile obfuscatedClass = vanilla.findClass(obfuscatedClassName); - if (obfuscatedClass == null) - { - throw new InjectionException(String.format("ClassFile \"%s\" could not be found.", obfuscatedClassName)); - } - - Field obfuscatedField = obfuscatedClass.findFieldDeep(obfuscatedFieldName, type); - if (obfuscatedField == null) - { - throw new InjectionException(String.format("Field \"%s\" could not be found.", obfuscatedFieldName)); - } - - return obfuscatedField; - } - - public static ClassFile toDeobClass(final ClassFile obCf, final ClassGroup deob) throws InjectionException - { - final ClassFile wowThatWasQuick = deob.findObfuscatedName(obCf.getName()); - if (wowThatWasQuick == null) - { - throw new InjectionException("It wasn't obfscated enough, or a bit too much. Whatever it was it, wasn't in deob"); - } - return wowThatWasQuick; - } - - public static Type getFieldType(final Field f) - { - Type type = f.getType(); - - Annotation obfSignature = f.getAnnotations().find(DeobAnnotations.OBFUSCATED_SIGNATURE); - if (obfSignature != null) - { - //Annotation exists. Type was updated by us during deobfuscation - type = DeobAnnotations.getObfuscatedType(f); - } - - return type; - } - - /** - * Find a static method in ClassGroup group. Check the class with name hint first. - * (useful for static methods which are in the class they belong to) - */ - public static Method findStaticMethod(final ClassGroup group, final String name, final String hint) throws InjectionException - { - final ClassFile cf = group.findClass(hint); - - if (cf == null) - { - throw new InjectionException(String.format("ClassFile \"%s\" could not be found.", hint)); - } - - Method m = cf.findStaticMethod(name); - - if (m == null) - { - m = group.findStaticMethod(name); - } - - return m; - } - - /** - * Find a static method in ClassGroup group. Throws exception if not found. - */ - public static Method findStaticMethod(final ClassGroup group, final String name) throws InjectionException - { - Method m = group.findStaticMethod(name); - - if (m == null) - { - throw new InjectionException(String.format("Static method \"%s\" could not be found.", name)); - } - - return m; - } - - /** - * Find a static method in ClassGroup group. Throws exception if not found. - */ - public static Method findStaticMethod(final ClassGroup group, final String name, Signature sig) throws InjectionException - { - Method m = group.findStaticMethod(name, sig); - - if (m == null) - { - throw new InjectionException(String.format("Static method \"%s\" could not be found.", name)); - } - - return m; - } - - public static Method findMethod(Inject inject, String name) throws InjectionException - { - return findMethod(inject, name, null); - } - - public static Method findMethod(Inject inject, String name, String hint) throws InjectionException - { - if (hint != null) - { - ClassFile c = inject.getDeobfuscated().findClass(hint); - - if (c == null) - { - throw new InjectionException("Class " + hint + " doesn't exist. (check capitalization)"); - } - - Method deob = c.findMethod(name); - - if (deob != null) - { - String obfuscatedName = DeobAnnotations.getObfuscatedName(deob.getAnnotations()); - Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(deob); - - ClassFile ob = toObClass(inject.getVanilla(), c); - - return ob.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : deob.getDescriptor()); - } - } - - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Method m : c.getMethods()) - { - if (!m.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); - Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); - - ClassFile c2 = toObClass(inject.getVanilla(), c); - - return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); - } - } - - throw new InjectionException("Couldn't find method " + name); - } - - public static Method findStaticMethod(Inject inject, String name) throws InjectionException - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Method m : c.getMethods()) - { - if (!m.isStatic() || !m.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations()); - Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(m); - - ClassFile c2 = toObClass(inject.getVanilla(), c); - - return c2.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : m.getDescriptor()); - } - } - - throw new InjectionException("Couldn't find static method " + name); - } - - - public static Field findObField(Inject inject, String name) throws InjectionException - { - for (ClassFile c : inject.getVanilla().getClasses()) - { - for (Field f : c.getFields()) - { - if (!f.getName().equals(name)) - { - continue; - } - return f; - } - } - - throw new InjectionException(String.format("Field \"%s\" could not be found.", name)); - } - - public static Field findDeobField(Inject inject, String name) throws InjectionException - { - return findDeobField(inject, name, null); - } - - public static Field findDeobField(Inject inject, String name, String hint) throws InjectionException - { - 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)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); - - ClassFile c2 = toObClass(inject.getVanilla(), c); - return c2.findField(obfuscatedName); - } - } - - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Field f : c.getFields()) - { - if (!f.getName().equals(name)) - { - continue; - } - - String obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations()); - - ClassFile c2 = toObClass(inject.getVanilla(), c); - return c2.findField(obfuscatedName); - } - } - - throw new InjectionException(String.format("Mapped field \"%s\" could not be found.", name)); - } - - public static Field findDeobFieldButUseless(Inject inject, String name) throws InjectionException - { - for (ClassFile c : inject.getDeobfuscated().getClasses()) - { - for (Field f : c.getFields()) - { - if (!f.getName().equals(name)) - { - continue; - } - - return f; - } - } - - throw new InjectionException(String.format("Mapped field \"%s\" could not be found.", name)); - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectionException.java b/injector-plugin/src/main/java/net/runelite/injector/InjectionException.java deleted file mode 100644 index 7881ba739e..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectionException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -public class InjectionException extends Exception -{ - public InjectionException(String message) - { - super(message); - } - - public InjectionException(Throwable cause) - { - super(cause); - } - - public InjectionException(String message, Throwable cause) - { - super(message, cause); - } - -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/Injector.java b/injector-plugin/src/main/java/net/runelite/injector/Injector.java deleted file mode 100644 index 4543ed5b46..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/Injector.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.io.File; -import java.io.IOException; - -import com.google.common.io.Files; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.deob.util.JarUtil; - -public class Injector -{ - private final ClassGroup deobfuscated, vanilla; - - public Injector(ClassGroup deobfuscated, ClassGroup vanilla) - { - this.deobfuscated = deobfuscated; - this.vanilla = vanilla; - } - - public static void main(String[] args) throws IOException, InjectionException - { - if (args.length < 3) - { - System.exit(-1); - } - - ClassGroup deobfuscated = JarUtil.loadJar(new File(args[0])); - ClassGroup vanilla = JarUtil.loadJar(new File(args[1])); - - Injector u = new Injector( - deobfuscated, - vanilla - ); - u.inject(); - - InjectorValidator iv = new InjectorValidator(vanilla); - iv.validate(); - - u.save(new File(args[2])); - } - - public void inject() throws InjectionException - { - Inject instance = new Inject(deobfuscated, vanilla); - instance.run(); - } - - private void save(File out) throws IOException - { - out.mkdirs(); - for (ClassFile cf : vanilla.getClasses()) - { - File f = new File(out, cf.getClassName() + ".class"); - byte[] data = JarUtil.writeClass(vanilla, cf); - Files.write(data, f); - } - } - - -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java b/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java deleted file mode 100644 index a49df63a3a..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectorValidator.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import net.runelite.asm.ClassFile; -import net.runelite.asm.ClassGroup; -import net.runelite.asm.signature.Signature; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Verifies the injected jar is valid - * - * @author Adam - */ -class InjectorValidator -{ - private static final Logger logger = LoggerFactory.getLogger(InjectorValidator.class); - - private static final String API_PACKAGE_BASE = "net/runelite/rs/api/"; - - private final ClassGroup group; - - private int error, missing, okay; - - InjectorValidator(ClassGroup group) - { - this.group = group; - } - - void validate() - { - for (ClassFile cf : group.getClasses()) - { - validate(cf); - } - - logger.info("{} overridden methods, {} missing", okay, missing); - } - - private void validate(ClassFile cf) - { - // find methods of the interface not implemented in the class - for (net.runelite.asm.pool.Class clazz : cf.getInterfaces().getInterfaces()) - { - if (!clazz.getName().startsWith(API_PACKAGE_BASE)) - { - continue; - } - - Class c; - try - { - c = Class.forName(clazz.getName().replace('/', '.')); - } - catch (ClassNotFoundException ex) - { - logger.warn(null, ex); - continue; - } - - if (cf.isAbstract()) - { - // Abstract classes don't have to implement anything - continue; - } - - for (Method method : c.getMethods()) - { - if (method.isSynthetic() || method.isDefault()) - { - continue; - } - - // could check method signature here too but it is - // annoying to deal with both runelite api and java - // reflection api - if (cf.findMethodDeep(method.getName()) == null) - { - logger.warn("Class {} implements interface {} but not does implement method {}", - cf.getName(), c.getSimpleName(), method); - ++missing; - } - else - { - ++okay; - } - } - } - - Set signatures = new HashSet<>(); - - for (net.runelite.asm.Method method : cf.getMethods()) - { - NameAndSignature nas = new NameAndSignature(method.getName(), method.getDescriptor()); - - if (signatures.contains(nas)) - { - logger.error("Class {} has duplicate method with same name and signature {} {}", - cf.getName(), method.getName(), method.getDescriptor()); - ++error; - } - - signatures.add(nas); - } - } - - int getError() - { - return error; - } - - int getMissing() - { - return missing; - } - - int getOkay() - { - return okay; - } - - static final class NameAndSignature - { - String name; - Signature signature; - - NameAndSignature(String name, Signature signature) - { - this.name = name; - this.signature = signature; - } - - @Override - public int hashCode() - { - int hash = 3; - hash = 67 * hash + Objects.hashCode(this.name); - hash = 67 * hash + Objects.hashCode(this.signature); - return hash; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - final NameAndSignature other = (NameAndSignature) obj; - if (!Objects.equals(this.name, other.name)) - { - return false; - } - if (!Objects.equals(this.signature, other.signature)) - { - return false; - } - return true; - } - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java b/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java deleted file mode 100644 index bf4627c785..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/MixinInjector.java +++ /dev/null @@ -1,998 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.injector; - -import com.google.common.reflect.ClassPath; -import com.google.common.reflect.ClassPath.ClassInfo; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import net.runelite.api.mixins.Mixin; -import net.runelite.asm.ClassFile; -import net.runelite.asm.Field; -import net.runelite.asm.Method; -import net.runelite.asm.Type; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.annotation.Annotation; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instruction.types.FieldInstruction; -import net.runelite.asm.attributes.code.instruction.types.InvokeInstruction; -import net.runelite.asm.attributes.code.instruction.types.LVTInstruction; -import net.runelite.asm.attributes.code.instruction.types.PushConstantInstruction; -import net.runelite.asm.attributes.code.instruction.types.ReturnInstruction; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.ANewArray; -import net.runelite.asm.attributes.code.instructions.CheckCast; -import net.runelite.asm.attributes.code.instructions.GetField; -import net.runelite.asm.attributes.code.instructions.ILoad; -import net.runelite.asm.attributes.code.instructions.InvokeDynamic; -import net.runelite.asm.attributes.code.instructions.InvokeSpecial; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.attributes.code.instructions.Pop; -import net.runelite.asm.attributes.code.instructions.PutField; -import net.runelite.asm.signature.Signature; -import net.runelite.asm.visitors.ClassFileVisitor; -import net.runelite.deob.DeobAnnotations; -import static net.runelite.injector.InjectUtil.findStaticMethod; -import static net.runelite.injector.InjectUtil.toDeobClass; -import static net.runelite.injector.InjectUtil.toObClass; -import static net.runelite.injector.InjectUtil.toObField; -import org.objectweb.asm.ClassReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MixinInjector -{ - private static final Logger logger = LoggerFactory.getLogger(MixinInjector.class); - - private static final Type INJECT = new Type("Lnet/runelite/api/mixins/Inject;"); - private static final Type SHADOW = new Type("Lnet/runelite/api/mixins/Shadow;"); - private static final Type COPY = new Type("Lnet/runelite/api/mixins/Copy;"); - private static final Type REPLACE = new Type("Lnet/runelite/api/mixins/Replace;"); - private static final Type FIELDHOOK = new Type("Lnet/runelite/api/mixins/FieldHook;"); - private static final Type METHODHOOK = new Type("Lnet/runelite/api/mixins/MethodHook;"); - private static final Type JAVAX_INJECT = new Type("Ljavax/inject/Inject;"); - private static final Type NAMED = new Type("Ljavax/inject/Named;"); - - private static final String MIXIN_BASE = "net.runelite.mixins"; - private static final String ASSERTION_FIELD = "$assertionsDisabled"; - - private final Inject inject; - - // field name -> Field of injected fields - private final Map injectedFields = new HashMap<>(); - // Use net.runelite.asm.pool.Field instead of Field because the pool version has hashcode implemented - private final Map shadowFields = new HashMap<>(); - - MixinInjector(Inject inject) - { - this.inject = inject; - } - - public void inject() throws InjectionException - { - ClassPath classPath; - - try - { - classPath = ClassPath.from(this.getClass().getClassLoader()); - } - catch (IOException ex) - { - throw new InjectionException(ex); - } - - // key: mixin class - // value: mixin targets - Map, List> mixinClasses = new HashMap<>(); - - // Find mixins and populate mixinClasses - for (ClassInfo classInfo : classPath.getTopLevelClasses(MIXIN_BASE)) - { - Class mixinClass = classInfo.load(); - List mixinTargets = new ArrayList<>(); - - for (Mixin mixin : mixinClass.getAnnotationsByType(Mixin.class)) - { - Class implementInto = mixin.value(); - - ClassFile targetCf = inject.findVanillaForInterface(implementInto); - - if (targetCf == null) - { - throw new InjectionException("No class implements " + implementInto + " for mixin " + mixinClass); - } - - mixinTargets.add(targetCf); - } - - mixinClasses.put(mixinClass, mixinTargets); - } - - inject(mixinClasses); - } - - public void inject(Map, List> mixinClasses) throws InjectionException - { - injectFields(mixinClasses); - findShadowFields(mixinClasses); - - for (Class mixinClass : mixinClasses.keySet()) - { - try - { - for (ClassFile cf : mixinClasses.get(mixinClass)) - { - // Make a new mixin ClassFile copy every time, - // so they don't share Code references - ClassFile mixinCf = loadClass(mixinClass); - - injectMethods(mixinCf, cf, shadowFields); - } - } - catch (IOException ex) - { - throw new InjectionException(ex); - } - } - - injectFieldHooks(mixinClasses); - injectMethodHooks(mixinClasses); - } - - /** - * Finds fields that are marked @Inject and inject them into the target - */ - private void injectFields(Map, List> mixinClasses) throws InjectionException - { - // Inject fields, and put them in injectedFields if they can be used by other mixins - for (Class mixinClass : mixinClasses.keySet()) - { - ClassFile mixinCf; - - try - { - mixinCf = loadClass(mixinClass); - } - catch (IOException ex) - { - throw new InjectionException(ex); - } - - List targetCfs = mixinClasses.get(mixinClass); - - for (ClassFile cf : targetCfs) - { - for (Field field : mixinCf.getFields()) - { - // Always inject $assertionsEnabled if its missing. - if (ASSERTION_FIELD.equals(field.getName())) - { - if (cf.findField(ASSERTION_FIELD, Type.BOOLEAN) != null) - { - continue; - } - } - else - { - Annotation inject = field.getAnnotations().find(INJECT); - - if (inject == null) - { - continue; - } - } - - Field copy = new Field(cf, field.getName(), field.getType()); - copy.setAccessFlags(field.getAccessFlags()); - copy.setPublic(); - copy.setValue(field.getValue()); - - Annotation jInject = field.getAnnotations().find(JAVAX_INJECT); - if (jInject != null) - { - copy.getAnnotations().addAnnotation(jInject); - logger.info("Added javax inject to {}.{}", cf.getClassName(), copy.getName()); - - Annotation named = field.getAnnotations().find(NAMED); - if (named != null) - { - copy.getAnnotations().addAnnotation(named); - logger.info("Added javax named to {}.{}", cf.getClassName(), copy.getName()); - } - } - - cf.addField(copy); - - if (injectedFields.containsKey(field.getName()) && !field.getName().equals(ASSERTION_FIELD)) - { - java.util.logging.Logger.getAnonymousLogger().severe("Duplicate field : " + field.getName()); - throw new InjectionException("Injected field names must be globally unique"); - } - - injectedFields.put(field.getName(), copy); - } - } - - } - } - - /** - * Find fields which are marked @Shadow, and what they shadow - */ - private void findShadowFields(Map, List> mixinClasses) throws InjectionException - { - // Find shadow fields - // Injected static fields take precedence when looking up shadowed fields - for (Class mixinClass : mixinClasses.keySet()) - { - ClassFile mixinCf; - - try - { - mixinCf = loadClass(mixinClass); - } - catch (IOException ex) - { - throw new InjectionException(ex); - } - - for (Field field : mixinCf.getFields()) - { - Annotation shadow = field.getAnnotations().find(SHADOW); - if (shadow != null) - { - if (!field.isStatic()) - { - throw new InjectionException("Can only shadow static fields"); - } - - String shadowName = shadow.getElement().getString(); // shadow this field - - Field injectedField = injectedFields.get(shadowName); - if (injectedField != null) - { - // Shadow a field injected by a mixin - shadowFields.put(field.getPoolField(), injectedField); - } - else - { - // Shadow a field already in the gamepack - Field shadowField = InjectUtil.findDeobFieldButUseless(inject, shadowName); - - if (shadowField == null) - { - throw new InjectionException("Shadow of nonexistent field " + shadowName); - } - - Field obShadow = toObField(inject.getVanilla(), shadowField); - assert obShadow != null; - shadowFields.put(field.getPoolField(), obShadow); - } - } - } - } - } - - private ClassFile loadClass(Class clazz) throws IOException - { - try (InputStream is = clazz.getClassLoader().getResourceAsStream(clazz.getName().replace('.', '/') + ".class")) - { - ClassReader reader = new ClassReader(is); - ClassFileVisitor cv = new ClassFileVisitor(); - - reader.accept(cv, 0); - - return cv.getClassFile(); - } - } - - private void injectMethods(ClassFile mixinCf, ClassFile cf, Map shadowFields) - throws InjectionException - { - // Keeps mappings between methods annotated with @Copy -> the copied method within the vanilla pack - Map copiedMethods = new HashMap<>(); - - // Handle the copy mixins first, so all other mixins know of the copies - for (Method method : mixinCf.getMethods()) - { - Annotation copyAnnotation = method.getAnnotations().find(COPY); - - if (copyAnnotation == null) - { - continue; - } - - String deobMethodName = (String) copyAnnotation.getElement().getValue(); - Method deobMethod; - if (method.isStatic()) - { - deobMethod = findStaticMethod(inject.getDeobfuscated(), deobMethodName, method.getDescriptor().rsApiToRsClient()); - } - else - { - ClassFile deobCf = toDeobClass(cf, inject.getDeobfuscated()); - deobMethod = deobCf.findMethod(deobMethodName, method.getDescriptor().rsApiToRsClient()); - } - - - if (deobMethod == null) - { - throw new InjectionException("Failed to find the deob method " + deobMethodName + " for mixin " + mixinCf); - } - - if (method.isStatic() != deobMethod.isStatic()) - { - throw new InjectionException("Mixin method " + method + " should be " + (deobMethod.isStatic() ? "static" : "non-static")); - } - - // Find the vanilla class where the method to copy is in - String obClassName = DeobAnnotations.getObfuscatedName(deobMethod.getClassFile().getAnnotations()); - ClassFile obCf = inject.getVanilla().findClass(obClassName); - assert obCf != null : "unable to find vanilla class from obfuscated name " + obClassName; - - String obMethodName = DeobAnnotations.getObfuscatedName(deobMethod.getAnnotations()); - Signature obMethodSignature = DeobAnnotations.getObfuscatedSignature(deobMethod); - - if (obMethodName == null) - { - obMethodName = deobMethod.getName(); - } - if (obMethodSignature == null) - { - obMethodSignature = deobMethod.getDescriptor(); - } - - Method obMethod = obCf.findMethod(obMethodName, obMethodSignature); - if (obMethod == null) - { - throw new InjectionException("Failed to find the ob method " + obMethodName + " for mixin " + mixinCf); - } - - if (method.getDescriptor().size() > obMethod.getDescriptor().size()) - { - throw new InjectionException("Mixin methods cannot have more parameters than their corresponding ob method"); - } - - Method copy = new Method(cf, "copy$" + deobMethodName, obMethodSignature); - moveCode(copy, obMethod.getCode()); - copy.setAccessFlags(obMethod.getAccessFlags()); - copy.setPublic(); - copy.getExceptions().getExceptions().addAll(obMethod.getExceptions().getExceptions()); - copy.getAnnotations().getAnnotations().addAll(obMethod.getAnnotations().getAnnotations()); - cf.addMethod(copy); - - /* - If the desc for the mixin method and the desc for the ob method - are the same in length, assume that the mixin method is taking - care of the garbage parameter itself. - */ - boolean hasGarbageValue = method.getDescriptor().size() != obMethod.getDescriptor().size() - && deobMethod.getDescriptor().size() < obMethodSignature.size(); - copiedMethods.put(method.getPoolMethod(), new CopiedMethod(copy, hasGarbageValue)); - - logger.debug("Injected copy of {} to {}", obMethod, copy); - } - - // Handle the rest of the mixin types - for (Method method : mixinCf.getMethods()) - { - boolean isClinit = "".equals(method.getName()); - boolean isInit = "".equals(method.getName()); - boolean hasInject = method.getAnnotations().find(INJECT) != null; - - // You can't annotate clinit, so its always injected - if ((hasInject && isInit) || isClinit) - { - if (!"()V".equals(method.getDescriptor().toString())) - { - throw new InjectionException("Injected constructors cannot have arguments"); - } - - Method[] originalMethods = cf.getMethods().stream() - .filter(n -> n.getName().equals(method.getName())) - .toArray(Method[]::new); - // If there isn't a already just inject ours, otherwise rename it - // This is always true for - String name = method.getName(); - if (originalMethods.length > 0) - { - name = "rl$$" + (isInit ? "init" : "clinit"); - } - String numberlessName = name; - for (int i = 1; cf.findMethod(name, method.getDescriptor()) != null; i++) - { - name = numberlessName + i; - } - - Method copy = new Method(cf, name, method.getDescriptor()); - moveCode(copy, method.getCode()); - copy.setAccessFlags(method.getAccessFlags()); - copy.setPrivate(); - assert method.getExceptions().getExceptions().isEmpty(); - - // Remove the call to the superclass's ctor - if (isInit) - { - Instructions instructions = copy.getCode().getInstructions(); - ListIterator listIter = instructions.getInstructions().listIterator(); - for (; listIter.hasNext(); ) - { - Instruction instr = listIter.next(); - if (instr instanceof InvokeSpecial) - { - InvokeSpecial invoke = (InvokeSpecial) instr; - assert invoke.getMethod().getName().equals(""); - listIter.remove(); - int pops = invoke.getMethod().getType().getArguments().size() + 1; - for (int i = 0; i < pops; i++) - { - listIter.add(new Pop(instructions)); - } - break; - } - } - } - - setOwnersToTargetClass(mixinCf, cf, copy, shadowFields, copiedMethods); - cf.addMethod(copy); - - // Call our method at the return point of the matching method(s) - for (Method om : originalMethods) - { - Instructions instructions = om.getCode().getInstructions(); - ListIterator listIter = instructions.getInstructions().listIterator(); - for (; listIter.hasNext(); ) - { - Instruction instr = listIter.next(); - if (instr instanceof ReturnInstruction) - { - listIter.previous(); - if (isInit) - { - listIter.add(new ALoad(instructions, 0)); - listIter.add(new InvokeSpecial(instructions, copy.getPoolMethod())); - } - else if (isClinit) - { - listIter.add(new InvokeStatic(instructions, copy.getPoolMethod())); - } - listIter.next(); - } - } - } - - logger.debug("Injected mixin method {} to {}", copy, cf); - } - else if (hasInject) - { - // Make sure the method doesn't invoke copied methods - for (Instruction i : method.getCode().getInstructions().getInstructions()) - { - if (i instanceof InvokeInstruction) - { - InvokeInstruction ii = (InvokeInstruction) i; - - if (copiedMethods.containsKey(ii.getMethod())) - { - throw new InjectionException("Injected methods cannot invoke copied methods"); - } - } - } - - Method copy = new Method(cf, method.getName(), method.getDescriptor()); - moveCode(copy, method.getCode()); - copy.setAccessFlags(method.getAccessFlags()); - copy.setPublic(); - assert method.getExceptions().getExceptions().isEmpty(); - - setOwnersToTargetClass(mixinCf, cf, copy, shadowFields, copiedMethods); - - cf.addMethod(copy); - - logger.debug("Injected mixin method {} to {}", copy, cf); - } - else if (method.getAnnotations().find(REPLACE) != null) - { - Annotation replaceAnnotation = method.getAnnotations().find(REPLACE); - String deobMethodName = (String) replaceAnnotation.getElement().getValue(); - - ClassFile deobCf = inject.toDeobClass(cf); - Method deobMethod = findDeobMethod(deobCf, deobMethodName, method.getDescriptor()); - - if (deobMethod == null) - { - throw new InjectionException("Failed to find the deob method " + deobMethodName + " for mixin " + mixinCf); - } - - if (method.isStatic() != deobMethod.isStatic()) - { - throw new InjectionException("Mixin method " + method + " should be " - + (deobMethod.isStatic() ? "static" : "non-static")); - } - - String obMethodName = DeobAnnotations.getObfuscatedName(deobMethod.getAnnotations()); - Signature obMethodSignature = DeobAnnotations.getObfuscatedSignature(deobMethod); - - // Deob signature is the same as ob signature - if (obMethodName == null) - { - obMethodName = deobMethod.getName(); - } - if (obMethodSignature == null) - { - obMethodSignature = deobMethod.getDescriptor(); - } - - // Find the vanilla class where the method to copy is in - String obClassName = DeobAnnotations.getObfuscatedName(deobMethod.getClassFile().getAnnotations()); - ClassFile obCf = inject.getVanilla().findClass(obClassName); - - Method obMethod = obCf.findMethod(obMethodName, obMethodSignature); - assert obMethod != null : "obfuscated method " + obMethodName + obMethodSignature + " does not exist"; - - if (method.getDescriptor().size() > obMethod.getDescriptor().size()) - { - throw new InjectionException("Mixin methods cannot have more parameters than their corresponding ob method"); - } - - Type returnType = method.getDescriptor().getReturnValue(); - Type deobReturnType = inject.apiTypeToDeobfuscatedType(returnType); - if (!returnType.equals(deobReturnType)) - { - ClassFile deobReturnTypeClassFile = inject.getDeobfuscated() - .findClass(deobReturnType.getInternalName()); - if (deobReturnTypeClassFile != null) - { - ClassFile obReturnTypeClass = toObClass(inject.getVanilla(), deobReturnTypeClassFile); - - Instructions instructions = method.getCode().getInstructions(); - ListIterator listIter = instructions.getInstructions().listIterator(); - for (; listIter.hasNext(); ) - { - Instruction instr = listIter.next(); - if (instr instanceof ReturnInstruction) - { - listIter.previous(); - CheckCast checkCast = new CheckCast(instructions); - checkCast.setType(new Type(obReturnTypeClass.getName())); - listIter.add(checkCast); - listIter.next(); - } - } - } - } - - moveCode(obMethod, method.getCode()); - - boolean hasGarbageValue = method.getDescriptor().size() != obMethod.getDescriptor().size() - && deobMethod.getDescriptor().size() < obMethodSignature.size(); - - if (hasGarbageValue) - { - int garbageIndex = obMethod.isStatic() - ? obMethod.getDescriptor().size() - 1 - : obMethod.getDescriptor().size(); - - /* - If the mixin method doesn't have the garbage parameter, - the compiler will have produced code that uses the garbage - parameter's local variable index for other things, - so we'll have to add 1 to all loads/stores to indices - that are >= garbageIndex. - */ - shiftLocalIndices(obMethod.getCode().getInstructions(), garbageIndex); - } - - setOwnersToTargetClass(mixinCf, cf, obMethod, shadowFields, copiedMethods); - - logger.debug("Replaced method {} with mixin method {}", obMethod, method); - } - } - } - - private void moveCode(Method method, Code code) - { - Code newCode = new Code(method); - newCode.setMaxStack(code.getMaxStack()); - newCode.getInstructions().getInstructions().addAll(code.getInstructions().getInstructions()); - // Update instructions for each instruction - for (Instruction i : newCode.getInstructions().getInstructions()) - { - i.setInstructions(newCode.getInstructions()); - } - newCode.getExceptions().getExceptions().addAll(code.getExceptions().getExceptions()); - for (net.runelite.asm.attributes.code.Exception e : newCode.getExceptions().getExceptions()) - { - e.setExceptions(newCode.getExceptions()); - } - method.setCode(newCode); - } - - private void setOwnersToTargetClass(ClassFile mixinCf, ClassFile cf, Method method, - Map shadowFields, - Map copiedMethods) - throws InjectionException - { - ListIterator iterator = method.getCode().getInstructions().getInstructions().listIterator(); - - while (iterator.hasNext()) - { - Instruction i = iterator.next(); - - if (i instanceof ANewArray) - { - Type type = ((ANewArray) i).getType_(); - ClassFile deobCf = inject.getDeobfuscated().findClass(type.toString().replace("Lnet/runelite/rs/api/RS", "").replace(";", "")); - - if (deobCf != null) - { - ClassFile obReturnTypeClass = toObClass(inject.getVanilla(), deobCf); - Type newType = new Type("L" + obReturnTypeClass.getName() + ";"); - - ((ANewArray) i).setType(newType); - logger.info("Replaced {} type {} with type {}", i, type, newType); - } - } - - if (i instanceof InvokeInstruction) - { - InvokeInstruction ii = (InvokeInstruction) i; - - CopiedMethod copiedMethod = copiedMethods.get(ii.getMethod()); - if (copiedMethod != null) - { - ii.setMethod(copiedMethod.obMethod.getPoolMethod()); - - // Pass through garbage value if the method has one - if (copiedMethod.hasGarbageValue) - { - int garbageIndex = copiedMethod.obMethod.isStatic() - ? copiedMethod.obMethod.getDescriptor().size() - 1 - : copiedMethod.obMethod.getDescriptor().size(); - - iterator.previous(); - iterator.add(new ILoad(method.getCode().getInstructions(), garbageIndex)); - iterator.next(); - } - } - else if (ii.getMethod().getClazz().getName().equals(mixinCf.getName())) - { - ii.setMethod(new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(cf.getName()), - ii.getMethod().getName(), - ii.getMethod().getType() - )); - } - } - else if (i instanceof FieldInstruction) - { - FieldInstruction fi = (FieldInstruction) i; - - Field shadowed = shadowFields.get(fi.getField()); - if (shadowed != null) - { - fi.setField(shadowed.getPoolField()); - } - else if (fi.getField().getClazz().getName().equals(mixinCf.getName())) - { - fi.setField(new net.runelite.asm.pool.Field( - new net.runelite.asm.pool.Class(cf.getName()), - fi.getField().getName(), - fi.getField().getType() - )); - } - } - else if (i instanceof PushConstantInstruction) - { - PushConstantInstruction pi = (PushConstantInstruction) i; - if (mixinCf.getPoolClass().equals(pi.getConstant())) - { - pi.setConstant(cf.getPoolClass()); - } - } - - verify(mixinCf, i); - } - } - - private void shiftLocalIndices(Instructions instructions, int startIdx) - { - for (Instruction i : instructions.getInstructions()) - { - if (i instanceof LVTInstruction) - { - LVTInstruction lvti = (LVTInstruction) i; - - if (lvti.getVariableIndex() >= startIdx) - { - lvti.setVariableIndex(lvti.getVariableIndex() + 1); - } - } - } - } - - private Method findDeobMethod(ClassFile deobCf, String deobMethodName, Signature descriptor) - throws InjectionException - { - List matchingMethods = new ArrayList<>(); - - for (Method m : deobCf.getMethods()) - { - if (!deobMethodName.equals(m.getName())) - { - continue; - } - - Type returnType = inject.apiTypeToDeobfuscatedType(descriptor.getReturnValue()); - Type returnType2 = m.getDescriptor().getReturnValue(); - - if (!returnType.equals(returnType2)) - { - continue; - } - - List args = descriptor.getArguments(); - List args2 = m.getDescriptor().getArguments(); - - if (args.size() > args2.size()) - { - continue; - } - - boolean matchingArgs = true; - - for (int i = 0; i < args.size(); i++) - { - Type type = inject.apiTypeToDeobfuscatedType(args.get(i)); - Type type2 = args2.get(i); - - if (!type.equals(type2)) - { - matchingArgs = false; - break; - } - } - - if (!matchingArgs) - { - continue; - } - - matchingMethods.add(m); - } - - if (matchingMethods.size() > 1) - { - // this happens when it has found several deob methods for some mixin method, - // to get rid of the error, refine your search by making your mixin method have more parameters - throw new InjectionException("There are several matching methods when there should only be one"); - } - else if (matchingMethods.size() == 1) - { - return matchingMethods.get(0); - } - - Method method = deobCf.findMethod(deobMethodName); - - if (method == null) - { - // Look for static methods if an instance method couldn't be found - for (ClassFile deobCf2 : inject.getDeobfuscated().getClasses()) - { - if (deobCf2 != deobCf) - { - method = deobCf2.findMethod(deobMethodName); - - if (method != null) - { - break; - } - } - } - } - - return method; - } - - private void verify(ClassFile mixinCf, Instruction i) throws InjectionException - { - if (i instanceof FieldInstruction) - { - FieldInstruction fi = (FieldInstruction) i; - - if (fi.getField().getClazz().getName().equals(mixinCf.getName())) - { - if (i instanceof PutField || i instanceof GetField) - { - throw new InjectionException("Access to non static member field of mixin"); - } - - Field field = fi.getMyField(); - if (field != null && !field.isPublic()) - { - throw new InjectionException("Static access to non public field " + field); - } - } - } - else if (i instanceof InvokeStatic) - { - InvokeStatic is = (InvokeStatic) i; - - if (is.getMethod().getClazz() != mixinCf.getPoolClass() - && is.getMethod().getClazz().getName().startsWith(MIXIN_BASE.replace(".", "/"))) - { - throw new InjectionException("Invoking static methods of other mixins is not supported"); - } - } - else if (i instanceof InvokeDynamic) - { - // RS classes don't verify under java 7+ due to the - // super() invokespecial being inside of a try{} - throw new InjectionException("Injected bytecode must be Java 6 compatible"); - } - } - - private void injectFieldHooks(Map, List> mixinClasses) throws InjectionException - { - InjectHook injectHook = new InjectHook(inject); - - for (Class mixinClass : mixinClasses.keySet()) - { - ClassFile mixinCf; - - try - { - mixinCf = loadClass(mixinClass); - } - catch (IOException ex) - { - throw new InjectionException(ex); - } - - List targetCfs = mixinClasses.get(mixinClass); - - for (ClassFile cf : targetCfs) - { - for (Method method : mixinCf.getMethods()) - { - Annotation fieldHook = method.getAnnotations().find(FIELDHOOK); - if (fieldHook != null) - { - String hookName = fieldHook.getElement().getString(); - boolean before = fieldHook.getElements().size() == 2 && fieldHook.getElements().get(1).getValue().equals(true); - ClassFile deobCf = inject.toDeobClass(cf); - Field targetField = deobCf.findField(hookName); - if (targetField == null) - { - // first try non static fields, then static - targetField = InjectUtil.findDeobFieldButUseless(inject, hookName); - } - - if (targetField == null) - { - throw new InjectionException("Field hook for nonexistent field " + hookName + " on " + method); - } - - Annotation an = targetField.getAnnotations().find(DeobAnnotations.OBFUSCATED_GETTER); - Number getter = null; - if (an != null) - { - getter = (Number) an.getElement().getValue(); - } - - Field obField = toObField(inject.getVanilla(), targetField); - - if (method.isStatic() != targetField.isStatic()) - { - throw new InjectionException("Field hook method static flag must match target field"); - } - - // cf is the target class to invoke - InjectHook.HookInfo hookInfo = new InjectHook.HookInfo(); - hookInfo.clazz = cf.getName(); - hookInfo.fieldName = hookName; - hookInfo.method = method; - hookInfo.before = before; - hookInfo.getter = getter; - injectHook.hook(obField, hookInfo); - } - } - } - } - - injectHook.run(); - - logger.info("Injected {} field hooks", injectHook.getInjectedHooks()); - } - - private void injectMethodHooks(Map, List> mixinClasses) throws InjectionException - { - InjectHookMethod injectHookMethod = new InjectHookMethod(inject); - - for (Class mixinClass : mixinClasses.keySet()) - { - ClassFile mixinCf; - - try - { - mixinCf = loadClass(mixinClass); - } - catch (IOException ex) - { - throw new InjectionException(ex); - } - - List targetCfs = mixinClasses.get(mixinClass); - - for (ClassFile cf : targetCfs) - { - for (Method method : mixinCf.getMethods()) - { - Annotation methodHook = method.getAnnotations().find(METHODHOOK); - - if (methodHook == null) - { - continue; - } - - String hookName = methodHook.getElement().getString(); - boolean end = methodHook.getElements().size() == 2 && methodHook.getElements().get(1).getValue().equals(true); - ClassFile deobCf = inject.toDeobClass(cf); - Method targetMethod = findDeobMethod(deobCf, hookName, method.getDescriptor()); - - if (targetMethod == null) - { - throw new InjectionException("Method hook for nonexistent method " + hookName + " on " + method); - } - - if (method.isStatic() != targetMethod.isStatic()) - { - throw new InjectionException("Method hook static flag must match target - " + hookName); - } - - injectHookMethod.inject(method, targetMethod, hookName, end, false); - } - } - } - } - - private static class CopiedMethod - { - private Method obMethod; - private boolean hasGarbageValue; - - private CopiedMethod(Method obMethod, boolean hasGarbageValue) - { - this.obMethod = obMethod; - this.hasGarbageValue = hasGarbageValue; - } - } -} diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java b/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java deleted file mode 100644 index f4de5d056e..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/ClearColorBuffer.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.runelite.injector.raw; - -import java.util.ListIterator; -import net.runelite.asm.ClassFile; -import net.runelite.asm.Method; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.ILoad; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.attributes.code.instructions.LDC; -import net.runelite.asm.pool.Class; -import net.runelite.asm.signature.Signature; -import net.runelite.injector.Inject; -import net.runelite.injector.InjectUtil; -import net.runelite.injector.InjectionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ClearColorBuffer -{ - private static final Logger log = LoggerFactory.getLogger(ClearColorBuffer.class); - private static final net.runelite.asm.pool.Method clearBuffer = new net.runelite.asm.pool.Method( - new Class("net.runelite.client.callback.Hooks"), - "clearColorBuffer", - new Signature("(IIIII)V") - ); - private final Inject inject; - - public ClearColorBuffer(Inject inject) - { - this.inject = inject; - } - - public void inject() throws InjectionException - { - injectColorBufferHooks(); - } - - private void injectColorBufferHooks() throws InjectionException - { - net.runelite.asm.pool.Method fillRectangle = InjectUtil.findStaticMethod(inject, "Rasterizer2D_fillRectangle").getPoolMethod(); - - int count = 0; - int replaced = 0; - - for (ClassFile cf : inject.getVanilla().getClasses()) - { - for (Method m : cf.getMethods()) - { - if (!m.isStatic()) - { - continue; - } - - Code c = m.getCode(); - if (c == null) - { - continue; - } - - Instructions ins = c.getInstructions(); - ListIterator it = ins.getInstructions().listIterator(); - - for (; it.hasNext(); ) - { - Instruction i = it.next(); - if (!(i instanceof InvokeStatic)) - { - continue; - } - - if (!((InvokeStatic) i).getMethod().equals(fillRectangle)) - { - continue; - } - - int indexToReturnTo = it.nextIndex(); - count++; - it.previous(); - Instruction current = it.previous(); - if (current instanceof LDC && ((LDC) current).getConstantAsInt() == 0) - { - int varIdx = 0; - for (; ; ) - { - current = it.previous(); - if (current instanceof ILoad && ((ILoad) current).getVariableIndex() == 3 - varIdx) - { - varIdx++; - log.debug(varIdx + " we can count yay"); - continue; - } - - break; - } - - if (varIdx == 4) - { - for (; !(current instanceof InvokeStatic); ) - { - current = it.next(); - } - assert it.nextIndex() == indexToReturnTo; - - it.set(new InvokeStatic(ins, clearBuffer)); - replaced++; - log.debug("Found drawRectangle at {}. Found: {}, replaced {}", m.getName(), count, replaced); - } - else - { - log.debug("Welp, guess this wasn't it chief " + m); - } - } - - while (it.nextIndex() != indexToReturnTo) - { - it.next(); - } - } - } - } - } -} \ No newline at end of file diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java b/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java deleted file mode 100644 index 5b6f6fbd50..0000000000 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/DrawAfterWidgets.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (c) 2018, Lotto - * 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.injector.raw; - -import java.util.HashSet; -import java.util.ListIterator; -import java.util.Set; -import net.runelite.asm.ClassFile; -import net.runelite.asm.Method; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.Label; -import net.runelite.asm.attributes.code.instruction.types.JumpingInstruction; -import net.runelite.asm.attributes.code.instruction.types.PushConstantInstruction; -import net.runelite.asm.attributes.code.instructions.GetStatic; -import net.runelite.asm.attributes.code.instructions.IMul; -import net.runelite.asm.attributes.code.instructions.InvokeStatic; -import net.runelite.asm.signature.Signature; -import net.runelite.injector.Inject; -import static net.runelite.injector.InjectHookMethod.HOOKS; -import static net.runelite.injector.InjectUtil.findStaticMethod; -import net.runelite.injector.InjectionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DrawAfterWidgets -{ - private static final Logger logger = LoggerFactory.getLogger(DrawAfterWidgets.class); - - private final Inject inject; - - public DrawAfterWidgets(Inject inject) - { - this.inject = inject; - } - - public void inject() throws InjectionException - { - injectDrawAfterWidgets(); - } - - private void injectDrawAfterWidgets() throws InjectionException - { - /* - This call has to be injected using raw injection because the - drawWidgets method gets inlined in some revisions. If it wouldn't be, - mixins would be used to add the call to the end of drawWidgets. - - --> This hook depends on the positions of "if (535573958 * kl != -1)" and "jz.db();". - - - Revision 180 - client.gs(): - ______________________________________________________ - - @Export("drawLoggedIn") - final void drawLoggedIn() { - if(rootInterface != -1) { - ClientPreferences.method1809(rootInterface); - } - - int var1; - for(var1 = 0; var1 < rootWidgetCount; ++var1) { - if(__client_od[var1]) { - __client_ot[var1] = true; - } - - __client_oq[var1] = __client_od[var1]; - __client_od[var1] = false; - } - - __client_oo = cycle; - __client_lq = -1; - __client_ln = -1; - UserComparator6.__fg_jh = null; - if(rootInterface != -1) { - rootWidgetCount = 0; - Interpreter.method1977(rootInterface, 0, 0, SoundCache.canvasWidth, Huffman.canvasHeight, 0, 0, -1); - } - - < -- here appearantly - - Rasterizer2D.Rasterizer2D_resetClip(); - ______________________________________________________ - */ - - boolean injected = false; - - Method noClip = findStaticMethod(inject, "Rasterizer2D_resetClip"); // !!!!! - - if (noClip == null) - { - throw new InjectionException("Mapped method \"Rasterizer2D_resetClip\" could not be found."); - } - - net.runelite.asm.pool.Method poolNoClip = noClip.getPoolMethod(); - - for (ClassFile c : inject.getVanilla().getClasses()) - { - for (Method m : c.getMethods()) - { - if (m.getCode() == null) - { - continue; - } - - Instructions instructions = m.getCode().getInstructions(); - - Set